您好,欢迎访问三七文档
第7章汇编语言的基本语法AssembleLanguage一种面向机器的程序设计语言,是一种用符号表示的低级程序设计语言(机器语言的符号化描述),通常是为特定计算机或计算机系列专门设计的。AssembleLanguage用汇编语言编写的程序不能由机器直接执行,而必须经汇编程序翻译成机器语言程序。汇编语言指令与翻译成的机器语言指令之间基本是一一对应的关系。汇编过程示意:采用汇编语言进行程序设计的优点:可充分利用机器的硬件功能和结构特点,加快程序的执行速度,减少目标程序所占用的存储空间。常用来编写实时控制程序、实时通信程序,有时也用来编制某些系统软件程序。缺点:1.编程效率低(与人们描述计算过程的需要差距大);2.与机器硬件的具体结构联系过于紧密——在一种结构的机器上开发的程序极难移植到另一种不同结构的机器上去。示例程序DATASEGMENT;数据段NUMDW0011101000000111BNOTESDB‘Theresultis:’,’$’DATAENDSCODESEGMENT;代码段ASSUMECS:CODE,DS:DATABEGIN:MOVAX,DATAMOVDS,AXMOVDX,OFFSETNOTES;显示提示信息MOVAH,9HINT21HMOVBX,NUM;将数装入BXMOVCH,4;CH作循环计数器示例程序(续)ROTATE:DISPLAY:MOVCL,4;CL中放移位位数MOVDL,AL;显示16进制数ROLBX,CLMOVAH,2MOVAL,BLINT21HANDAL,0FH;AL中为一位16进制数DECCHADDAL,30H;转换为ASCII码值JNZROTATECMPAL,’9’;是0~9的数码?MOVAX,4C00H;返回DOSJLEDISPLAYINT21HADDAL,07H;在A~F之间CODEENDS;代码段结束ENDBEGIN;模块结束堆栈段定义格式STACKSEGMENTSTACKSTADB50DUP(?)TOPEQULENGTHSTASTACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVSP,TOP:CODEENDSENDSTART7.1.2汇编语言源程序的组成1.伪指令语句和指令语句汇编语言源程序中除了包含真正的指令外,还应包含说明性的“指令”。这些说明性的“指令”是面向汇编程序和连接程序的,称为伪指令。宏汇编程序5.0版(MASMV5.0)规定,汇编语言源程序的每行只能写一个语句:指令语句或伪指令语句。行长不能超过128个字符。每个语句最多可由四个字段组成:名字字段、操作字段、操作数字段和注释字段。伪指令语句是说明性语句,其格式为:[名字]伪指令说明符[参数表达式1[,参数表达式2[,……]]][;注释]其中,伪指令说明符(伪指令名)是伪指令语句中不可缺少的主体,其余部分(方括号中的内容)有时可省略。名字可为段名、过程名、变量名、符号名(或常量名)、宏名、结构名、记录名等。例:ADB20H,30H;注释指令语句是可执行语句,其格式为:[名字:]指令操作助记符[操作数表达式1[,操作数表达式2]][;注释]其中,指令操作助记符(指令名)是指令语句中不可缺少的主体,其余部分(方括号中的内容)有时可省略。名字只能是标号。注释以分号开头,分号右边的内容将被汇编程序忽略。例L:ADDAX,BX;注释汇编程序负责计算伪指令语句中表达式的值,解释伪指令语句的含义并遵照“执行”,但并不产生机器代码。汇编程序负责计算指令语句中表达式的值,并将汇编指令翻译成机器指令代码。指令语句经汇编后,在可执行程序运行期间由CPU解释,并由CPU按指令的要求完成各种运算与操作。7.1.4汇编语言的表达式1.汇编语言的标识符2.汇编语言的操作对象(数据类型)(1)常数、常量编程时已经确定其值,程序运行期间不会改变其值的数据对象称为常数。8086/8088CPU允许定义四种形式的常数:整数、字符串、“组合BCD码数”和实数(浮点数),但只能处理整数、字符串、“组合BCD码数”,不能处理实数(浮点数)。常数表达式的名字称为常量。(程序员给出的一个名或助记名作为一个确定值的标识,其值在程序执行过程中保持不变。)常量可用伪指令说明符“EQU”或“=”定义。例如,AEQU7或A=7都可将常量A的值定义为常数7。注意:伪指令说明符EQU左边的符号名不允许重复定义,而“=”左边的符号名可以重复定义。即,AEQU7可以:A=7AEQU8(不允许)A=8(2)变量编程时只能确定其初始值,程序运行期间可修改其值的数据对象称为变量。变量是存储单元中的数据,可定义在任何段(DS、ES、SS、CS),但通常都定义在数据段(DS)和附加段(ES)。变量由伪指令说明符DB、DW、DD等定义。需要时可给变量的地址取名字,变量名就是变量地址的名字,可称为变量的符号地址。例如,在下列伪指令语句中,ADB50,60,70,80DW50,60,70,80DD50,60,70,80用DB、DW、DD说明符各定义了4个变量,并给出了每个变量的初始值。用DB定义的每个变量占一个字节单元,用DW定义的每个变量占两个连续的字节单元,用DD定义的每个变量占四个连续的字节单元,这些变量全部都按定义时的顺序依次存储,只是用DB定义的第一个变量赋予了名字A。A仅代表DB右边第一个变量(即DB右边初值为50的变量)的地址。变量有如下的属性:①段基值属性:指变量所在段的段基值;②偏移地址属性:指变量所在的存储单元的段内偏移地址;③类型属性:指变量所占存储单元的字节数。(3)标号标号就是指令地址的名字,也称为指令的符号地址。标号定义在指令的前面(通常是左边),用冒号作为分隔符。标号只能定义在代码段(CS)中,它代表其后第一条指令的第一个字节的存储单元地址,用于说明指令在存储器中的存储位置。例如,在下列指令序列中,MOVCX,2L:DECCXJZLL就是标号,它是JZ指令的直接操作数(转移地址).标号有如下的属性:①段基值属性:指标号后面第一条指令所在的代码段的段基值;②偏移地址属性:指标号后面第一条指令首字节的段内偏移地址;③类型属性:也称距离属性,是指标号与引用该标号的指令之间允许距离的远、近。(4)段名每一个段都必须用SEGMENT和ENDS标识段的开始和结束,SEGMENT和ENDS左边必须有名字,段名就是SEGMENT和ENDS左边的名字。对于同一个段,ENDS左边的名字必须与SEGMENT左边的名字相同。(5)过程名过程就是一段程序,可以是主程序,也可以是子程序。一个代码段中可以只有一个过程,也可以有多个过程。每一个过程都可用PROC和ENDP标识过程的开始和结束,PROC和ENDP左边必须有名字,过程名就是PROC和ENDP左边的名字。对于同一个过程,ENDP左边的名字必须与PROC左边的名字相同。过程名等同于标号,具有标号的全部属性。过程(子程序)的基本结构Proc-APROCNEAR(或FAR)____________过程名____________...____________RETProc-AENDP(6)偏移地址计数器$汇编程序在对源程序进行汇编的过程中,用偏移地址计数器$来保存当前正在汇编的指令的偏移地址或伪指令语句中变量的偏移地址。用户可将$用于自己编写的源程序中。在每个段开始汇编时,汇编程序(汇编器)都将$清为0,以后,每处理一条指令或一个变量,$就增加一个值,此值为该指令或该变量所占的字节数。可见,$的内容就是当前指令或变量的偏移地址。在伪指令中,$代表其所在地的偏移地址。例如,如果A的偏移地址是0074H,则语句ADW1,2,$+4,3,4,$+4中的第一个$+4的偏移地址为A+4,第二个$+4的偏移地址为A+10。汇编后:第一个$+4:$+4=(A+4)+4=(0074H+4)+4=007CH第二个$+4:$+4=(A+10)+4=(0074H+0AH)+4=0082H在指令中,$无论出现在指令的任何位置,都代表本条指令第一个字节的偏移地址。例如,“JZ$+6”的转向地址是该指令的首地址加上6,$+6还必须是另一条指令的首地址。再如,在下述指令序列中,DECCXJZ$+5MOVAX,2LAB:...因为$代表JZ指令的开始地址,而JZ指令占2个字节,这里的MOV指令占3个字节,所以,在发生转移时,JZ指令会将程序转向LAB标号处的指令,且标号LAB可省。3.汇编语言的伪操作(运算)符汇编语言中的操作符号很多,可分为算术操作符、逻辑操作符、关系操作符、重复置数(复制)操作符、取属性(分析)操作符、指定属性(合成)操作符、分离操作符、结构和记录中专用的操作符等几类。这些操作符都是面向汇编程序的,都由汇编程序解释并“执行”,而不是像指令那样由CPU去执行。通常称这些操作符为伪操作符,称对应的操作为伪操作。(1)算术伪操作常见的有+、-、MOD、SHL、SHR、*、/共7个符号,分别表示加、减、取模(求余数)、逻辑左移、逻辑右移、乘、除。这些操作符都可用于数据之间的运算,+、-操作符还可用于地址之间、数据与地址之间的运算。用于数据之间的运算时,按每个操作符的定义进行。例如,在字节操作时,“124MOD3”的结果为1“10110101BSHL2”的结果为11010100B再例如,对如下的定义,W1DW1,2,3,4,5,6,7B1DB10,20,30,40,50N1EQUB1-W1N2EQU$-W1B2DB0则N1=14,它是从W1开始到B1前为止的一组变量的字节数;N2=19,它是从W1开始到B2($代表的地址)前为止的一组变量的字节数。(2)关系伪操作关系伪操作对两个数据进行比较,有EQ、NE、LT、GT、LE、GE共6个符号,分别表示等于、不等于、小于、大于、小于或等于、大于或等于,操作的结果为逻辑值。若条件满足,则结果为“真”,若条件不满足,则结果为“假”。“真”用-1(n位全1)表示,“假”用0(n位全0)表示。例如,在字操作时:(60HLE70H)GE(60HLT30H)=FFFFHGE0000H=FFFFH。(3)逻辑伪操作有NOT、AND、OR、XOR共4个符号,分别表示非、与、或、异或,可用于对两个(或一个)数据进行操作。例如,在字操作时,1234HOR2AFEH=3AFEH,NOT0F0H=FF0FH;在字节操作时,NOT0F0H=0FH。(4)重复置数(复制)伪操作只有DUP一个符号,表示对其后(右边)的数据进行重复设置(复制),使用格式是:重复次数DUP(初值1[,初值2[,……]])其中,重复次数为无符号整数(1~65535),初值1、初值2……为变量的初始值。例如,下面各行的写法都等效:WDW25,8,2,3,2,3,6,8,2,3,2,3,6WDW25,2DUP(8,2,3,2,3,6)WDW1DUP(25),2DUP(8,2DUP(2,3),6)WDW1DUP(25),2DUP(1DUP(8),2DUP(2,3),1DUP(6))第一行的写法将13个变量分为13组,每组重复1次。后三行的写法将13个变量分为两组,第一组将25重复一次,第二组将(8,2,3,2,3,6)重复两次。无论哪种写法,我们都将第一组变量的重复次数称为W的长度,将W的长度与W的类型之积称为W的大小。此处,W的长度为1,类型为2,大小为2。长度和大小也可看作变量的属性。练习:若定义ADB1,2,5DUP(0,1,2DUP(3)),则在A的存储区前6个字节单元的数据是.(5)取属性(也称分析)伪操作取属性伪操作可以取出运算对象的某个属性。常见的有SEG、OFFSET、TYPE、LENGTH、SIZE共5个符号,分别表示取段基值、取偏移地址、取类型、取长度、取大
本文标题:汇编语言的基本语法
链接地址:https://www.777doc.com/doc-1644689 .html