第五章 汇编语言_第1页
第五章 汇编语言_第2页
第五章 汇编语言_第3页
第五章 汇编语言_第4页
第五章 汇编语言_第5页
已阅读5页,还剩93页未读 继续免费阅读

下载本文档

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

文档简介

1、内容提要:学习要求: 通过前面的学习我们知道,通过前面的学习我们知道,计算机之所以计算机之所以能够自动地工作,是因为计算机能按照程序的能够自动地工作,是因为计算机能按照程序的安排执行相应的指令,编写这些程序的语言安排执行相应的指令,编写这些程序的语言就就称为称为。计算机语言按照人类的语言。计算机语言按照人类的语言习惯通常分为习惯通常分为、和和,与人类自然语言相差较大、接近于机器描述的与人类自然语言相差较大、接近于机器描述的计算机语言称为低级语言,低级语言包括计算机语言称为低级语言,低级语言包括机器机器语言语言和和汇编语言汇编语言。本章主要介绍和计算机硬件。本章主要介绍和计算机硬件系统紧密相关的

2、汇编语言程序设计。系统紧密相关的汇编语言程序设计。5.1汇编语言基础5.2汇编语言程序结构5.3汇编语言程序设计小结第第5 5章章 汇编语言程序设计基础汇编语言程序设计基础 在计算机内部,控制计算机工作的指令都以在计算机内部,控制计算机工作的指令都以的形式出现,这样的指令称为机器指令,用机的形式出现,这样的指令称为机器指令,用机器指令编写的程序称为器指令编写的程序称为。 机器语言是二进制编码表示的机器语言是二进制编码表示的命令命令和和数据数据的总称,的总称,面向机器,能够被计算机直接识别和执行。面向机器,能够被计算机直接识别和执行。 为了程序设计的方便,产生了汇编语言。为了程序设计的方便,产生

3、了汇编语言。,用与操作功能含义相应的,用与操作功能含义相应的作为编程使用的语言,来表示作为编程使用的语言,来表示二进制格式的二进制格式的和和。 计算机在运行汇编语言程序之前计算机在运行汇编语言程序之前要先将其转换成要先将其转换成机器代码机器代码,才能由计算机识别执行,转换的过程是由,才能由计算机识别执行,转换的过程是由编译程序编译程序来完成。来完成。5.1 5.1 汇编语言基础汇编语言基础5.1.1 汇编语言概述汇编语言概述v 宏汇编宏汇编使用的语句分两类使用的语句分两类指令性语句指令性语句伪指令语句伪指令语句在汇编语言中,在汇编语言中,符号指令符号指令和和机器指令机器指令通常是一通常是一一对

4、应的,一对应的, 由于机器由于机器Debug 是是DOS,Windows 都提供的实模都提供的实模式(式(8086方式)程序的调试工具,使用他方式)程序的调试工具,使用他可以查看可以查看CPU各种寄存器中的内容,内存各种寄存器中的内容,内存的情况和在机器码级跟踪程序的运行。的情况和在机器码级跟踪程序的运行。主要的主要的Debug功能:功能:R命令:查看、改变命令:查看、改变CPU寄存器的内容;寄存器的内容;D命令:查看内存中的内容;命令:查看内存中的内容;E命令:改写内存中的内容;命令:改写内存中的内容;U命令:将内存中的机器指令翻译为汇编指命令:将内存中的机器指令翻译为汇编指令;令;T命令:

5、执行一条机器指令;命令:执行一条机器指令;A命令命令: 以汇编指令的格式在内存中写入一以汇编指令的格式在内存中写入一条机器指令。条机器指令。主要的主要的Debug功能:功能:R命令:查看、改变命令:查看、改变CPU寄存器的内容;寄存器的内容;D命令:查看内存中的内容;命令:查看内存中的内容;E命令:改写内存中的内容;命令:改写内存中的内容;U命令:将内存中的机器指令翻译为汇编指命令:将内存中的机器指令翻译为汇编指令;令;T命令:执行一条机器指令;命令:执行一条机器指令;A命令命令: 以汇编指令的格式在内存中写入一以汇编指令的格式在内存中写入一条机器指令。条机器指令。 是一个可选字段,由是一个可

6、选字段,由字母(字母(A Z、a z)数字(数字(0 9)及)及专用字符(?、专用字符(?、.、-、$)组成的字符串,最长不超过组成的字符串,最长不超过31个字符,要求必须个字符,要求必须以字母开头,用冒号与操作项分开以字母开头,用冒号与操作项分开。标号实质上是。标号实质上是。,如程序中的,如程序中的JMP指指令和令和CALL指令的指令的由标号指定。由标号指定。 标号有三种属性:标号有三种属性:、和和。段属性:段属性:定义标号的程序段的段基值;定义标号的程序段的段基值;偏移量:偏移量:表示该标号在段内的偏移地址,偏移量是一表示该标号在段内的偏移地址,偏移量是一个个16位的无符号数;位的无符号数

7、;类型:类型:有有NEAR和和FAR两种,两种,NEAR只能提供同一段只能提供同一段内的指令调用,内的指令调用,FAR可以被其他段指令调用。可以被其他段指令调用。 是汇编语言程序中是汇编语言程序中不可省略不可省略的主要部分,用的主要部分,用指令助记符或定义符表示的机器指令操作码,如:指令助记符或定义符表示的机器指令操作码,如:MOV、ADD等,它告诉等,它告诉CPU要完成什么具体操作。有的操作项要完成什么具体操作。有的操作项带有前缀,指令系统中允许与指令助记符一起出现的前带有前缀,指令系统中允许与指令助记符一起出现的前缀是缀是和和。 紧跟在操作项之后,具体指明操作项的指令紧跟在操作项之后,具体

8、指明操作项的指令对哪些对哪些或或进行操作,它可以包含两个操作数、进行操作,它可以包含两个操作数、一个操作数或无操作数。如:一个操作数或无操作数。如:MOV、ADD等指令要求有等指令要求有两个操作数,它们之间用两个操作数,它们之间用;NEG、INC等指令等指令只需要一个操作数;而只需要一个操作数;而CLC等指令就不需要操作数,因等指令就不需要操作数,因为操作数已隐含在指令助记符中了。为操作数已隐含在指令助记符中了。 操作数可以是操作数可以是,也可以是,也可以是,所,所以可以作为操作数的有:以可以作为操作数的有:。 常量是指令中的固定值,它们在程序运行常量是指令中的固定值,它们在程序运行期间不发生

9、变化,它可以分为期间不发生变化,它可以分为和和。立即数寻址时的立即数;立即数寻址时的立即数;直接寻址时的地址;直接寻址时的地址;ASCII码字符串码字符串 源程序中,数值常量可以用源程序中,数值常量可以用来表示,但要用不同来表示,但要用不同的后缀加以区别。要注意的是,的后缀加以区别。要注意的是,汇编语言要求数汇编语言要求数值常量的第一位必须是数字,如:值常量的第一位必须是数字,如:FFFFH应写成应写成0FFFFH,否则汇编时会被误作为标号处理。,否则汇编时会被误作为标号处理。 存放在存放在或或中的数据。寄存器中的数据。寄存器有固定的名字,如:有固定的名字,如:AL、AX等;存储器常以其地址等

10、;存储器常以其地址或地址表达式的形式出现。应该指出,变量也有或地址表达式的形式出现。应该指出,变量也有三个属性。三个属性。 操作数最常见的形式,其值由操作数最常见的形式,其值由通过运算符连接,通过运算符连接,在在计算确定计算确定。汇编语言中运算符分为:算术运算符、逻辑运算符、汇编语言中运算符分为:算术运算符、逻辑运算符、关系运算符、分析运算符和属性修改运算符等。关系运算符、分析运算符和属性修改运算符等。 :常用的算术运算符有:加(:常用的算术运算符有:加(+)、)、减(减(-)、乘()、乘()、除()、除(/)和模()和模(MOD)等,算)等,算术运算的术运算的结果是一个结果是一个,对于表示存

11、储器地址的,对于表示存储器地址的地址表达式加和减运算才有意义。例如:地址表达式加和减运算才有意义。例如: MOV AX,VARX+2 表示将表示将VARX表示的地址加表示的地址加2后后送送AX。 :逻辑运算符包括:逻辑运算符包括:AND(逻辑(逻辑“与与”)、)、OR(逻辑(逻辑“或或”)、)、XOR(逻辑(逻辑“异或异或”)、)、NOT(逻辑(逻辑“非非”),用于数值表达式中对数值进行),用于数值表达式中对数值进行按按位逻辑运算位逻辑运算,结果也是一个数值。,结果也是一个数值。MOV AL,0FH AND 35H将将0FH与与35H按位逻辑按位逻辑“与与”后得到的数值(后得到的数值(05H)

12、送送AL。 【注意注意】逻辑运算符逻辑运算符ANDAND、OROR、XORXOR、NOTNOT同时也是指令助记同时也是指令助记符,符,;作为指令助记符;作为指令助记符时是在时是在用作计算的。用作计算的。 AND AX,VARTB AND 8000H1.1.在汇编时计算在汇编时计算VARTB AND 8000HVARTB AND 8000H,得到的数值作为程序的一个操,得到的数值作为程序的一个操作数;作数;2.2.执行程序时计算第一个执行程序时计算第一个ANDAND,将前面得到的操作数与,将前面得到的操作数与AXAX内的数据内的数据进行进行“与与”运算,结果送运算,结果送AXAX。 :、。关系运

13、算符必须有关系运算符必须有,而且,而且必须是两个数必须是两个数值值或是或是。关系运算符只能有。关系运算符只能有两个结果两个结果“0”或或“1”,关系成立时运算结果为,关系成立时运算结果为0FFFFH,关系不成立时运算结果为关系不成立时运算结果为0。要注意的是,关系运算符。要注意的是,关系运算符一般不单独使用,常与其他运算符结合起来使用。一般不单独使用,常与其他运算符结合起来使用。MOV AX, 4 NE 3 表示将表示将4和和3进行是否不相等的判断,结果送进行是否不相等的判断,结果送AX。这里由于这里由于4不等于不等于3,所以该关系运算结果应为,所以该关系运算结果应为0FFFFH,并送寄存器并

14、送寄存器AX。 :OFFSET、SEG、TYPE、SIZE和和LENGTH【作用作用】求存储单元的求存储单元的或或。 1)OFFSET 表示取标号或变量地址的偏移量,例如:表示取标号或变量地址的偏移量,例如:MOV DX, OFFSET STRING 表示将表示将STRING的偏移地址送的偏移地址送DX寄存器,属于立即数寄存器,属于立即数寻址方式。寻址方式。 2)SEG 表示取标号或变量的段地址。例如:表示取标号或变量的段地址。例如: MOV BX, SEG TABLE1 表示将表示将TABLE1的段地址送的段地址送BX寄存器。寄存器。 3)TYPE 运算结果是一个数值,表示存储单元操作数运算

15、结果是一个数值,表示存储单元操作数的类型。运算结果与操作数类型的对应关系见下表。的类型。运算结果与操作数类型的对应关系见下表。 例如:例如: VAR DW 1234H ARRAY DB 56H MOV AX,TYPE VAR MOV BX,TYPE ARRAY前两句伪指令定义了变量前两句伪指令定义了变量VAR的类型为字,变量的类型为字,变量ARRAY的类型为字节,后两句将的类型为字节,后两句将VAR、ARRAY的类的类型对应数值送寄存器型对应数值送寄存器AX、BX,即执行,即执行TYPE后后AX的的值应为值应为2,BX的值应为的值应为1。表表51 TYPE运算结果与操作数类型的对应关系运算结果

16、与操作数类型的对应关系TYPETYPE运算结果运算结果 操作数类型操作数类型 TYPETYPE运算结果运算结果 操作数类型操作数类型1 1BYTE ( DB )BYTE ( DB )-1-1NEARNEAR2 2WORD( DW )WORD( DW )-2-2FARFAR4 4DWORD( DD )DWORD( DD ) 4) LENGTH 一般加在数组变量的前面一般加在数组变量的前面 【作用作用】计算数组变量占存储单元的个数。若使用计算数组变量占存储单元的个数。若使用DUP,则执行结果是外层则执行结果是外层DUP的给定值;的给定值;若没有使用若没有使用DUP,则执行结果为则执行结果为1。 D

17、1 DB 10 DUP ( 0FH ) D2 DB ABCDEFGHIJK MOV BH,LENGTH D1 MOV BL,LENGTH D2 前两句伪指令定义变量前两句伪指令定义变量D1、D2的类型为字节,重复操的类型为字节,重复操作符作符DUP表示从表示从D1开始连续设定开始连续设定10个字节的空间,且将内个字节的空间,且将内容设定为容设定为0FH。后两句执行了。后两句执行了LENGTH运算后,结果分别运算后,结果分别为为10和和1,即执行,即执行LENGTH后将后将10送送BH,将将1送送BL。(5)SIZE格式:格式:SIZE variable汇编程序回送分配给该变量的字节数。值是汇编

18、程序回送分配给该变量的字节数。值是LENGTH值和值和TYPE值的乘积。值的乘积。例:例:FEES DW 100 DUP(0) ;分配给分配给FEES 100个单元个单元MOV CX,SIZE FEES汇编程序汇编程序将使其形成为将使其形成为 : MOV CX,200 :PTR、THIS和和SHORT【作用作用】指定或修改指定或修改变量变量、标号标号和和存储器操作数存储器操作数的类型的类型属性,也称综合运算符。属性,也称综合运算符。 1)PTR 用于指定或修改存储单元操作数的类型。用于指定或修改存储单元操作数的类型。 MOV WORD PTR 5000H, 8 执行执行PTR后指定存储单元后指

19、定存储单元5000H为一个字单元,上面为一个字单元,上面的语句是将数值的语句是将数值8送地址为送地址为5000H的存储单元,存储单元类的存储单元,存储单元类型为字,因此执行语句后,型为字,因此执行语句后,5000H存储单元的内容为存储单元的内容为08H,5001H存储单元的内容为存储单元的内容为00H。注意,。注意,。 2)THIS 也是用来也是用来指定或修改存储单元的类型指定或修改存储单元的类型。 【作用作用】与与PTR不同的是,该运算建立指定类型的不同的是,该运算建立指定类型的地址操作数地址操作数,其段地址和偏移量与下一个存储单元,其段地址和偏移量与下一个存储单元地址相同,因此地址相同,因

20、此THIS运算符更具有灵活性。运算符更具有灵活性。 BEGIN EQU THIS FAR PUSH AX 上述语句是使上述语句是使PUSH AX指令有一个具备指令有一个具备FAR属性的属性的地址地址BEGIN,使得标号,使得标号BEGIN可以被其他段的可以被其他段的JMP指令指令直接调用。直接调用。 3)SHORT 用于指定某个标号的类型为用于指定某个标号的类型为“短标号短标号”, : 1)冒号)冒号 一般跟在段寄存器名之后,用于给存储单元一般跟在段寄存器名之后,用于给存储单元操作数指定段属性,不必考虑存储单元原来的隐含属性。操作数指定段属性,不必考虑存储单元原来的隐含属性。MOV AX,ES

21、: DI 冒号跟在段寄存器冒号跟在段寄存器ES之后,表示段寄存器的偏移地址由之后,表示段寄存器的偏移地址由DI指定。指定。 2)字节分离运算符)字节分离运算符LOW和和HIGH 用于获得一个数值或表用于获得一个数值或表达式的低位或高位字节。例如:达式的低位或高位字节。例如: DATAX EQU 1234H MOV AL, LOW DATAX MOV AH, HIGH DATAX 上述程序中,第一句定义上述程序中,第一句定义DATAX等于等于1234H;第二句执行第二句执行LOW表表示取示取DATAX的低位,即将的低位,即将34H送送AL;第三句执行第三句执行HIGH表示取表示取DATAX的的高

22、位,即将高位,即将12H送送AH。 需要注意的是:需要注意的是:在表达式中可能出现各种运算的运在表达式中可能出现各种运算的运算符,算符,汇编时汇编时都将运算出它们的具体的结果都将运算出它们的具体的结果,汇编程,汇编程序的这个运算过程将按照它们的优先级别进行运算,序的这个运算过程将按照它们的优先级别进行运算,运算规则是:运算规则是: 各种运算符的优先级别见下表,为各种运算符的优先级别见下表,为1的优先级别最的优先级别最高,为高,为11的优先级别最低。的优先级别最低。优先级别优先级别 运算符运算符优先级别优先级别 运算符运算符 1 1LENGTH, SIZE, ( ), LENGTH, SIZE,

23、 ( ), 7 7EQ, NE, LT, LE, GT, GEEQ, NE, LT, LE, GT, GE2 2: :8 8NOTNOT3 3PTR, OFFSET, SEG, TYPE, THISPTR, OFFSET, SEG, TYPE, THIS9 9ANDAND4 4HIGH, LOWHIGH, LOW1010OR, XOROR, XOR5 5* *, /, MOD, SHL, SHR, /, MOD, SHL, SHR1111SHORTSHORT6 6+, -+, -表表52 运算符的优先级别运算符的优先级别 注释也是一个任选项,跟在汇编语句之后,以分注释也是一个任选项,跟在汇编语

24、句之后,以分号号“;”开始,注释内容并不出现在汇编后的机器代码开始,注释内容并不出现在汇编后的机器代码中,也不影响汇编程序的功能。一段完整的程序中,中,也不影响汇编程序的功能。一段完整的程序中,注释是很重要的部分,它用于说明一条指令或一段程注释是很重要的部分,它用于说明一条指令或一段程序的功能,阐述程序的思路,使程序容易阅读,特别序的功能,阐述程序的思路,使程序容易阅读,特别在模块化程序设计中可通过注释将各模块的功能描述在模块化程序设计中可通过注释将各模块的功能描述出来,大大加强了程序的可读性。出来,大大加强了程序的可读性。4、注释、注释u 汇编语言源程序采用汇编语言源程序采用。 一个汇编语言

25、源程序由一个汇编语言源程序由组成;组成; 每个逻辑段以每个逻辑段以SEGMENT语句开始,以语句开始,以ENDS语句结束;语句结束;。u 逻辑段包括逻辑段包括数据段数据段、堆栈段堆栈段、代码段代码段及及附加段附加段。 要注意任何一个源程序要注意任何一个源程序至少必须有一个代码段至少必须有一个代码段和和一条一条作为源程序文件结束的伪指令作为源程序文件结束的伪指令END; END后面的标号后面的标号START表示该程序执行时的启动地址。表示该程序执行时的启动地址。5.2 5.2 汇编语言程序结构汇编语言程序结构5.2.1 源程序源程序 DATA SEGMENT ;定义一个名字为定义一个名字为DAT

26、A的段的段 HELLO DB HELLO WORLD1$ ;在在 DATA 段内定义一个字符串变量,并赋值段内定义一个字符串变量,并赋值 DATA ENDS ;DATA段结束段结束 CODE SEGMENT ;定义一个名字为定义一个名字为 CODE的程序代码段的程序代码段 ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX ;给给DS赋初值赋初值 MOV DX,OFFSET HELLO ;取字符串取字符串 变量的偏移量变量的偏移量 MOV AH,9 ;置字符串显示功能号置字符串显示功能号 INT 21H ;DOS功能调用功能调用 MOV DL,

27、ODH ;送回车符送回车符 MOV AH,2 ;置置ASCII码显示功能号码显示功能号 INT 21H MOV DL,OAH ;送换行符送换行符 MOV AH,2 INT 21H MOV AH,4CH INT 21H ;返回操作系统返回操作系统 CODE ENDS ;代码段结束代码段结束 END START ;源程序结束源程序结束 从上面的汇编语言源程序可以看出,一个汇编语言源从上面的汇编语言源程序可以看出,一个汇编语言源程序一般总由若干段组成,这里第一段为数据段程序一般总由若干段组成,这里第一段为数据段DATA,它在存储器中存放用于显示输出的数据;第二段为代码段它在存储器中存放用于显示输出的

28、数据;第二段为代码段CODE,它包括了许多以符号表示的指令,用于实现数据,它包括了许多以符号表示的指令,用于实现数据的输出。的输出。p 原程序中原程序中至少有一个代码段至少有一个代码段,此时数据可放在代码段中;,此时数据可放在代码段中;p 堆栈段堆栈段如果不定义,由计算机自动分配如果不定义,由计算机自动分配。p 段名可以自己定义,用字母和数字组成。段名可以自己定义,用字母和数字组成。 计算机识别不同的段由计算机识别不同的段由段分配伪指令段分配伪指令ASSUME来完成。段分配的格式为:来完成。段分配的格式为: ASSUME CS:段名,:段名,DS:段名,:段名,SS:段名,:段名,ES:段名:

29、段名(2)本例中把程序作为过程,由本例中把程序作为过程,由DOS调用过程,过程调用由伪指令调用过程,过程调用由伪指令PROCENDP实现,过程的调用格式如下实现,过程的调用格式如下(也可省略也可省略): 过程名过程名 PROC FAR(NEAR) ;FAR表示远调用,表示远调用,NEAR表示近调用可表示近调用可 . 缺省。缺省。 过程名过程名 ENDP 程序运行时,在汇编语言源程序中除了执行上程序运行时,在汇编语言源程序中除了执行上一章中介绍的指令外,还要执行一章中介绍的指令外,还要执行和和。伪指令又称伪操作,汇编程序对源程序伪指令又称伪操作,汇编程序对源程序汇编时汇编时执行;执行;伪指令本身

30、伪指令本身,仅是告诉汇,仅是告诉汇编程序有关源程序的某些信息,或用来说明内存单元的用编程序有关源程序的某些信息,或用来说明内存单元的用途,即伪指令在汇编过程中是由途,即伪指令在汇编过程中是由执行的执行的“指令指令”;可以用来进行可以用来进行数据定义数据定义、符号定义符号定义、段定义段定义、过程定义过程定义、程序命名程序命名及及结束结束等主要操作。等主要操作。5.2.2 伪指令伪指令数据定义伪指令用于定义变量的类型、给存储器赋初数据定义伪指令用于定义变量的类型、给存储器赋初值或给变量分配存储单元。常用的数据定义伪指令有值或给变量分配存储单元。常用的数据定义伪指令有DB、DW、DD等。一般格式为:

31、等。一般格式为: 标号标号 伪指令助记符伪指令助记符 数据表达式数据表达式 方括号中的标号为任选项,通常使用方括号中的标号为任选项,通常使用表示。表示。数据表达式可以包含多个数据,它们之间用逗号分隔开。数据表达式可以包含多个数据,它们之间用逗号分隔开。1. DB 定义变量类型为字节(定义变量类型为字节(BYTE),),每个操作数占一个每个操作数占一个字节单元。字节单元。2. DW 定义变量类型为字(定义变量类型为字(WORD),),每个操作数占一个每个操作数占一个字单元,即两个字节单元。在内存中,低字节在前,高字字单元,即两个字节单元。在内存中,低字节在前,高字节在后。节在后。3. DD 定义

32、变量类型为双字(定义变量类型为双字(DWORD),),每个操作数占两每个操作数占两个字单元,即四个字节单元。在内存中,低位字在前,高个字单元,即四个字节单元。在内存中,低位字在前,高位字在后。位字在后。1、数据定义伪指令、数据定义伪指令数据定义伪操作可以把数据项数据定义伪操作可以把数据项存入指定的存储单元存入指定的存储单元,或,或分配存储单元空间分配存储单元空间。如:。如: R1 DB 0DH;定义定义R1单元的数值为单元的数值为0DH R2 DB ? ;定义定义R2单元单元预留一个字节预留一个字节的存储空间的存储空间 R3 DB 1,2,3 ;定义定义R3开始的开始的3个单元的数值为个单元的

33、数值为 01H,02H,03H R4 DW 5 DUP (?) ;定义定义R4预留预留5个字的存储空间个字的存储空间 R5 DB GOOD! ;定义定义R5为字符串,其存储单元为字符串,其存储单元 数值为数值为47H,4FH,4FH,44H, ;21H 上例说明,数据表达式除了可以是二进制、十进制、十上例说明,数据表达式除了可以是二进制、十进制、十六进制的常数,也可以是表达式及字符串,还可以是六进制的常数,也可以是表达式及字符串,还可以是问号问号“?”,它仅给变量保留相应的存储单元,而不给变量赋初,它仅给变量保留相应的存储单元,而不给变量赋初值。当相同的操作数重复出现或要保留多个存储单元时,可

34、值。当相同的操作数重复出现或要保留多个存储单元时,可用重复操作符号用重复操作符号DUP表示,重复次数由表示,重复次数由DUP之前的数字决定。之前的数字决定。经过汇编伪指令,数据在存储单元中的分配如图经过汇编伪指令,数据在存储单元中的分配如图5-1所示。所示。R1 ODHR2 R3 01H 02H 03H R4R5 47H4FH4FH44H21H保留保留5个个字的存储字的存储空间,即空间,即10个字节个字节图图5-1 伪指令执行后数据区的分配情况伪指令执行后数据区的分配情况 由上图可见,存储单元中的数据均由补由上图可见,存储单元中的数据均由补码表示;对于多字节的数据分配,高字节存码表示;对于多字

35、节的数据分配,高字节存放在高地址单元,低字节存放在低地址单元;放在高地址单元,低字节存放在低地址单元;对于字符串存储单元存放的是相应的对于字符串存储单元存放的是相应的ASCII码;对于变量或标号存储单元存放的是相应码;对于变量或标号存储单元存放的是相应的地址偏移量。的地址偏移量。 另外,在伪指令中还可以对重复子句进另外,在伪指令中还可以对重复子句进行嵌套。行嵌套。BUFFER DB 2,2 DUP (1,2 DUP (2,3) 该伪指令汇编后的数据分配情况如图所该伪指令汇编后的数据分配情况如图所示。示。03H BUFFER 02H01H02H03H02H01H02H03H02H03H伪指令执行

36、后伪指令执行后数据区的分配情况数据区的分配情况 符号指符号指、和和,符号定义伪指令用于给一个符号重新命名或定义新的类,符号定义伪指令用于给一个符号重新命名或定义新的类型属性。型属性。 (1)将表达式的值赋予一个名字,将表达式的值赋予一个名字,等值语句等值语句。可用这个名字来可用这个名字来代替代替对应的表达式。表达式可以是一对应的表达式。表达式可以是一个常数、符号、数值、表达式或地址表达式,个常数、符号、数值、表达式或地址表达式,EQU伪指令的伪指令的格式如下:格式如下: 名字名字 EQU 表达式表达式2、符号定义伪指令、符号定义伪指令 EQU伪指令可伪指令可。如果源程序中需要多次如果源程序中需

37、要多次引用某个表达式,可以用一个比较简短的名字通过引用某个表达式,可以用一个比较简短的名字通过EQU伪伪指令来代表这个表达式指令来代表这个表达式。如果将来需要修改表达式,只需修。如果将来需要修改表达式,只需修改改EQU语句中的表达式,而不必修改多处,便于程序的维语句中的表达式,而不必修改多处,便于程序的维护。护。【注意注意】。 FIVE EQU 5 ;FIVE赋值为赋值为5 NINE EQU FIVE+4 ;NINE定义为数值表达式,其定义为数值表达式,其 值为值为9 REGS EQU SI ;指定寄存器指定寄存器SI的名字为的名字为REGS ADDR EQU TABLE ;将标号将标号TAB

38、LE赋值到赋值到ADDR (2)等号()等号(=)伪指令)伪指令 等号(等号(=)伪指令的功能与)伪指令的功能与EQU伪伪 指令相仿。指令相仿。【区别区别】在于它可以对同一个名字重复定义。在于它可以对同一个名字重复定义。名字名字 = 表达式表达式 利用等号(利用等号(=)伪指令可以使程序设计更加灵活。)伪指令可以使程序设计更加灵活。 TABLE = 1 MOV AX,TABLE RRRR: ADD AX,1 TABLE = TABLE+1 MOV AX,TABLE CMP AX,100 JNE RRRR 标号标号TABLE被定义了不止一次,每循环一次它的数值都会被定义了不止一次,每循环一次它的

39、数值都会变化。变化。 段定义伪指令在汇编语言源程序中定义逻辑段,提供段定义伪指令在汇编语言源程序中定义逻辑段,提供了构造程序的手段。常用的段定义伪指令有了构造程序的手段。常用的段定义伪指令有ASSUME、SEGMENT和和ENDS等。等。 (1)SEGMENT和和ENDS 用用SEGMENT和和ENDS伪指令伪指令可以将程序分成多个段,用于定义一个逻辑段,给逻辑段可以将程序分成多个段,用于定义一个逻辑段,给逻辑段赋予一个段名,并在后面的任选项中给出这个逻辑段的其赋予一个段名,并在后面的任选项中给出这个逻辑段的其他特性,如定义类型、组合类型和类别。其伪指令格式如他特性,如定义类型、组合类型和类别

40、。其伪指令格式如下:下: 段名段名 SEGMENT 定位类型定位类型 组合类型组合类型 类别类别 (段定义体)(段定义体) 段名段名 ENDS3、段定义伪指令、段定义伪指令 SEGMENT伪指令定义一个逻辑段的开始伪指令定义一个逻辑段的开始; ENDS伪指令则表示一个逻辑段的结束,这两个伪指令总是伪指令则表示一个逻辑段的结束,这两个伪指令总是成对出现。成对出现。前面的段名是该逻辑段的标识符,用来确定该逻辑段前面的段名是该逻辑段的标识符,用来确定该逻辑段在在存储器中的首地址存储器中的首地址,不可缺省,而且必须一致。,不可缺省,而且必须一致。两个伪指令语句之间的部分是逻辑段的内容,两个伪指令语句之

41、间的部分是逻辑段的内容,汇编语言汇编语言的逻辑段包括的逻辑段包括代码段代码段、数据段数据段和和堆栈段堆栈段等等。 代码段主要包含程序指令和某些伪指令;代码段主要包含程序指令和某些伪指令; 数据段用于定义数据和存储单元;数据段用于定义数据和存储单元; 堆栈段主要为堆栈操作预留出存储空间。堆栈段主要为堆栈操作预留出存储空间。 SEGMENT伪指令后面可以有三个任选项伪指令后面可以有三个任选项 “定位类型定位类型”、“组合组合类型类型”、“类别类别”,它们用来指示汇编程序和连接程序,如何确定段的,它们用来指示汇编程序和连接程序,如何确定段的边界,如何进行段的组合,以及控制段的装入顺序。在简单汇编语言

42、源边界,如何进行段的组合,以及控制段的装入顺序。在简单汇编语言源程序中一般选用缺省方式,常用于多模块的程序设计中。如果出现,三程序中一般选用缺省方式,常用于多模块的程序设计中。如果出现,三者的顺序必须符合格式中的规定,不能颠倒。者的顺序必须符合格式中的规定,不能颠倒。 1)定位类型定位类型:定位类型任选项是告诉汇编程序如何确定逻:定位类型任选项是告诉汇编程序如何确定逻辑段的边界在存储器中的开始位置,定位类型有四种:辑段的边界在存储器中的开始位置,定位类型有四种: BYTE:表示逻辑段边界可以从表示逻辑段边界可以从任何一个字节任何一个字节开始,段与段之开始,段与段之间无空隙。这样,该逻辑段可以紧

43、接在前一个逻辑段的后面。间无空隙。这样,该逻辑段可以紧接在前一个逻辑段的后面。 WORD:表示逻辑段边界从表示逻辑段边界从字地址字地址开始,段与段之间的空隙开始,段与段之间的空隙最多只有一个字节。这样该逻辑段的起始地址必须是最多只有一个字节。这样该逻辑段的起始地址必须是偶数偶数。 PARA:表示逻辑段边界从表示逻辑段边界从节地址节地址开始,开始,1616个字节称为一个个字节称为一个节。段地址为节。段地址为1616的倍数,即的倍数,即XXX0HXXX0H,这样段与段之间空隙最多为,这样段与段之间空隙最多为1515个字节。如果省略定位类型选项,个字节。如果省略定位类型选项,汇编语言程序默认该逻辑汇

44、编语言程序默认该逻辑段为段为PARAPARA。 PAGE:表示逻辑段边界地址从页边界开始。表示逻辑段边界地址从页边界开始。256256个字节成为个字节成为一个页,则段地址为一个页,则段地址为256256的倍数,即的倍数,即XX00HXX00H,这样段与段之间空,这样段与段之间空隙最多为隙最多为255255个字节。个字节。 2)组合类型组合类型:SEGMENT伪指令的第二个任选项是组合伪指令的第二个任选项是组合类型,在满足定位类型的前提下,它告诉连接程序,装入存类型,在满足定位类型的前提下,它告诉连接程序,装入存储器时各个逻辑段如何进行组合。组合类型有储器时各个逻辑段如何进行组合。组合类型有6种

45、。种。 NONE:此项为不组合,是此项为不组合,是组合类型的缺省选择组合类型的缺省选择,此时连接,此时连接程序认为这个逻辑段是不组合的,即使两个段有相同的类别名,程序认为这个逻辑段是不组合的,即使两个段有相同的类别名,也作为不同的逻辑段分别装入内存。也作为不同的逻辑段分别装入内存。 PUBLIC:汇编程序连接时,对于不同程序模块中的逻辑段,汇编程序连接时,对于不同程序模块中的逻辑段,只要具有相同的类别名,就把这些段顺序连接成一个逻辑段装只要具有相同的类别名,就把这些段顺序连接成一个逻辑段装入内存,共用一个寄存器,所有段的偏移地址都要变为相应组入内存,共用一个寄存器,所有段的偏移地址都要变为相应

46、组合段的偏移量。合段的偏移量。 STACK:表示该段为堆栈段的一部分,此时编译程序把所表示该段为堆栈段的一部分,此时编译程序把所有同名段连接成一个连续的堆栈段,装入有同名段连接成一个连续的堆栈段,装入SSSS段寄存器,用段内段寄存器,用段内的最大偏移地址初始化的最大偏移地址初始化SPSP。 COMMON:该组合类型产生一个该组合类型产生一个覆盖段覆盖段。模块连接时,如。模块连接时,如果有相同的类别名,则都从同一个地址开始装入,因而连接的果有相同的类别名,则都从同一个地址开始装入,因而连接的逻辑段将发生覆盖。连接以后段的长度等于原来最长的路段的逻辑段将发生覆盖。连接以后段的长度等于原来最长的路段

47、的长度,覆盖部分的内容是最后一个逻辑段的内容。长度,覆盖部分的内容是最后一个逻辑段的内容。 MEMORY:表示该段在存储器中应定位在所有其他段的最表示该段在存储器中应定位在所有其他段的最高地址处。如果有多个段使用高地址处。如果有多个段使用MEMORYMEMORY,则只把第一个遇到的段,则只把第一个遇到的段当作当作MEMORYMEMORY处理,其余的段均按处理,其余的段均按PUBLICPUBLIC处理。处理。 AT:表示该段定位在表达式所指示的位置上。表示该段定位在表达式所指示的位置上。 3)类别名类别名:类别名必须用单引号括起来,用于控制段的:类别名必须用单引号括起来,用于控制段的装入顺序。类

48、别名可由程序设计人员自己选定任何字符串组装入顺序。类别名可由程序设计人员自己选定任何字符串组成,但它不能再作为程序的标号,变量名或其他定义的符号。成,但它不能再作为程序的标号,变量名或其他定义的符号。在连接处理时,在连接处理时,LINK程序把类别名相同的所有段存放在连程序把类别名相同的所有段存放在连续的存储区内。续的存储区内。 下面就是一个分段结构的源程序框架:下面就是一个分段结构的源程序框架: STACK1 SEGMENT PARA STACK STACK1 ; 定定 义堆栈段义堆栈段1 STACK1 ENDS DATA1 SEGMENT PARA DATA1 ;定义数据段定义数据段1 DA

49、TA1 ENDS STACK2 SEGMENT PARA STACK2 ;定义堆栈段定义堆栈段2 STACK2 ENDS DATA2 SEGMENT PARA DATA2 ;定义数据段定义数据段2 DATA2 ENDS CODE SEGMENT PARA MEMORY ;定义代码段定义代码段 ASSUME CS: CODE, DS: DATA1, SS: STACK1 ; 指定段寄存器指定段寄存器 BEGIN: CODE ENDS END START (2)ASSUME 指示汇编程序指定指示汇编程序指定段所使用的寄存器段所使用的寄存器,即将段寄存器与某个逻辑段建立起对应关系,该伪指令不即将段寄

50、存器与某个逻辑段建立起对应关系,该伪指令不产生任何目标代码。其格式如下:产生任何目标代码。其格式如下: ASSUME 段寄存器名:段名段寄存器名:段名,段寄存器名:段名,段寄存器名:段名 其中其中段寄存器名段寄存器名是指四个段寄存器是指四个段寄存器CSCS、SSSS、DSDS、ESES中中的一个,但要注意,程序代码段只能用的一个,但要注意,程序代码段只能用CSCS作寄存器,堆栈作寄存器,堆栈段只能用段只能用SSSS作段寄存器。段名是指逻辑段的名字。在一个作段寄存器。段名是指逻辑段的名字。在一个源程序中,如果没有另外的源程序中,如果没有另外的ASSUMEASSUME伪指令重新设置,原有伪指令重新

51、设置,原有的的ASSUMEASSUME语句的设置一直有效。语句的设置一直有效。 需要注意的是,需要注意的是,ASSUME伪指令只是告诉汇编程序伪指令只是告诉汇编程序段段寄存器寄存器与与逻辑段逻辑段的关系,并没有给段寄存器赋予实际的初的关系,并没有给段寄存器赋予实际的初值。若要给段寄存器赋值,可参考下面程序:值。若要给段寄存器赋值,可参考下面程序: CODE SEGMENT ;定义代码段定义代码段 ASSUME CS: CODE, DS: DATA1, SS: STACK1 ;指定段寄存器指定段寄存器 MOV AX, DATA1 MOV DS, AX ;初始化段寄存器初始化段寄存器DS MOV

52、AX, STACK1 MOV SS, AX ;初始化堆栈段寄存器初始化堆栈段寄存器SS CODE ENDS 过程又称过程又称子程序子程序,程序的一部分,可以被调用,当过程中,程序的一部分,可以被调用,当过程中的指令执行完后,返回程序调用点,调用过程的指令是的指令执行完后,返回程序调用点,调用过程的指令是CALL,从过程返回的指令为从过程返回的指令为RET。程序设计中,我们常常把具有一定。程序设计中,我们常常把具有一定功能的程序段设计成一个子程序,汇编程序用功能的程序段设计成一个子程序,汇编程序用“过程过程”来构造来构造子程序。过程定义伪指令的格式如下:子程序。过程定义伪指令的格式如下: 过程名

53、过程名 PROC NEAR/FAR ;NEAR与与FAR只选只选 一个,或缺省一个,或缺省 (过程体)(过程体) 过程名过程名 ENDP 其中,过程名不能省略,过程名也就是其中,过程名不能省略,过程名也就是子程序的程序名子程序的程序名,可以通过可以通过CALLCALL指令调用,它类同于一个标号的作用,具有三个指令调用,它类同于一个标号的作用,具有三个属性:段、偏移量和类型。类型可以选择属性:段、偏移量和类型。类型可以选择NEARNEAR或或FARFAR,如果没有,如果没有选择距离类型,则选择距离类型,则默认为默认为NEARNEAR。用。用PROCPROC表示过程的开始,表示过程的开始,ENDP

54、ENDP表示过程的结束,它们应成对出现,并使用同一个过程名。一表示过程的结束,它们应成对出现,并使用同一个过程名。一个过程应该写在某一个逻辑段内。个过程应该写在某一个逻辑段内。4、过程定义伪指令、过程定义伪指令 CODE SEGMENT ASSUME CS: CODE DISCH PROC NEAR ;定义一个过程(段内调定义一个过程(段内调 用属性)用属性) MOV AH, 2 INT 21H DISCH ENDP ;过程结束过程结束 START: MOV DL, 30H CALL DISCH ;调用过程(属段内调用)调用过程(属段内调用) MOV DL, A CALL DISCH ;调用过

55、程(属段内调用)调用过程(属段内调用) MOV AH, 4CH INT 21H ;返回到返回到DOS CODE ENDS END START 注意,若过程调用为段间调用时,则在调用过程时要将注意,若过程调用为段间调用时,则在调用过程时要将返回地址的返回地址的段地址段地址和和偏移量偏移量都压入堆栈。都压入堆栈。 ORG 【格式格式】 ORG 表达式表达式 它表示把表达式的值赋给它表示把表达式的值赋给。数值范围在065 535之间5、定位伪指令、定位伪指令ORG和当前位置计数器和当前位置计数器$汇编语言源程序中若没有汇编语言源程序中若没有ORG伪指令,则程序执行时,指令伪指令,则程序执行时,指令代

56、码被放到自由内存空间的代码被放到自由内存空间的CS:0处;若有处;若有ORG伪指令,编伪指令,编译器则把其后的指令代码放到译器则把其后的指令代码放到ORG伪指令指定的偏移地址。伪指令指定的偏移地址。两个两个ORG伪指令之间,除了指伪指令之间,除了指令代码,若有自由空间,则用令代码,若有自由空间,则用0填充。填充。 在一个源程序中往往包含多个段。汇编程序在在一个源程序中往往包含多个段。汇编程序在将该源程序翻译成目标程序时,每遇到一个新的段将该源程序翻译成目标程序时,每遇到一个新的段,就为该段分配一个初置为,就为该段分配一个初置为0的汇编地址计数器,的汇编地址计数器,然后,再对该段中然后,再对该段

57、中 的语句汇编。在汇编过程中,的语句汇编。在汇编过程中,对凡是需要申请分配存储单元的语句和产生目标代对凡是需要申请分配存储单元的语句和产生目标代码的语句,汇编地址计数器则按该语句目标代码的码的语句,汇编地址计数器则按该语句目标代码的长度增值。因此,段内定义的所有标号和变量的偏长度增值。因此,段内定义的所有标号和变量的偏移地址就是翻译该语句时当前汇编地址计数器移地址就是翻译该语句时当前汇编地址计数器$的的值。值。DATA SEGEMENT BUF DB 12345ABCDCOUNT EQU $-BUF;COUNT的值就是的值就是BUF数据区所占字节数数据区所占字节数DATA ENDS汇编地址计数

58、器的值可以用伪指令汇编地址计数器的值可以用伪指令ORG设置。设置。ORG 数值表达式数值表达式将汇编地址计数器设置成数值表达式的值。其中,数值表达式的值应为非负整数,其值可在将汇编地址计数器设置成数值表达式的值。其中,数值表达式的值应为非负整数,其值可在065535之间之间或或04G之间。之间。DATA SEGMENT USE16ORG 10;设置设置$为为10,此段目标代码从偏移地址,此段目标代码从偏移地址10处开始产生,即空出处开始产生,即空出10个字节的空间个字节的空间BUF DB ABCD;BUF偏移地址为偏移地址为10 ORG $+5;$增增5,即空出,即空出5个字节的空间个字节的空

59、间NUM DW 50;NUM的偏移地址为的偏移地址为19DATA ENDS.;内存:内存:_,_,_,_,_,_,_,_,_,_,A,B,C,D,_,_,_,_,_,50;A偏移地址为偏移地址为10,50为为19【作用作用】给程序设置一个标题。给程序设置一个标题。【用法用法】列表文件中每一页的第一行都会显示这个标题,它列表文件中每一页的第一行都会显示这个标题,它是用户任意选定的字符串,但是字符的个数不能超过是用户任意选定的字符串,但是字符的个数不能超过6060,用用ENDEND标识源程序模块的结束,其后可跟程序启动标号或过标识源程序模块的结束,其后可跟程序启动标号或过程名,用于指明程序的启动地

60、址,系统根据这个地址初始程名,用于指明程序的启动地址,系统根据这个地址初始化化CSCS。其格式为:。其格式为: TITLE 字符串字符串 NAME END 启动标号启动标号6、标题伪指令、标题伪指令TITLE 告诉汇编程序任务到此结束,其后可跟程序启动标号告诉汇编程序任务到此结束,其后可跟程序启动标号或过程名,用于指明程序执行时第一条指令的地址。其格或过程名,用于指明程序执行时第一条指令的地址。其格式为:式为: END 表达式表达式7、源程序结束伪指令、源程序结束伪指令 子程序由子程序由CALLCALL指令调用,由指令调用,由RETRET指令返回,汇编以后指令返回,汇编以后子程序子程序的机器码

温馨提示

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

评论

0/150

提交评论