汇编语言的基本语法.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

汇编语言的基本语法1.1.汇编语言源程序的格式DATASEGMENTAT2000HARRAYDBa1,a2,a3,…a10(a1~a10为立即数)COUNTEQU$-ARRAYSUMDW?DATAENDSSTACKSEGMENTPARASTACK‘STACK’STAKDB10DUP(?)TOPEQULENGTHSTAKSTACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,0MOVDI,OFFSETSUMMOVBX,OFFSETARRAYMOVCX,COUNTLOP:ADDAL,[BX]ADCAH,0INCBXLOOPLOPMOV[DI],AXMOVAH,4CHINT21HCODEENDSENDSTART汇编语言源程序格式的特点是:1.分段结构2.语句行汇编语言程序的语句有两类:(1)指令性语句(2)指示性语句汇编语言源程序语句的格式汇编语言源程序中的每个语句可以由四项组成,格式如下:[名字]操作操作数[;注释]其中:名字项是指一个标号或变量。操作项是一个操作码的助记符,它可以是指令、伪指令或宏指令名。操作数项由一个或多个表达式组成,它提供为执行所要求的操作而需要的信息。操作数项可以是常数、寄存器、标号、变量或由表达式组成。注释项用来说明程序或语句的功能。;为识别注释项的开始。;也可以从一行的第一个字符开始,此时整行都是注释,常用来说明下面一段程序的功能。上面四项中带方括号的两项是可选项。各项之间必须用空格(space)或水平制表(Tab)符隔开。(1)名字项(2)操作项(3)操作数项(4)注释项(1)名字项源程序中用下列字符来表示名字:字母A~Z数字0~9专用字符?、·、@、-、$除数字外,所有字符都可以放在源语句的第一个位置。名字中如果用到·则必须是第一个字符。可以用很多字符来说明名字,但只有前面的31个字符能被汇编程序所识别。一般说来,名字项可以是标号或变量。它们都用来表示本语句的符号地址,都是可有可无的,只有当需要用符号地址来访问该语句时它才需要出现。·标号:标号在代码段中定义,后面跟着冒号:,此外,它还可以作为过程名定义。·变量:变量在数据段或附加数据段中定义,后面不跟冒号。变量经常在操作数字段出现。(2)操作项操作项可以是指令、伪指令或宏指令的助记符。对于指令,汇编程序将其翻译为机器语言指令。对于伪指令,汇编程序将根据其所要求的功能进行处理。对于宏指令,则将根据其定义展开。(3)操作数项操作数项由一个或多个表达式组成,多个操作数项之间一般用逗号分开。对于指令,操作数项一般给出操作数地址,它们可能有一个,或二个,或三个,或一个也没有。对于伪操作或宏指令,则给出它们所要求的参数。操作数项可以是常数、寄存器、标号、变量或由表达式组成。(4)注释项注释项用来说明一段程序、一条或几条指令的功能。对于汇编语言程序来说,注释项的作用是很明显的,它可以使程序容易被读懂,因此汇编语言程序必须写好注释。注释应该写出本条(或本段)指令在程序中的功能和作用,而不应该只写指令的动作。读者在有机会阅读程序例子时,应注意学习注释的写法,在编制程序时,更应学会写好注释。指令性语句格式为:[标号]:操作码[操作数][;注释]带方括号的为任选项,标号是指令的符号地址,操作码和操作数是用汇编语言指令表示的指令部分,注释是对该语句在本程序中的功能的说明。指示性语句格式为:[名字/变量]命令[参数][;注释]命令指示汇编程序进行某种汇编操作,参数是有关的数据,名字是段名、符号名等标识符,变量用变量名表示。常量、标识符和表达式一、常量其值在程序中不能改变的量,在汇编语言源程序中的常量有:数字常量、字符常量和符号常量(1)数字常量可以是二进制数、八进制数、十进制数或十六进制数表示(2)字符常量是用单引号‘’括起来的ASCII字符,其值是该字符的ASCII代码值(3)符号常量是用标识符定义的常量。例如,采用符号定义语句PORTAEQU80H,则指令MOVAL,PORTA与指令MOVAL,80H等价。二、标识符在编程时建立的有特定意义的字符序列,标识符可用作符号常量、名字、变量和标号等。组成标识符有如下规定:(1)组成标识符的字符有:英文大写字母:A~Z;英文小写字母:a-z;数字0~9;字符?、@、_、$;(2)字符长度不超过3l个;(3)首字符不能是数字;(4)?不能单独作为一个标识符;(5)不能把保留字用作标识符,保留字包括助记符、寄存器名等。三、表达式表达式是常数、标号、变量与一些操作符相组合的序列,可以有数字表达式和地址表达式两种。在汇编期间,汇编程序按照一定的优先规则对表达式进行计算后可得到一个数值或一个地址。常用的表达式操作符介绍如下:(1)算术操作符算术操作符有+、-、*、/和MOD。MOD是指除法运算后得到的余数,如19/7的商是2,而19MOD7则为5(余数)。算术操作符可以用于数字表达式或地址表达式中,但当它用于地址表达式时,只有当其结果有明确的物理意义时才是有效的结果。例如两个地址相乘或相除是无意义的。在地址表达式中,可以使用+或-,但也必须注意其物理意义。例如把两个不同段的地址相加也是无意义的。经常使用的是地址±数字量,它是有意义的。例如SUM+1是指SUM字节单元的下一个字节单元的地址(注意:不是指SUM单元的内容加1),而SUM-1则是指SUM字节单元的前一个字节单元的地址。例:如果要求把首地址为BLOCK的字数组的第6个字传送到DX寄存器,可用指令如下:MOVDX,BLOCK+(6-1)*2例:如数组ARRAY定义如下,写出把数组长度(字数)存入CX寄存器的指令。ARRAYDW1,2,3,4,5,6,7ARYENDDW?其中ARYEND是为计算数组长度而建立的符号地址,所需指令如下:MOVCX,(ARYEND-ARRAY)/2汇编程序在汇编期间将计算出表达式的值而形成指令:MOVCX,7(2)逻辑操作符逻辑操作符有:AND(与)、OR(或)、XOR(异或)、NOT(非)。逻辑操作符都是按位操作的,只能用于数字表达式中。逻辑操作符要求汇编程序对其前后两个操作数(或表达式)作指定的逻辑操作。例:OUTPORT_VALAND0FEH,AL上例中PORT_VAL为端口号,OUT指令中的表达式说明只为偶数号端口输出数据。(3)关系操作符关系操作符有:EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)。关系操作符的两个操作数必须都是数字或是同一段内的两个存储器地址。计算的结果应为逻辑值:结果为真,表示为0FFFFH;结果为假,则表示为0。例如:MOVBX,((PORT_VALLT5)AND20)OR((PORT_VALGE5)AND30)则当PORT_VAL5时,汇编结果应该是:MOVBX,20否则,汇编结果应该是:MOVBX,30(4)数值回送操作符数值回送操作符有:TYPE、LENGTH、SIZE、OFFSET、SEG等。数值回送操作符把一些特征或存储器地址的一部分作为数值回送。·TYPE格式为:TYPE表达式如果表达式是变量,则汇编程序将回送该变量的以字节数表示的类型:DB为1,DW为2,DD为4,DF为6,DQ为8,DT为10。如果表达式是标号,则汇编程序将回送代表该标号类型的数值:NEAR为-1,FAR为-2。如果表达式为常数,则应回送0。举例:ARRAYDW1,2,3则对于指令ADDSI,TYPEARRAY汇编程序将其形成为:ADDSI,2·LENGTH格式为:LENGTH变量对于变量中使用DUP的情况,汇编程序将回送分配给该变量的单元数,而对于其他情况则送1。举例1:FEESDW100DUP(0)对于指令MOVCX,LENGTHFEES汇编程序将使其形成为:MOVCX,100举例2:ARRAYDW1,2,3对于指令MOVCX,LENGTHARRAY汇编程序将使其形成为:MOVCX,1举例3:TABLEDB‘ABCD’对于指令MOVCX,LENGTHTABLE汇编程序将使其形成为:MOVCX,1·SIZE格式为:SIZE变量汇编程序应回送分配给该变量的字节数。但是,此值是LENGTH值和TYPE值的乘积。例如:MOVCX,SIZEFEES将形成为MOVCX,200又例如:MOVCX,SIZEARRAY将形成为MOVCX,2又例如:MOVCX,SIZETABLE将形成为MOVCX,1。·OFFSET格式为:OFFSET变量或标号汇编程序将回送变量或标号的偏移地址值。举例:MOVBX,OFFSETOPER_ONE汇编程序将OPER_ONE的偏移地址作为立即数回送给指令,而在执行时则将该偏移地址装入BX寄存器中。所以这条指令的功能与指令LEABX,OPER_ONE是等价的。·SEG格式为:SEG变量或标号汇编程序将回送变量或标号的段地址值。举例:如果DATA_SEG是从存储器的05000H地址开始的一个数据段的段名,OPER1是该段中的一个变量名,则MOVBX,SEGOPER1将把0500H作为立即数插入指令。实际上,由于段地址是由连接程序分配的,所以该立即数是连接时插入的。执行期间则使BX寄存器的内容成为0500H。·PTR格式为:类型PTR符号地址PTR用来给已分配的存储地址(用符号地址表示)赋予另一种属性,使该地址具有另一种类型。类型可有BYTE、WORD、DWORD、FWORD、QWORD、TBYTE、NEAR和FAR等几种,所以PTR也可以用来建立字、双字、四字或段内及段间的指令单元等。举例:已有数据定义如下:TWO_BYTEDW?可以用以下语句对这两个字节赋予另一种类型定义:ONE_BYTEEQUBYTEPTRTWO_BYTE这里ONE_BYTE和TWO_BYTE两个符号地址具有相同的段地址和偏移地址,但是它们的类型属性不同,前者为1,后者为2。此外,有时指令要求使用PTR操作符。例如用MOV[BX],5指令把立即数存入BX寄存器内容指定的存储单元中,但汇编程序不能分清是存入字单元还是字节单元,此时必须用PTR操作符来说明属性,应该写明:MOVBYTEPTR[BX],5或MOVWORDPTR[BX],5·段操作符段操作符用来表示一个标量、变量或地址表达式的段属性。格式为:段寄存器∶地址表达式段名∶地址表达式例如,用段前缀指定某段的地址操作数MOVAX,ES:[BX+SI]·SHORT用来修饰JMP指令中转向地址的属性,指出转向地址是在下一条指令地址的±127个字节范围之内。例如:JMPSHORTTAG;转移属性为短转移...TAG:MOV...·THIS格式为:THIS属性或类型THIS可以象PTR一样建立一个指定类型(BYTE、WORD、DWORD)或指定距离(NEAR或FAR)的地址操作数。该操作数的段地址和偏移地址与下一个存储单元地址相同。例如:FIRST_TYPEEQUTHISBYTEWORD_TABLEDW100DUP(?)此时FIRST_TYPE的偏移地址和WORD_TABLE完全相同,但它是字节类型的;而WORD_TABLE则是字类型的。又如:STARTEQUTHISFARMOVCX,100这样,MOV指令有一个FAR属性的符号地址START,这就允许其他段的JMP指令直接跳转到START来。·HIGH和LOW称为字节分离操作符,它接收一个数或地址表达式,HIGH取其高位字节,LOW取其低位字节。例如:CONSTEQU0ABCDH则MOVAH,HIGHCONST将汇编成MOVAH,0ABH指令MOVAH,LOWCONST将汇编成MOVAH,0CDH·操作符的优先级我们知道表达式是常数、寄存器、标号、变量和操作符的组合,在计算表达式时,应该首先计算优先级高的操作符,然后从左到右地对优先级相同的操作符进行计算。括号也可以改变计算次序,括号内的表达式应优先计算。表达式中的运算符高优先级低1括号中的项,即(…)和[…]2LENGTH,SIZE,WIDTH,

1 / 84
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功