第5章汇编语言的基本语法_第1页
第5章汇编语言的基本语法_第2页
第5章汇编语言的基本语法_第3页
第5章汇编语言的基本语法_第4页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第5章章 汇编语言的基本语法汇编语言的基本语法本章主要内容本章主要内容1.1.汇编语言的主要特点汇编语言的主要特点2.2.汇编语言源程序的基本结构汇编语言源程序的基本结构3.3.汇编语言的表达式和伪操作符汇编语言的表达式和伪操作符4.4.汇编语言程序的上机过程汇编语言程序的上机过程Assemble Languagen一种面向机器的程序设计语言,是一种用符号表一种面向机器的程序设计语言,是一种用符号表示的低级程序设计语言示的低级程序设计语言(机器语言的符号化描(机器语言的符号化描述)述),通常是为特定计算机或计算机系列专门设,通常是为特定计算机或计算机系列专门设计的。计的。Assemble L

2、anguagen用汇编语言编写的程序不用汇编语言编写的程序不能由机器直接执行,而必能由机器直接执行,而必须经汇编程序翻译成机器须经汇编程序翻译成机器语言程序。汇编语言指令语言程序。汇编语言指令与翻译成的机器语言指令与翻译成的机器语言指令之间基本是一一对应的关之间基本是一一对应的关系。系。n汇编过程示意汇编过程示意:n采用汇编语言进行程序设计的优点采用汇编语言进行程序设计的优点:n可充分利用机器的硬件功能和结构特点,加快程可充分利用机器的硬件功能和结构特点,加快程序的执行速度,减少目标程序所占用的存储空间。序的执行速度,减少目标程序所占用的存储空间。n常用来编写实时控制程序、实时通信程序实时控制

3、程序、实时通信程序,有时也用来编制某些系统软件程序某些系统软件程序。缺点:缺点:1. 编程效率低(与人们描述计算过程的需要差距编程效率低(与人们描述计算过程的需要差距大)大);2. 与机器硬件的具体结构联系过于紧密与机器硬件的具体结构联系过于紧密 在一种结构的机器上开发的程序极难移植在一种结构的机器上开发的程序极难移植到另一种不同结构的机器上去。到另一种不同结构的机器上去。示例程序示例程序DATA SEGMENT ;数据段 NUM DW 0011101000000111B NOTES DB The result is : , $DATA ENDSCODE SEGMENT ;代码段 ASSUME

4、 CS:CODE,DS:DATA BEGIN: MOV AX, DATA MOV DS,AX MOV DX,OFFSET NOTES ;显示提示信息 MOV AH,9H INT 21H MOV BX,NUM ;将数装入BX MOV CH,4 ;CH作循环计数器 示例程序(续)示例程序(续)ROTATE : DISPLAY: MOV CL, 4 ;CL中放移位位数 MOV DL, AL ;显示16进制数 ROL BX,CL MOV AH,2 MOV AL,BL INT 21H AND AL,0FH ;AL中为一位16进制数 DEC CH ADD AL,30H ;转换为ASCII码值 JNZ RO

5、TATE CMP AL,9 ;是09的数码? MOV AX,4C00H;返回DOS JLE DISPLAY INT 21H ADD AL,07H ;在AF之间 CODE ENDS ;代码段结束 END BEGIN ;模块结束堆栈段定义格式堆栈段定义格式STACK SEGMENT STACK STA DB 50 DUP (?) TOP EQU LENGTH STASTACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS, AX MOV SP,TOP :

6、CODE ENDS END START 5.1.2 汇编语言源程序的组成汇编语言源程序的组成1. 伪指令语句和指令语句伪指令语句和指令语句汇编语言源程序中除了包含机器指令外,还应包含说明性汇编语言源程序中除了包含机器指令外,还应包含说明性的的“指令指令”。这些说明性的。这些说明性的“指令指令”是面向汇编程序和连是面向汇编程序和连接程序的,称为接程序的,称为伪指令伪指令(Directives)。宏汇编程序宏汇编程序5.0版版(MASM V5.0)规定,汇编语言源程序的规定,汇编语言源程序的每行只能写一个语句:每行只能写一个语句: 指令语句或伪指令语句指令语句或伪指令语句。行长不。行长不能超过能超

7、过128个字符。每个语句最多可由四个字段组成:个字符。每个语句最多可由四个字段组成: 名名字字段、操作字段、操作数字段和注释字段。字字段、操作字段、操作数字段和注释字段。 伪指令语句是说明性语句,其格式为:伪指令语句是说明性语句,其格式为: 名字伪指令说明符参数表达式名字伪指令说明符参数表达式1,参数表达式,参数表达式2, ;注释;注释其中,伪指令说明符其中,伪指令说明符(伪指令名伪指令名)是伪指令语句中不可缺少是伪指令语句中不可缺少的主体,其余部分的主体,其余部分(方括号中的内容方括号中的内容)有时可省略。有时可省略。名字可为段名、过程名、变量名、符号名名字可为段名、过程名、变量名、符号名(

8、或常量名或常量名)、宏、宏名、结构名、记录名等。名、结构名、记录名等。例:例: A DB 20H,30H ; 注释注释 指令语句是可执行语句,其格式为:指令语句是可执行语句,其格式为: 名字名字:指令操作助记符操作数表达式指令操作助记符操作数表达式1,操作数表达式,操作数表达式2;注释;注释其中,其中,指令操作助记符指令操作助记符(指令名指令名)是指令语句中不可缺少的是指令语句中不可缺少的主体,其余部分主体,其余部分(方括号中的内容方括号中的内容)有时可省略。有时可省略。名字只能是标号。名字只能是标号。 注释以分号开头,分号右边的内容将被汇编程序忽略。注释以分号开头,分号右边的内容将被汇编程序

9、忽略。例例 L: ADD AX,BX ;注释注释 汇编程序负责计算伪指令语句中表达式的值,解释伪指令汇编程序负责计算伪指令语句中表达式的值,解释伪指令语句的含义并遵照语句的含义并遵照“执行执行”,但并不产生机器代码。但并不产生机器代码。汇编程序负责计算指令语句中表达式的值,并汇编程序负责计算指令语句中表达式的值,并将汇编指令将汇编指令翻译成机器指令代码。翻译成机器指令代码。指令语句经汇编后,在可执行程序运行期间由指令语句经汇编后,在可执行程序运行期间由CPU解释,解释,并由并由CPU按指令的要求完成各种运算与操作。按指令的要求完成各种运算与操作。 5.1.4 汇编语言的表达式1. 汇编语言的标

10、识符汇编语言的标识符2. 汇编语言的操作对象汇编语言的操作对象( 数据类型数据类型) (1) 常数、常量编程时已经确定其值,程序运行期间不会改变其值的数据编程时已经确定其值,程序运行期间不会改变其值的数据对象称为常数。对象称为常数。8086/8088CPU允许定义四种形式的常数: 整数、字符串、“组合BCD码数”和实数(浮点数),但只能处理整数、字符串、“组合BCD码数”,不能处理实数(浮点数)。 常数表达式的名字称为常量。常数表达式的名字称为常量。 (程序员给出的一个名或助记名作为一个确定值的标识,(程序员给出的一个名或助记名作为一个确定值的标识, 其值在程序执行过程中保持不变。)其值在程序

11、执行过程中保持不变。)常量可用伪指令说明符常量可用伪指令说明符“EQU”或或“=”定义。定义。例如,例如,A EQU 7或或 A = 7都可将常量都可将常量A的值定义为常数的值定义为常数7。 注意:伪指令说明符注意:伪指令说明符EQUEQU左边的符号名不允许重复定义,左边的符号名不允许重复定义,而而“=”=”左边的符号名可以重复定义。左边的符号名可以重复定义。 即,即,A EQU 7 A EQU 7 可以:可以:A=7A=7 A EQU 8 ( A EQU 8 (不允许)不允许) A=8A=8 (2) 变量变量编程时只能确定其初始值,程序运行期间可修改其值的数编程时只能确定其初始值,程序运行期

12、间可修改其值的数据对象称为变量。据对象称为变量。变量是存储单元中的数据,可定义在任变量是存储单元中的数据,可定义在任何段何段(DS、 ES、 SS、 CS),但通常都定义在数据段,但通常都定义在数据段(DS)和附加段和附加段(ES)。变量由伪指令说明符变量由伪指令说明符DB、DW、DD等定义。需要时可给等定义。需要时可给变量的地址取名字,变量名就是变量地址的名字,可称为变量的地址取名字,变量名就是变量地址的名字,可称为变量的符号地址。变量的符号地址。n例如例如, 在下列伪指令语句中,在下列伪指令语句中, A DB 50,60,70,80 DW 50,60,70,80 DD 50,60,70,8

13、0n用用DB、DW、DD说明符各定义了说明符各定义了4个变量,并给出了每个个变量,并给出了每个变量的初始值。变量的初始值。n用用DB定义的每个变量占一个字节单元,用定义的每个变量占一个字节单元,用DW定义的每个定义的每个变量占两个连续的字节单元,用变量占两个连续的字节单元,用DD定义的每个变量占四定义的每个变量占四个连续的字节单元,这些变量全部都按定义时的顺序依次个连续的字节单元,这些变量全部都按定义时的顺序依次存储,只是用存储,只是用DB定义的第一个变量赋予了名字定义的第一个变量赋予了名字A。nA仅代表仅代表DB右边第一个变量右边第一个变量(即即DB右边初值为右边初值为50的变量的变量)的地

14、址。的地址。 变量有如下的属性:变量有如下的属性: 段基值属性:段基值属性: 指变量所在段的段基值;指变量所在段的段基值; 偏移地址属性:偏移地址属性: 指变量所在的存储单元的段内偏移地指变量所在的存储单元的段内偏移地址;址; 类型属性:类型属性: 指变量所占存储单元的字节数。指变量所占存储单元的字节数。(3) 标号标号n标号就是指令地址的名字,也称为指令的符号地址。标号就是指令地址的名字,也称为指令的符号地址。n标号定义在指令的前面标号定义在指令的前面(通常是左边通常是左边),用冒号作为分隔符。,用冒号作为分隔符。标号只能定义在代码段标号只能定义在代码段(CS)中,它代表其后第一条指令的中,

15、它代表其后第一条指令的第一个字节的存储单元地址,用于说明指令在存储器中的第一个字节的存储单元地址,用于说明指令在存储器中的存储位置。例如存储位置。例如, 在下列指令序列中,在下列指令序列中, MOV CX, 2 L:DEC CX JZ LnL就是标号,它是就是标号,它是JZ指令的直接操作数指令的直接操作数(转移地址转移地址).标号有如下的属性:标号有如下的属性: 段基值属性:段基值属性: 指标号后面第一条指令所在的代码段的指标号后面第一条指令所在的代码段的段基值;段基值; 偏移地址属性:偏移地址属性: 指标号后面第一条指令首字节的段内指标号后面第一条指令首字节的段内偏移地址;偏移地址; 类型属

16、性:类型属性: 也称距离属性,是指标号与引用该标号的也称距离属性,是指标号与引用该标号的指令之间允许距离的指令之间允许距离的远、近远、近。 (4) 段名段名每一个段都必须用每一个段都必须用SEGMENT和和ENDS标识段的开始和结标识段的开始和结束,束,SEGMENT和和ENDS左边必须有名字,段名就是左边必须有名字,段名就是SEGMENT和和ENDS左边的名字。左边的名字。对于同一个段,对于同一个段,ENDS左边的名字必须与左边的名字必须与SEGMENT左边左边的名字相同。的名字相同。(5) 过程名过程名n过程就是一段程序,可以是主程序,也可以是子程序。一过程就是一段程序,可以是主程序,也可

17、以是子程序。一个代码段中可以只有一个过程,也可以有多个过程。个代码段中可以只有一个过程,也可以有多个过程。n每一个过程都可用每一个过程都可用PROC和和ENDP标识过程的开始和结束,标识过程的开始和结束,PROC和和ENDP左边必须有名字,过程名就是左边必须有名字,过程名就是PROC和和ENDP左边的名字。左边的名字。n对于同一个过程,对于同一个过程,ENDP左边的名字必须与左边的名字必须与PROC左边的左边的名字相同。名字相同。n过程名等同于标号,具有标号的全部属性。过程名等同于标号,具有标号的全部属性。过程过程(子程序子程序)的基本结构的基本结构 Proc-A PROC NEAR(或FAR

18、) _过程名过程名 _ . . . _ RET Proc-A ENDP (6) 偏移地址计数器偏移地址计数器$汇编程序在对源程序进行汇编的过程中,用偏移地址计数汇编程序在对源程序进行汇编的过程中,用偏移地址计数器器$来保存当前正在汇编的指令的偏移地址或伪指令语句来保存当前正在汇编的指令的偏移地址或伪指令语句中变量的偏移地址。中变量的偏移地址。用户可将用户可将$用于自己编写的源程序中。用于自己编写的源程序中。在每个段开始汇编时,汇编程序在每个段开始汇编时,汇编程序( 汇编器)都将汇编器)都将$清为清为0,以后,每处理一条指令或一个变量,以后,每处理一条指令或一个变量,$就增加一个值,此就增加一个

19、值,此值为该指令或该变量所占的字节数。值为该指令或该变量所占的字节数。可见,可见,$的内容就是当前指令或变量的偏移地址。的内容就是当前指令或变量的偏移地址。 n在伪指令中在伪指令中,$代表其所在地的偏移地址。例如,如果A的偏移地址是0074H,则语句nA DW 1, 2, $+4, 3, 4, $+4 中的第一个$+4的偏移地址为A+4,第二个$+4的偏移地址为A+10。n汇编后汇编后:n第一个$+4:$+4=(A+4)+4=(0074H+4)+4=007CHn第二个$+4:$+4=(A+10)+4=(0074H+0AH)+4=0082Hn在指令中在指令中,$无论出现在指令的任何位置,都代表本

20、条指无论出现在指令的任何位置,都代表本条指令第一个字节的偏移地址。例如,令第一个字节的偏移地址。例如,“JZ $+6”的转向地址的转向地址是该指令的首地址加上是该指令的首地址加上6,$+6还必须是另一条指令的首地还必须是另一条指令的首地址。再如,在下述指令序列中,址。再如,在下述指令序列中, DEC CX JZ $+5 MOV AX, 2 LAB: .n因为因为$代表代表JZ指令的开始地址,而指令的开始地址,而JZ指令占指令占2个字节,这个字节,这里的里的MOV 指令占指令占3个字节,所以,在发生转移时,个字节,所以,在发生转移时,JZ指指令会将程序转向令会将程序转向LAB标号处的指令标号处的

21、指令, 且标号且标号LAB 可省。可省。3. 汇编语言的伪操作(运算)符n汇编语言中的操作符号很多,可分为汇编语言中的操作符号很多,可分为算术操作符、逻辑操算术操作符、逻辑操作符、关系操作符、重复置数作符、关系操作符、重复置数(复制复制)操作符、取属性操作符、取属性(分析分析)操作符、指定属性操作符、指定属性(合成合成)操作符、分离操作符、结构和记操作符、分离操作符、结构和记录中专用的操作符录中专用的操作符等几类。等几类。n这些操作符都是面向汇编程序的,都由汇编程序解释并这些操作符都是面向汇编程序的,都由汇编程序解释并“执行执行”,而不是像指令那样由,而不是像指令那样由CPU去执行。去执行。n

22、通常称这些操作符为通常称这些操作符为伪操作符伪操作符,称对应的操作为称对应的操作为伪操作。伪操作。 (1) 算术伪操作算术伪操作n常见的有常见的有+、-、MOD、SHL、SHR、*、/共共7个符号,分别表个符号,分别表示加、减、取模示加、减、取模(求余数求余数)、逻辑左移、逻辑右移、乘、除。这、逻辑左移、逻辑右移、乘、除。这些操作符都可用于数据之间的运算,些操作符都可用于数据之间的运算,+、-操作符还可用于地址操作符还可用于地址之间、数据与地址之间的运算。之间、数据与地址之间的运算。n 用于数据之间的运算时用于数据之间的运算时,按每个操作符的定义进行。,按每个操作符的定义进行。 例如,在字节操

23、作时,例如,在字节操作时,n“124 MOD 3”的结果为的结果为1n“10110101B SHL 2”的结果为的结果为11010100Bn注意:注意:“MOV AL, 00011010B SHL 2 ” 中的中的“SHL” 是移位伪是移位伪操操 n 作符作符n “SHL AL,1 ” 中的中的“SHL” 是移位指令助记符是移位指令助记符 n再例如,对如下的定义,再例如,对如下的定义, W1 DW 1, 2, 3, 4, 5, 6, 7 B1 DB 10, 20, 30, 40, 50 N1 EQU B1-W1 N2 EQU $-W1 B2 DB 0n则则N1=14,它是从,它是从W1开始到开

24、始到B1前为止的一组变量的字节前为止的一组变量的字节数;数;nN2=19,它是从,它是从W1开始到开始到B2($代表的地址代表的地址)前为止的一组前为止的一组变量的字节数变量的字节数。(2) 关系伪操作关系伪操作n关系伪操作对两个数据进行比较,有关系伪操作对两个数据进行比较,有EQ、NE、LT、GT、LE、GE共共6个符号,分别表示等于、不等于、小于、大个符号,分别表示等于、不等于、小于、大于、小于或等于、大于或等于,操作的结果为逻辑值。于、小于或等于、大于或等于,操作的结果为逻辑值。n若条件满足,则结果为若条件满足,则结果为“真真”,若条件不满足,则结果为,若条件不满足,则结果为“假假”。“

25、真真”用用-1(n位全位全1)表示,表示,“假假”用用0(n位全位全0)表表示。示。n例如,在字操作时例如,在字操作时: n(60H LE 70H) GE (60H LT 30H) = FFFFH GE 0000H = FFFFH。(3) 逻辑伪操作逻辑伪操作n有有NOT、AND、OR、XOR共共4个符号,分别表示非、与、个符号,分别表示非、与、或、异或,可用于对两个或、异或,可用于对两个(或一个或一个)数据进行操作。数据进行操作。n例如,在字操作时,例如,在字操作时,1234H OR 2AFEH = 3AFEH, NOT 0F0H = FF0FH;n在字节操作时,在字节操作时,NOT 0F0

26、H = 0FH。(4) 重复置数重复置数(复制复制)伪操作伪操作n只有只有DUP一个符号,表示对其后一个符号,表示对其后(右边右边)的数据进行重复设的数据进行重复设置置(复制复制),使用格式是:,使用格式是: 重复次数重复次数 DUP (初值初值1, 初值初值2, )n其中,重复次数为无符号整数其中,重复次数为无符号整数(165535),初值,初值1、初值、初值2 为变量的初始值。例如,为变量的初始值。例如, n下面各行的写法都等效:下面各行的写法都等效: W DW 25,8,2,3,2,3,6,8,2,3,2,3,6 W DW 25,2 DUP(8,2,3,2,3,6) W DW 1 DUP

27、(25),2 DUP(8,2 DUP(2,3),6) W DW 1 DUP(25),2 DUP(1 DUP(8),2 DUP(2,3),1 DUP(6)n 第一行的写法将第一行的写法将13个变量分为个变量分为13组,每组重复组,每组重复1次。后三次。后三行的写法将行的写法将13个变量分为两组,第一组将个变量分为两组,第一组将25重复一次,第重复一次,第二组将二组将(8,2,3,2,3,6)重复两次。重复两次。n无论哪种写法,我们都将第一组变量的重复次数称为无论哪种写法,我们都将第一组变量的重复次数称为W的的长度长度,将,将W的长度与的长度与W的类型之积称为的类型之积称为W的大小的大小。此处,。

28、此处,W的长度为的长度为1,类型为,类型为2,大小为,大小为2。长度和大小也可看作。长度和大小也可看作变量的属性。变量的属性。n练习:练习:若定义若定义A DB 1, 2, 5 DUP(0,1,2 DUP(3),则在则在A的存的存储区前储区前6个字节单元的数据是个字节单元的数据是 . (5) 取属性取属性(也称分析也称分析)伪操作伪操作n取属性伪操作可以取出运算对象的某个属性。常见的有取属性伪操作可以取出运算对象的某个属性。常见的有SEG、OFFSET、TYPE、LENGTH、SIZE共共5个符号,个符号,分别表示取段基值、取偏移地址、取类型、取长度、取大分别表示取段基值、取偏移地址、取类型、

29、取长度、取大小,操作的结果都是数值常数。小,操作的结果都是数值常数。n格式:格式: SEG 变量名或标号变量名或标号 返回变量或标号所在段的段基值。例如,若返回变量或标号所在段的段基值。例如,若A为变量名为变量名或标号,则或标号,则SEG A表示表示A所在段的段基值。所在段的段基值。n 格式:格式: OFFSET 变量名或标号变量名或标号 返回变量或标号的偏移地址部分。例如,若返回变量或标号的偏移地址部分。例如,若A为变量名为变量名或标号;则或标号;则OFFSET A表示表示A的偏移地址部分。的偏移地址部分。n格式:格式: TYPE 变量名或标号变量名或标号 返回变量或标号的类型属性值。返回变

30、量或标号的类型属性值。n格式:格式: LENGTH 变量名变量名 返回变量的长度,即以返回变量的长度,即以DUP形式表示的第一组变量被重形式表示的第一组变量被重 复设置的次数。复设置的次数。n 格式:格式: SIZE 变量名变量名 返回变量的大小,即返回变量的大小,即TYPELENGTH的值。也就是说,的值。也就是说,SIZE=TYPELENGTH。 关于关于TYPE、LENGTH和和SIZE的含义举例的含义举例n对于对于“W1 DW 20 DUP(3, 10 DUP(7)”,则,则TYPE W1=2,LENGTH W1=20,SIZE W1=40;n 对于对于“W2 DW 8, 20 DUP

31、(3, 10 DUP(7)”,则,则TYPE W2=2,LENGTH W2=1, SIZE W2=2;n 对于对于“B1 DB 20 DUP(3, 10 DUP(7)”,则,则TYPE B1=1,LENGTH B1= ,SIZE B1= ;n 对于对于“B2 DB 8, 20 DUP(3, 10 DUP(7)”,则,则TYPE B2= ,LENGTH B2= , SIZE B2= 。(6) 指定属性指定属性(也称合成也称合成)伪操作伪操作n指定属性伪操作可用于指定存储器操作数或标号的属性,指定属性伪操作可用于指定存储器操作数或标号的属性,常见的有常见的有PTR、:、THIS共共3个符号,其功能

32、分别为:个符号,其功能分别为: 指指定存储器操作数或标号的类型、指定存储器操作数的段归定存储器操作数或标号的类型、指定存储器操作数的段归属、指定当地的变量或标号的类型。属、指定当地的变量或标号的类型。n 格式:格式: 类型名类型名 PTR 存储器操作数或标号存储器操作数或标号 例如,指令例如,指令“MOVBX, 5”的含义是将常数的含义是将常数5送入存送入存储单元储单元BX中中 。该存储单元的偏移地址由。该存储单元的偏移地址由BX确定,段确定,段基值隐含为基值隐含为DS。但汇编程序无法确定常数。但汇编程序无法确定常数5是字节还是字,是字节还是字,也无法确定存储单元也无法确定存储单元BX的内容是

33、字节还是字,所以的内容是字节还是字,所以无法操作。无法操作。n格式:格式: 段寄存器名段寄存器名 : 存储器操作数存储器操作数 临时指定存储器操作数的段归属。例如,临时指定存储器操作数的段归属。例如,“MOV AX, ES:BX”表示该存储单元的段基值取自表示该存储单元的段基值取自ES,而不是,而不是隐含的隐含的DS。 格式:格式: THIS 类型名类型名n临时指定当前地址处变量或标号的类型。例如,临时指定当前地址处变量或标号的类型。例如,THIS BYTE表示当前地址处变量的类型为字节,表示当前地址处变量的类型为字节,THIS FAR表表示当前地址处标号的类型为远。示当前地址处标号的类型为远

34、。nTHIS操作符会在当前段内产生一个偏移地址与操作符会在当前段内产生一个偏移地址与$的值相等的值相等的操作数,该操作数的类型由的操作数,该操作数的类型由THIS右边的类型名确定。右边的类型名确定。qTHIS 可以像可以像PTR一样建立一个指定类型(一样建立一个指定类型(BYTE,WORD或或DWORD)或指定距离(或指定距离(NEAR或或FAR)的操作数。的操作数。该操该操作数的段地址和偏移地址与下一个存储单元地址相同。作数的段地址和偏移地址与下一个存储单元地址相同。qTHIS 往往和伪指令说明符往往和伪指令说明符EQU 连用,为当前存储单元定连用,为当前存储单元定义一个指定类型的变量或标号

35、,并为下一个能分配存储单义一个指定类型的变量或标号,并为下一个能分配存储单元的变量和标号定义新的类型。例如:元的变量和标号定义新的类型。例如: A EQU THIS BYTE B DD 12345678Hq就是将一个双字类型变量就是将一个双字类型变量B临时指定为字节类型变量,它临时指定为字节类型变量,它与与A 具有相同的段地址和偏移量。具有相同的段地址和偏移量。 n例例: . A EQU THIS BYTE B DD 12345678H . CLD MOV SI, OFFSET A LODSB ;AL (DS:SI), SI SI+1 DATA SEGMENT A EQU THIS BYTE

36、B DD 12345678HDATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX,DATA MOV DS,AX CLD MOV SI, OFFSET A LODSB ;AL (DS:SI), SI SI+1 MOV AX,4C00H INT 21HCODE ENDS END START又如:又如: START EQU THIS FARSTART EQU THIS FAR MOV CX ,100 MOV CX ,100 这样,这样,MOV MOV 指令指令 有一个有一个FAR FAR 属性的地址属性的地址START,START,这

37、就允许这就允许其他段的其他段的JMP JMP 指令直接跳到指令直接跳到STARTSTART来。来。 (7) 分离操作符分离操作符n有有SHORT、HIGH和和LOW三个,其功能是从其后的操作三个,其功能是从其后的操作数数(或与其后的操作数有关的数据或与其后的操作数有关的数据)中分离出一部分内容作中分离出一部分内容作为返回值。为返回值。n 格式:格式: SHORT 标号标号 只取出标号与只取出标号与IP之差之差(标号标号-IP)的低字节,即将标号按短的低字节,即将标号按短(距离距离)处理。处理。n 格式:格式: HIGH 字操作数字操作数 从字操作数中分离出高字节。例如,从字操作数中分离出高字节

38、。例如,HIGH 1234H的操作的操作结果为结果为12H。n 格式:格式: LOW 字操作数字操作数 从字操作数中分离出低字节。例如,从字操作数中分离出低字节。例如,LOW 1234H的操作的操作结果为结果为34H。4. 汇编语言的表达式汇编语言的表达式 (1) 表达式及分类表达式及分类 用伪操作符将操作对象组合起来即得到表达式,单个操作用伪操作符将操作对象组合起来即得到表达式,单个操作对象也可称为表达式。表达式可作为指令语句中的操作数对象也可称为表达式。表达式可作为指令语句中的操作数或伪指令语句中的参数。按操作性质的不同可将表达式分或伪指令语句中的参数。按操作性质的不同可将表达式分为四类:

39、为四类: 算术表达式算术表达式 逻辑表达式逻辑表达式 关系表达式关系表达式 特殊表达式特殊表达式 (2) 表达式的操作顺序表达式的操作顺序 表达式中常用的伪操作符按以下顺序依次优先处理表达式中常用的伪操作符按以下顺序依次优先处理: (i)()、 、(ii)LENGTH、WIDTH、SIZE、MASK (iii)(结构字段名操作符结构字段名操作符) (iv): (段超越前缀的操作符段超越前缀的操作符) (v)PTR、OFFSET、SEG、TYPE、THIS (vi)HIGH、LOW (i)+ (正号正号)、- (负号负号) (ii)*、/ (iii)MOD、SHL、SHR (iv)+、 - EQ

40、、NE、LT、LE、GT、GE (i) NOT (ii) AND (iii) OR、XOR SHORT 例如,因为例如,因为“HIGH”运算优先于运算优先于“+”运算,所以,运算,所以, HIGH 1234H + 2 = 12H + 2 = 14H HIGH (1234H + 2) = HIGH 1236H = 12H5.1.5 汇编语言的伪指令说明符 1. 数据定义数据定义(存储单元分配存储单元分配) 数据定义说明符用于定义变量,也就是为变量分配存储单数据定义说明符用于定义变量,也就是为变量分配存储单元并可同时预置初始值,有元并可同时预置初始值,有DB、DW、DD、DF、DQ、DT共共6种说

41、明符。种说明符。 分别表示存储单元分配时以字节为单位、以字为单位、以分别表示存储单元分配时以字节为单位、以字为单位、以双字为单位、以双字为单位、以3字字(远字远字)为单位、以为单位、以4字为单位、以字为单位、以10字字节为单位。节为单位。 例如,在下述定义中,例如,在下述定义中, A DB 12H, ? B DW ?, 3456H C DD 789ABCDEH D DB A, B, C, D E DB ABCD F DW AB, CD 上述各变量的存储情况如图上述各变量的存储情况如图5-4所示。显然,所示。显然,DBAB和和DWAB的存储情况不同。的存储情况不同。A图图5-4 变量在存储器中的

42、存储情况变量在存储器中的存储情况 12?5634BDEBC9A78C41424344D41424344E42414443F程序例程序例DATA SEGMENT TAB DW 1,2,3,4,5,6 ENTRY EQU 3DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATAL: MOV AX, DATA MOV DS, AX MOV BX,OFFSET TAB ADD BX, ENTRY ; MOV AX, TAB+3 MOV AX, BXCODE ENDS END L 上述程序执行后上述程序执行后,AX= 2. 符号定义符号定义(表达式赋值表达式赋值)有有

43、 =、EQU、PURGE共共3种说明符,含义分别是被赋予、种说明符,含义分别是被赋予、被赋予、取消被赋予、取消(释放释放)。(1)格式:格式: 符号名符号名 = 表达式表达式将表达式的值赋予符号名,以后即可用该符号名代表此表将表达式的值赋予符号名,以后即可用该符号名代表此表达式的值。达式的值。(2) 格式:格式: 符号名符号名 EQU 表达式或另一组标识符表达式或另一组标识符将表达式的值或另一组标识符赋予符号名,以后即可用该将表达式的值或另一组标识符赋予符号名,以后即可用该符号名代表此表达式的值或代替另一组标识符。符号名代表此表达式的值或代替另一组标识符。(3) 格式:格式: PURGE 符号

44、名符号名1,符号名,符号名2, 取消取消(释放释放)被被EQU定义的符号名,以后即可用定义的符号名,以后即可用EQU对该符对该符号名再赋予不同的含义。号名再赋予不同的含义。3. 段定义段定义段定义说明符共有段定义说明符共有3种,即种,即SEGMENT、ENDS和和ASSUME,含义分别是段开始、段结束、指定段寄存器。,含义分别是段开始、段结束、指定段寄存器。(1) 格式:格式: 段名段名 SEGMENT定位类型组合类型定位类型组合类型类别类别从段名代表的段基值开始定义一个段。其中的定位类型、组合类型和从段名代表的段基值开始定义一个段。其中的定位类型、组合类型和类别类别一般都可省略,若不省略时各

45、项的顺序不能变。一般都可省略,若不省略时各项的顺序不能变。 定位类型:定位类型: 连接时用于指定该段应开始于什么样的物理地址。可连接时用于指定该段应开始于什么样的物理地址。可选择下列选择下列4种之一:种之一: BYTE: 从当前可用的字节地址从当前可用的字节地址XXXX XXXX XXXX XXXX XXXX(任一地址任一地址)开始;开始;WORD: 从当前可用的字地址从当前可用的字地址XXXX XXXX XXXX XXXX XXX0(偶数地址偶数地址)开始;开始;PARA(缺省缺省): 从当前可用的节地址从当前可用的节地址XXXX XXXX XXXX XXXX 0000(16的倍数的倍数)开

46、始;开始;PAGE: 从当前可用的页地址从当前可用的页地址XXXX XXXX XXXX 0000 0000(256的倍数的倍数)开始开始。 其中,其中,1节(节(paragraph) 为为16字节,字节,1页为页为16节即节即256字节。字节。 组合类型:组合类型: 连接时用于指定同名的各段之间的组合方式。连接时用于指定同名的各段之间的组合方式。可选择下列可选择下列6种之一:种之一: PUBLIC STACK COMMON MEMORY AT表达式表达式 NONE(缺省缺省)若省略组合类型或说明为若省略组合类型或说明为NONE类型,则表示各个段不组类型,则表示各个段不组合,各有自己的段基值。合

47、,各有自己的段基值。对堆栈段,必须用对堆栈段,必须用STACK类型说明,不能省略类型说明,不能省略 。 类别类别: 是要将组合后的各段按是要将组合后的各段按类别类别分类存放,同类别分类存放,同类别的段将被相邻地放在一起。的段将被相邻地放在一起。类别类别是由用户定义的、用一是由用户定义的、用一对引号括起来的、长度不超过对引号括起来的、长度不超过40个字符的名字个字符的名字(标识符标识符)。 (2)格式:格式: 段名段名 ENDS 表示该段到此结束。这里的段名必须与该段开始时表示该段到此结束。这里的段名必须与该段开始时SEGMENT左边的段名相同。左边的段名相同。 (3) 格式:格式: ASSUM

48、E 段寄存器名段寄存器名1:段名段名1,段寄存器名,段寄存器名2:段名段名2, 该语句必须出现在有关的变量及标号使用之前,用于指定该语句必须出现在有关的变量及标号使用之前,用于指定某段某段(用段名标识用段名标识)中的变量、标号等数据项由哪个段寄存中的变量、标号等数据项由哪个段寄存器寻址。器寻址。4. 指定段内的偏移地址指定段内的偏移地址常用的有常用的有ORG和和EVEN两种说明符,是指定下一个要用的两种说明符,是指定下一个要用的存储单元的偏移地址。存储单元的偏移地址。(1)格式:格式: ORG 常数表达式常数表达式指定当前可用的存储单元的偏移地址为常数表达式的值,指定当前可用的存储单元的偏移地

49、址为常数表达式的值,就是将常数表达式的值送入就是将常数表达式的值送入$。(2) 格式:格式: EVEN将当前可用的存储单元的偏移地址调整为最近的偶数值,将当前可用的存储单元的偏移地址调整为最近的偶数值,就是将当前可用的最小偶数偏移地址值送入就是将当前可用的最小偶数偏移地址值送入$。 例如,在下述伪指令语句序列中,例如,在下述伪指令语句序列中, ORG 1000H A DB 47H, 12H, 45H EVEN B DB 47H ORG 1000H 将将A的偏移地址部分指定为的偏移地址部分指定为1000H,从,从A开开始存放始存放3个字节变量,占用地址个字节变量,占用地址1000H、1001H和

50、和1002H,B的偏移地址部分的偏移地址部分本应是本应是1003H,但,但EVEN指令会将指令会将B的偏的偏移地址部分移地址部分调整为偶数地址调整为偶数地址1004H。对于字数组,为保证其从偶地址开始,可在它前面用对于字数组,为保证其从偶地址开始,可在它前面用EVEN 伪操作来达到这一目的,形如:伪操作来达到这一目的,形如: DATA-SEG SEGMENT EVEN WORD-ARRAY DW 100 DUP(?) DATA-SEG ENDS5. 过程定义过程定义有有PROC、ENDP两种说明符,含义分别是过程开始与过两种说明符,含义分别是过程开始与过程结束,必须成对出现。程结束,必须成对出

51、现。(1)格式:)格式: 过程名过程名 PROC 类型属性名类型属性名从过程名代表的地址开始定义一个过程,其中的类型属性从过程名代表的地址开始定义一个过程,其中的类型属性名可选择名可选择NEAR或或FAR两种之一,前者表示该过程为近过两种之一,前者表示该过程为近过程,后者表示该过程为远过程。程,后者表示该过程为远过程。如果不给出类型属性名或给出如果不给出类型属性名或给出NEAR,则视为近过程。,则视为近过程。(2)格式:)格式: 过程名过程名 ENDP表示该过程到此结束。这里的过程名必须与过程开始时表示该过程到此结束。这里的过程名必须与过程开始时PROC左边的过程名相同。左边的过程名相同。过程

52、过程(子程序子程序)的基本结构的基本结构 Proc-A PROC NEAR(或FAR) _过程名过程名 _ . . . _ RET Proc-A ENDP 6. 类型定义类型定义n类型定义说明符只有一个,即类型定义说明符只有一个,即LABEL,可用来给当前地可用来给当前地址处的变量或标号取一个别名址处的变量或标号取一个别名,并赋予另一种类型属性。并赋予另一种类型属性。n格式格式: 变量名或标号变量名或标号 LABEL 类型属性名类型属性名n“LABEL”和和“EQU THIS”的作用类似的作用类似5.1.6 宏定义、宏调用和宏扩展宏定义、宏调用和宏扩展n宏(宏(MACRO)是源程序中一段有独立

53、功能的程序代码、它是源程序中一段有独立功能的程序代码、它只需在源程序中定义一次,就可以多次用一条宏指令来调只需在源程序中定义一次,就可以多次用一条宏指令来调用它。用它。n宏定义宏定义是用伪指令来实现的。其格式为:是用伪指令来实现的。其格式为:MACRO?ENDMdummy Parameter List宏指令名宏指令名宏定义体宏定义体形式参数形式参数(用逗号隔开)其中MACRO和ENDM是一对伪指令说明符,这对伪指令之间是宏定义体一组有独立功能的程序代码组有独立功能的程序代码Macro-namen经宏定义定义后的宏指令就可以在源程序中调用经宏定义定义后的宏指令就可以在源程序中调用,这种对对宏指令

54、的调用称宏指令的调用称宏调用宏调用,宏调用的格式为:nMacro-name actual parameter list(每一项之间用逗号隔开每一项之间用逗号隔开)n当源程序被汇编时,汇编程序将对每个宏调用作当源程序被汇编时,汇编程序将对每个宏调用作宏展开。宏展开。n宏展开就是用宏定义体取代源程序中的宏指令名,而且用宏展开就是用宏定义体取代源程序中的宏指令名,而且用实在参数一一取代宏定义的形式参数。实在参数一一取代宏定义的形式参数。例例1. 宏定义可以无变元宏定义宏定义:SAVEREG MACRO PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI E

55、NDM宏调用宏调用: SAVEREG宏展开宏展开: 将宏定义体的内容(具有独立功能的代码段具有独立功能的代码段)全部列出。宏定义开始宏定义开始宏定义体宏定义体宏定义结束宏定义结束宏指令宏指令例例2 宏定义带形式参数宏定义宏定义: FOO MACRO P1, P2, P3 MOV AX, P1 P2 P3 ENDM宏调用宏调用: FOO WORD_VAR, INC, AX宏展开宏展开: MOV AX, WORD_VAR INC AX子程序调用和宏调用工作方式的区别n子程序调用工作方式子程序调用工作方式:XA,yBCALL QxC,yDCALL Q主程序Q: . . . RET子程序Q(x,y)执

56、行时调用执行时调用n宏调用工作方式:宏调用工作方式:Q A,BQ C,D主程序汇编时展开汇编时展开Q(A,B)Q(C,D)Q MACRO x,yENDM子程序调用和宏调用工作方式的区别子程序调用和宏调用工作方式的区别1. 在处理时间上不同。在处理时间上不同。2. 用宏指令得到的目标代码长,占内存空间大,而且宏调用用宏指令得到的目标代码长,占内存空间大,而且宏调用的次数越多,所占内存空间越大;用子程序占内存空间的次数越多,所占内存空间越大;用子程序占内存空间小,而且不会随调用次数的增加而增加,但执行时间长。小,而且不会随调用次数的增加而增加,但执行时间长。3. 传递参数的方式不同。传递参数的方式

57、不同。5.1.7 汇编语言程序的开发汇编语言程序的开发汇编语言程序的建立及汇编过程汇编语言程序的建立及汇编过程编辑程序Prog.asm文件汇编程序Prog.obj文件连接程序Prog.exe文件Edit.exeMasm.exeLink.exe汇编示意图汇编示意图调用 MASM.EXE.ASM汇编.OBJ.LST.CRF可选1.汇编程序的主要功能汇编程序的主要功能n汇编程序分两种汇编程序分两种:n一种是基本汇编一种是基本汇编(ASM.EXE);n一种是宏汇编一种是宏汇编(MASM.EXE),宏汇编功能比较,宏汇编功能比较强。强。1.检查源程序;检查源程序;2.测出源程序中的语法错误,并给出出错信息;测出源程序中的语法错误,并给出出错信息;3.产生产生目标文件(目标文件(.OBJ),并可给出并可给出列表文件列表文件(同时列出汇(同时列出汇编语言源程序和机器语言目标程序的文件,称之为编语言源程序和机器语言目标程序的文件,称之为.LST文文件)件)和和交叉索引文件交叉索引文件(列出程序中使用的符号、变量和标(列出程序中使用的符号、变量和标号以及引用情况,称之为号以及引用情况,称

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论