汇编语言程序设计第五章.ppt_第1页
汇编语言程序设计第五章.ppt_第2页
汇编语言程序设计第五章.ppt_第3页
汇编语言程序设计第五章.ppt_第4页
汇编语言程序设计第五章.ppt_第5页
已阅读5页,还剩90页未读 继续免费阅读

下载本文档

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

文档简介

1、汇编语言程序设计 -朱耀庭,南开大学 朱耀庭,第5章 汇编语言程序设计基础,汇编语言源程序由汇编语句组成,这些语句不仅包括由汇编指令构成的指令语句,还包括变量定义说明语句,以及各种伪指令语句。 每一种语言都有一定的格式要求,汇编语言对源程序也有严格的格式要求。只有源程序格式书写正确,汇编程序才能将其汇编、连接形成机器指令程序。 本章是汇编语言程序设计的基础,首先介绍源程序的两种书写格式,然后介绍组成汇编语言源程序的语句。,南开大学 朱耀庭,第5章 汇编语言程序设计基础,5.5 指令简介,5.4 汇编语言程序正常结束的方式,5.3 汇编语言的数据组织及其访问,5.2 汇编语言的语句,5.1 源程

2、序的书写格式,南开大学 朱耀庭,5.1 源程序的书写格式,汇编语言对源程序有严格的格式要求,格式正确汇编程序才能准确地翻译源程序,形成等价的机器指令。 汇编语言程序格式就是汇编语言必须遵守的语法规则,它有两种书写形式: 一种称为简化段定义 一种称为完整段定义,南开大学 朱耀庭,5.1 源程序的书写格式,简化段定义格式,完整段定义格式,5.1.1,5.1.2,南开大学 朱耀庭,5.1.1 简化段定义格式,南开大学 朱耀庭,1. 简化段定义格式的汇编程序框架,一个简化段定义格式的汇编程序框架如下: TITLE COMMENT *这是一个简化段定义框架实例,说明如何用简化段定义编写汇编程序* .MO

3、DEL SMALL ;定义程序的存储模式 .STACK nH ;定义堆栈段,其中n为以字节为单位的栈长 ;需要写具体值,如10个字的堆栈,n应该写为14H .DATA ;定义数据段 . ;定义数据 .CODE ;定义代码段 START: MOV AX,DATA MOV DS,AX ;装填数据段寄存器 . ;程序代码 MOV AX,4C00H INT 21H ;程序结束点,返回DOS . ;子程序代码 END START ;汇编结束,程序起始点为标号START处,南开大学 朱耀庭,2. 简化段定义伪指令,简化段定义伪指令在说明一个新段即将开始的同时,也说明了上一个段的结束。 (1)TITLE 置

4、标题伪指令 格式:TITLE 在TITLE后第一个非空字符之后的字符串就是程序的标题,标题只出现在程序清单文件中,以提高程序的清晰度,该指令在程序中并不是必需的。除TITLE外,还有PAGE等涉及源程序清单格式的一些伪指令,这里就不一一介绍。,南开大学 朱耀庭,2. 简化段定义伪指令,(2).MODEL 内存模式伪指令 格式:.MODEL MODEL伪指令用来指定该汇编程序所使用的内存模式,内存模式说明了程序中的数据及代码的缺省长度,且使用简化段定义的程序必须用MODEL指出内存模式。各种内存模式的含义如表5-1所示。,南开大学 朱耀庭,2. 简化段定义伪指令,表5-1 内存模式,南开大学 朱

5、耀庭,2. 简化段定义伪指令,(3).STACK定义堆栈段伪指令 格式:.STACK .STACK定义堆栈段的开始,其中,可以不写,其缺省值为1024B。 (4).DATA定义数据段伪指令 格式:.DATA .DATA定义数据段的开始,一个源程序可以有多个伪指令.DATA定义的数据段,这就好像在源程序中定义多个同段名的数据段一样。另外,还有两个很少使用的伪指令来定义数据段 .DATA? / .CONST,伪指令.DATA?说明下面是一个未初始化数据段的开始,伪指令.CONST说明下面是一个常数数据段的开始。这两条伪指令在与高级语言编写的程序相结合时为了遵守高级语言的某些约定而需要特殊说明时才使

6、用。,南开大学 朱耀庭,(5).CODE 定义代码段伪指令 格式: .CODE .CODE定义的代码段开始 (6). END 结束伪指令 格式: END END也是一条伪指令,告诉汇编程序到此结束,并通知连接程序,该程序从END后标明的开始执行。可以是程序中的标号或过程名,本框架中是标号START,代表“MOV AX,DATA”语句的偏移地址。 若代码段的第一条语句便是程序要执行的第一条语句,则END后可默认指向这一标号。,南开大学 朱耀庭,2. 简化段定义伪指令,(7)COMMENT 成片注释伪指令 格式:COMMENT * 注释 * COMMENT是一个成片注释的伪指令,从其后的第一个非空

7、字符开始是注释,直到遇到同样的非空字符结束。本框架中*就是这个注释的起始和结束符。 (8) ;的作用 程序中出现的分号;,表示注释的开始,从分号后直到换行均为用户的注释。适当的注释可增加程序的可读性,经常添加注释是一种优良的程序设计风格,也使得程序更加容易维护。简化段定义的伪指令还有几个,主要是用于与高级语言的连接,由于本书不涉及这方面的内容,故这里就不再介绍了。,南开大学 朱耀庭,2. 简化段定义伪指令,(8) ;的作用 注意:在简化段定义书写的程序中,数据段只能用.DATA来定义,而DATA是由.DATA 伪指令定义的段名,段名经过汇编、连接和操作系统装入后就是一个具体的段地址常数,因此,

8、段名是一个立即数,立即数不能够直接送至段寄存器,但可以借助通用寄存器AX来实现,因此,装填数据段寄存器应使用如下指令序列: MOV AX,DATA MOV DS,AX,南开大学 朱耀庭,3. 简化段定义格式的程序实例,例5-1简化段定义格式的程序实例一。 题目:输出字符串Hello World。 设计思路:用DOS 9号功能在显示器上输出一串字符Hello World。 源程序EX5-1.asm如下: TITLE EX5-1 COMMENT* 这是一个简化段定义程序实例* .MODEL SMALL ;定义存储器类型 .STACK 100H ;定义堆栈段 .DATA ;定义数据段 HW DB H

9、ello World,13,10,$ .CODE ;定义代码段 START: MOV AX,DATA MOV DS,AX ;装填数据段寄存器 MOV DX,OFFSET HW ;DX指向串首 MOV AH,9 ;DOS 9号功能调用 INT 21H ;显示指定字符串 MOV AH,4CH ;结束程序返回DOS功能调用 INT 21H END START ;汇编结束 显示字符串使用DOS 9号功能,该功能要求DS:DX指向字符串首。,南开大学 朱耀庭,3. 简化段定义格式的程序实例,例5-2简化段定义格式的程序实例二。 题目:程序功能同例5-1。 设计思路:用40H号功能调用在显示器上输出一串字

10、符Hello World,并用RET返回。 源程序EX5-2.asm如下: .MODEL SMALL ;定义存储器类型 .STACK 100H ;定义堆栈段 .DATA ;定义数据段 HW DB Hello World!,13,10 LH EQU $-HW .CODE ;定义代码段 MAIN PROC FAR ;使用过程,主程序开始 PUSH DS ;为程序返回DOS设置堆栈值,入栈保存原DS段址 MOV AX,0 ;设置偏移地址为0 PUSH AX ;入栈保存偏移地址 MOV AX,DATA MOV DS,AX ;装填数据段寄存器 MOV BX,1 ;BX置标准输出设备号1 MOV CX,L

11、H ;CX是输出串的长度 MOV DX,OFFSET HW ;DX指向串首 MOV AH,40H INT 21H ;显示指定的字符串 RET ;用过程返回DOS标准序 MAIN ENDP ;主程序结束 END MAIN ;汇编结束,南开大学 朱耀庭,4. 从例5-1清单文件看源程序语句的构成,汇编程序EX5-1.asm中产生清单文件EX5-1.lst。 现在我们来介绍一下清单文件。在清单文件最左边一列标出了行号,它对应源程序中的行号。行号后是浮动地址,地址后是对应数据或指令的代码。 从中可以看出,凡是伪指令都没有对应数据或代码产生,例如,15行,8行,16行。可见伪指令仅仅是程序设计者与汇编程

12、序、连接程序的某些约定,其并不生成代码。分号后面的注释同样如此。 生成数据的是数据说明语句,这里是6行、7行。 生成代码的仅仅是汇编指令语句,本例中是915行。,例5-1清单,南开大学 朱耀庭,5.1.2 完整段定义格式,完整段定义是一种标准的汇编语言书写形式 也是传统的书写形式,可使程序设计者对汇编程序实行 全面控制 它适用于所有版本的汇编语言 既适用于将要生成的EXE文件对应的源程序的格式 也适用于将要生成的COM文件对应的源程序的格式,南开大学 朱耀庭,5.1.2 完整段定义格式,南开大学 朱耀庭,1. 完整段定义格式的汇编程序框架,完整段定义格式的汇编程序框架如下: ; filenam

13、e.asm . ;用EQU定义的等价语句区(可有可无) . ;若有外部模块,用EXTRN定义外部说明 STACK SEGMENT ;定义堆栈段STACK . ;分配堆栈段的大小 STACK ENDS ;堆栈段结束 DATA SEGMENT ;定义数据段DATA . ;定义数据 DATA ENDS ;数据段结束 CODE SEGMENT CODE ;定义代码段 ASSUME CS:CODE,DS:DATA,SS:STACK ;确定CS/DS/SS指向的逻辑段 START: MOV AX,DATA MOV DS,AX ;装填数据段寄存器 . ;程序代码 MOV AX,4C00H ;结束程序,返回D

14、OS功能调用 INT 21H CODE ENDS ;代码段结束 . ;子程序代码 END START ;汇编结束,程序起始点为START,南开大学 朱耀庭,1. 完整段定义格式的汇编程序框架,任何一个源程序有至少一个逻辑代码段和一条作为源程序文件结束的伪指令END; 逻辑数据段根据程序本身功能的要求可有可无,也可以有多个; 逻辑堆栈段可有可无,也可有多个,如果没有,那么连接时将产生一个警告性的错误,这对于没有堆栈操作的用户程序来说并不是错误,但如果用户程序用到堆栈的话,则最好设置自己的逻辑堆栈段。,南开大学 朱耀庭,2. 完整段定义伪指令,(1) SEGMENT/ENDS 定义逻辑段伪指令 格

15、式: SEGMENT 定位类型组合类型寻址方式类别 ENDS 功能:为任何一个逻辑段命名,并指出以该段名命名的逻辑段的起止。 其中段名是由用户自己给出的,每一对SEGMENT/ENDS前的段名必须保持一致,通常都写成CODE、DATA、STACK等。如果用户不写段名,则汇编时将自动为其加上一个段名:?SEG。 定位类型用来指示各段起始边界的性质,如表5-2所示,可以有5种,缺省时是PARA类型。,南开大学 朱耀庭,2. 简化段定义伪指令,表5-2 段定位类型,南开大学 朱耀庭,2. 简化段定义伪指令,表5-3 段组合类型,组合类型用来描述连接时各段间的关系,有6种类型,如表5-3所示。,南开大

16、学 朱耀庭,2. 完整段定义伪指令,(1) SEGMENT/ENDS 定义逻辑段伪指令 寻址方式主要用于80386,它可以设置为USE16或USE32,分别代表16位寻址和32位寻址,当处理器是80386时,对于80386保护模式缺省为USE32,其他模式缺省为USE16。对于8086和80286,由于不具备32位寻址能力,只能是16位寻址,所以不用设置这一项。 类别,可以是任何名字,用引号括起来,连接时用于组成段组名。属于一个给定类的所有段均被安放在一个内存邻接块中,而不管其在源模块中的顺序如何。,南开大学 朱耀庭,2. 完整段定义伪指令,(2) ASSUME 定义寻址关系伪指令 格式:AS

17、SUME :, 功能:出现在代码段中可执行的汇编指令之前,用以说明相应的逻辑段应通过相应的段寄存器寻址(包括变量与标号)。因为逻辑段名由用户自己给出,编译器MASM或TASM不知道各个SEGMENT是什么段,以致不知在用DS、ES、SS、CS寻址时,相对偏移地址是在哪一个段中,所以用ASSUME伪指令来通知MASM或TASM需要寻址的段将会用什么段寄存器(CS、DS、SS、ES)来寻址,如ASSUME CS:CODE,DS:DATA,SS:STACK。,南开大学 朱耀庭,2. 完整段定义伪指令,(2) ASSUME 定义寻址关系伪指令 格式:ASSUME :, 功能:但是这绝不是对段寄存器的装

18、填,完整段定义时,段寄存器必须通过段名来装填。段名经过汇编、连接和操作系统装入后就是一个具体的段地址常数,即段名是一个立即数,应借助通用寄存器AX来实现段寄存器的装填,例如: MOV AX, DATA MOV DS, AX ;装填DS寄存器 MOV AX, DATA MOV ES, AX ;装填ES寄存器,南开大学 朱耀庭,2. 完整段定义伪指令,(2) ASSUME 定义寻址关系伪指令 格式:ASSUME :, 功能:在完整段定义中,如果程序中还定义了堆栈段STACK,也需要把段地址装入SS中,栈顶装入SP中,例如:MOV AX, STACK MOV SS, AX ; 装填SS寄存器 MOV

19、 SP,STACKTOP ; 栈顶存入SP 如果用户不定义堆栈,将会使用操作系统的堆栈,但连接时会出现警告提示,这种情况下只要程序正确,就不会引起错误。在程序中不需要用指令装入代码段的段地址,因为,在程序初始化时,装入程序已将代码段的段地址装入CS寄存器了。,南开大学 朱耀庭,2. 完整段定义伪指令,(3) END结束伪指令 格式:END 标号|过程名 功能:源程序文件到此为止,其后语句不予汇编,因此一个程序文件有且只有一个END。其后的可选项指出执行时从何处开始,它可以是一个标号或过程名。,南开大学 朱耀庭,2. 完整段定义伪指令,(4) EQU等价语句伪指令 格式: EQU 其中标识符应是

20、字母打头的字母数字串(字母包括英文字母和特殊符号?、和下横线_),长度应不大于31。表达式的特例可以是常数。 功能:以后遇此标识符则等效于表达式的值或字符串。 例如: ABC EQU 123 ;该程序的代码中ABC就是常数123 MOVE EQU MOV ;该程序的代码中MOVE AX, BX 等效于MOV AX, BX DEF EQU 2*3 ;该程序的代码中DEF就是常数6,南开大学 朱耀庭,2. 完整段定义伪指令,(5) 等号=伪指令 格式:= 功能:“=”给标识符定义一个数值。 例如: X=10 X=X+10 EQU用于给标识符定义一个数值时不能重复定义标识符,但“=”允许重复赋值。,

21、南开大学 朱耀庭,2. 完整段定义伪指令,(6) EXTRN 定义外部说明伪指令 格式:EXTRN 其中外部名说明是指本程序文件所用到的外部模块中的过程名、标号或变量名。 功能:供连接程序,遇到相应外部名时从其他模块去寻找。,南开大学 朱耀庭,2. 完整段定义伪指令,(7) GROUP 合并伪指令 格式: GROUP , 功能:将两个段合并成一个段。有时用户需要不断地访问两个数据段,且都要用DS来寻址,这就要不断地装填数据段寄存器DS,显然这是很麻烦的。一个简单的办法就是用GROUP伪指令将这两个段合并成一个段,这样两个段就可以相对于同一个段寄存器进行寻址了。这时,ASSUME语句应把DS设置

22、成指向该段组。,南开大学 朱耀庭,2. 完整段定义伪指令,(7) GROUP 合并伪指令 整个段组织如下: DataGroup GROUP Dataseg1,Dataseg2 DataSeg1 SEGMENT PARA PUBLIC DATA DataSeg1 ENDS DataSeg2 SEGMENT DATA PUBLIC DATA DataSeg2 ENDS MOV AX,DataGroup MOV DS,AX ASSUME DS:DataGroup ,南开大学 朱耀庭,2. 完整段定义伪指令,其中用 GROUP伪指令把Dataseg1和Dataseg2两个数据段设置成同一个段组Data

23、Group,并把DataGroup装填到DS中。其实,这种用法在纯汇编语言中是不常用的,更多地用于与高级语言的连接。 (8) PROC/ENDP 定义过程伪指令 格式: PROC ENDP 功能:定义过程的起始和结束。PROC和ENDP必须成对出现,详见第11章。,南开大学 朱耀庭,3. 完整段定义格式的程序实例,例5-3完整段定义格式的程序实例一 题目:程序功能同例5-1 设计思路:将例5-1 按照完整段定义格式写成汇编源程序,即用DOS 9号功能在显示器上输出一串字符Hello World的程序。请读者与例5-1对照,看看有何不同 源程序EX5-3.asm如下: DATA SEGMENT

24、;定义数据段DATA HW DB Hello world,13,10,$ ;定义数据 DATA ENDS ;数据段结束 CODE SEGMENT ;定义代码段 ASSUME CS:CODE,DS:DATA ;确定CS/DS指向的逻辑段 START:MOV AX,DATA MOV DS,AX ;装填DS寄存器 MOV DX,OFFSET HW ;DX指向串首 MOV AH,9 ;DOS 9号功能调用 INT 21H ;显示指定字符串 MOV AX,4C00H ;结束程序返回DOS功能调用 INT 21H CODE ENDS ;代码段结束 END START ;汇编结束,程序起始点为START,南

25、开大学 朱耀庭,3. 完整段定义格式的程序实例,例5-4完整段定义格式的程序实例二 题目:程序功能同例5-1 设计思路:将例5-2 按照完整段定义格式写成汇编源程序,即用40H号功能在显示器上输出一串字符Hello World的程序。请读者与例5-2对照,看看有何不同? 源程序EX5-4.asm如下: DATA SEGMENT ;定义数据段DATA HW DB Hello world,13,10 ;定义数据 LH EQU $-HW DATA ENDS ;数据段结束 CODE SEGMENT ;定义代码段 ASSUME CS:CODE,DS:DATA ;确定CS/DS指向的逻辑段 MAIN PR

26、OC FAR ;使用过程,主程序开始 PUSH DS ;为程序返回DOS设置堆栈值,入栈保存原DS段址 MOV AX,0 ;设置偏移地址为0 PUSH AX ;入栈保存偏移地址 MOV AX, DATA,南开大学 朱耀庭,3. 完整段定义格式的程序实例,例5-4完整段定义格式的程序实例二 MOV DS, AX ;数据段的段地址存入DS寄存器 MOV BX,1 ;BX置标准输出设备号1 MOV CX,LH ;CX是输出串的长度 MOV DX,OFFSET HW ;DX指向串首 MOV AH,40H INT 21H ;显示指定的字符串 RET ;用过程返回DOS MAIN ENDP ;主程序结束

27、CODE ENDS ;代码段结束 END MAIN ;汇编结束,南开大学 朱耀庭,5.2 汇编语言的语句,南开大学 朱耀庭,1. 伪指令,伪指令又称为伪操作,它是程序源代码在汇编期间由汇编器识别和执行的指令,可以完成如处理器选择、定义程序模式、定义数据、分配存储区、指定程序结束等功能,除了定义数据及分配存储区为指令分配存储器空间外,其他伪指令不生成目标码。 伪指令是汇编语言的保留字,不能够用来命名变量名或标号。,南开大学 朱耀庭,2. 汇编指令,汇编指令是汇编源程序中的重要组成部分,汇编程序在对源程序进行汇编时把指令语句一对一地翻译成机器指令,然后在程序运行期间由CPU来执行其操作;也就是说,

28、指令语句有着与其对应的机器指令,每一种指令对应一种CPU操作。 伪指令和汇编指令的区别在于,每一条汇编指令必须生成机器代码,然后在程序运行期间由CPU来执行其操作;而伪指令是在汇编期间由汇编程序执行的操作命令,它不生成目标码,和各种指令一样,伪指令也是程序设计过程中不可缺少的工具。,南开大学 朱耀庭,2. 汇编指令,汇编指令格式: 操作码 目标操作数,源操作数 ; 注释 其中: 标号是标识符,是向程序中其他指令提供控制和转移的目标识别标志。标号定义同变量、过程名一样不能使用汇编语言的保留字,例如,一切汇编指令操作码的助记符、伪指令。一个汇编指令语句可以没有标号。 一条汇编指令必须有操作码,操作

29、码规定了指令完成何种操作。操作码的助记符是汇编语言的保留字,不能够用来命名变量或标号。,南开大学 朱耀庭,2. 汇编指令,目标操作数和源操作数规定了指令如何去完成操作码规定的操作。 一条汇编指令可以没有操作数,这里使用隐含的操作数,例如AAA指令,没有操作数但固定使用AL操作数。一条指令可以仅仅有目标操作数,而没有源操作数,例如 INC AX。 如果一条指令有源操作数,也有目标操作数,则左边是目标操作数,右边是源操作数。例如 ADD AL,BL指令表示(BL)+(AL)AL,即将AL内容加BL内容送入寄存器AL。,南开大学 朱耀庭,2. 汇编指令,操作数可以是寄存器操作数、内存操作数和立即数。

30、 注释通过分号来引导,分号后面直到行尾的任何字符都是注释部分,仅仅出现在源程序清单文件中。如果一个语句行开始就是一个分号,那整个语句就是注释语句。注释往往用来说明程序或语句的功能,可以使程序容易被读懂,不仅仅是汇编语言源程序,任何一种程序设计语言的源程序都必须写好注释。注释应该写出本条(或本段)指令在程序中的功能和作用。,南开大学 朱耀庭,3. 变量定义说明语句,格式: 变量类型说明 | 功能:为变量定义、分配内存并为其置初值。 (1) 变量名 其中变量名与标号、过程名一样,它必须是一个汇编非保留字的标识符,而且在同一程序中的定义应该是唯一的。标识符最多由31个字母(AZ)、数字(09)和专用

31、字符(?、 、-、)来表示,但是不能以数字开头,如果名字中用到“”则必须是第一个字符。注意,汇编语言不区分大小写。 无论是变量名还是标号或过程名。它们都用来表示本语句的符号地址。变量名可有可无,如果没有只能通过其在相应段中的位移来确定和访问。只有已经命名的变量,才能够在其说明的程序中通过变量名访问,访问时变量名的实质是相对于所在段的位移。,南开大学 朱耀庭,3. 变量定义说明语句,(2) 变量类型说明 变量类型说明可以是:DB、DW、DD、DQ 或DT,它们都是变量存储方式的说明。 DB(define byte)用来定义字节,其后的每个数据都以字节的方式存储。DB能定义十进制数、二进制数、八进

32、制数、十六进制数和ASCII字符,二进制数、八进制数和十六进制数要分别用“B”、“Q”和“H”表示,ASCII字符用单引号( )或双引号( )括起来。DB还是唯一能定义字符串的伪操作,串中的每个字符占用一个字节。 例如:A DB 1000001B,101Q,41H,65 汇编后这里变量A,A+1,A+2,A+3分别按字节存放着01000001,南开大学 朱耀庭,3. 变量定义说明语句,(2) 变量类型说明 DW(define word)用来定义字,其后的每个数据分配两个字节(1个字),数据的低8位存储在低字节地址中,高8位存储在高字节地址中。 DD(define double word)用来定

33、义双字,其后的每个数据分配4个字节(两个字)。该伪指令同样将数据转换为十六进制,并根据低地址存储低字节,高地址存储高字节的规则来存放数据。 DQ(define quad word)伪指令用来定义4字,即64位字长的数据,DQ之后的每个数据占用8个字节(4个字)。 DT(define ten bytes)用来为压缩的BCD数据分配存储单元,它虽然可以分配10个字节(5个字),但最多只能输入18个数字,要注意的是,数据后面不需要加“H”。,南开大学 朱耀庭,3. 变量定义说明语句,(3) 表达式和表达式表 这里的表达式可以是常数、变量、可以求值的算术式、字符串、?、DUP子句、变量等。表达式表是由

34、逗号分隔的若干个表达式。 其中“?”用来保留存储空间,但不预置初始数据。采用DUP重复子句定义的变量可以看成数组。以下举例分别说明。 表达式为常数,如: A DB 100 ;A为一个字节,初值为100 B DB 100,2*3 ;B值100,B+1值为6 C DW 2*3 ;C为一个字,值为06H,00H 表达式为字符串,如: D DB ABCD ;D值为41H、D+1值为42H,D+2值 为43H,D+3 值为44H E DW AB,CD ;按BADC的ASCII顺序存放, 即42H, 41H,44H,43H,南开大学 朱耀庭,3. 变量定义说明语句,(3) 表达式和表达式表 表达式为?保留

35、存储空间,如: F DB ? ;F为一个字节,值不定 G DW ? ;G为一个字,值不定 表达式为DUP子句,如: H DB 100 DUP (0) ;H为具有100个元素的字节数 组,每个元素值为0 I DB 3 DUP (1,2 DUP(0) ;9个数顺序为:1,0,0,1, 0,0,1,0,0 J DB 5 DUP (Hello,0DH,0AH) ;分配35个字节值为Hello CRCF重复5次 K DW 256 DUP(?) ;K为具有256个元素的字数组,元素值不定 表达式为已定义的变量,如:L DW K ;L中存放K在段中的位移 M DD K ;M的低字存放K在段中的位移,高字存放

36、K所在的段基地址,南开大学 朱耀庭,3. 变量定义说明语句,(3) 表达式和表达式表 表达式为已定义的变量,如: L DW K ;L中存放K在段中的位移 M DD K ;M的低字存放K在段中的 位移,高字存放K所在的 段基地址,南开大学 朱耀庭,5.3 汇编语言的数据组织及其访问,由第4章寻址规则可知,汇编指令的操作数有3种:立即数,寄存器操作数和内存操作数。立即数就是出现在指令中的常数。寄存器操作数就是寄存器作为操作数的源和目标。内存操作数就是通过寻址规则得到的某个内存地址,这个地址可以是源操作数的地址,也可以是目标操作数的地址,总之这种情况必须找到操作数地址。 汇编程序中数据的组织与访问主

37、要是指内存操作数的组织与访问,即变量的组织与访问。前面通过变量的定义与说明语句已经介绍了变量的定义与置初值,这里重点介绍变量的访问。,南开大学 朱耀庭,5.3 汇编语言的数据组织及其访问,例5-5 变量的定义与访问实例 题目:定义几个变量,实现对他们的访问 设计思路:以不同的寻址规则对各变量进行访问 源程序EX5-5.asm如下: .MODEL SMALL .DATA A DB 41H DB 66 B DB 103Q,1000100B,E C DB 10 DUP(F) .CODE,南开大学 朱耀庭,5.3 汇编语言的数据组织及其访问,源程序EX5-5.asm如下: BEGIN: MOV AX,

38、DATA MOV DS,AX MOV AH,2 MOV DL,A ; 将变量A的内容送入DL寄存器 INT 21H ; 输出ASCII为41H的字符A MOV AH,2 MOV DL,A1 ; 将相对于DS段,位移为1的内存单元值66送入DL ; 即A变量位移量为0,相当于访问A1,或A+1 INT 21H ; 输出字符ASCII为66的字符B MOV CX,3 MOV SI,0,南开大学 朱耀庭,5.3 汇编语言的数据组织及其访问,源程序EX5-5.asm如下: L1:MOV AH,2 MOV DL,BSI ; 将相对于DS段,位移为SI的内存单元值送入DL。这里B变量相对DS段位移量为2。

39、 ; 相当于访问BSI,或SI+B,SI初始值为0,依次加1 INT 21H INC SI LOOP L1 MOV CX,LENGTH C ; 取C变量长度10送入CX作循环次数 MOV DI,OFFSET C ; 取C变量位移量5送入DI L2:MOV AH,2 MOV DL,DI ; 经DI间接访问C起始的单元 INT 21H INC DI LOOP L2 MOV AH,4CH INT 21H END BEGIN,南开大学 朱耀庭,5.3 汇编语言的数据组织及其访问,由本例可以得出如下结论: 汇编指令中作为操作数的变量是内存操作数,其寻址规则遵循内存寻址规则,变量名在寻址计算时是作为相对于

40、段首的位移量呈现的。MOV DL,A相当于MOV DL,DS:0,这里0是变量A相对于段首的位移量。 以变量起始的连续存储单元,可以如同高级语言的数组一样进行访问,例如本程序中的A1,BSI,这里1和SI都是下标。但是必须注意其实质仍然是内存寻址,变量名仍然是相对于段首的位移量。,南开大学 朱耀庭,5.3 汇编语言的数据组织及其访问,由本例可以得出如下结论: 特别是当变量的数据类型是DW而不是DB时,例如: A1 DW 20 DUP(0) 访问第0个元素应该是A10,而第一个元素则是A12,请读者考虑这是为什么? 可以通过取属性操作符作用于变量得到相应的属性值,例如,OFFSET、LENGTH

41、等。,南开大学 朱耀庭,5.3 汇编语言的数据组织及其访问,南开大学 朱耀庭,1. 变量的属性,由于变量是在逻辑段中定义的,这就决定了变量有三个属性:段(SEGMENT)、位移(OFFSET)和类型(TYPE)。段属性是它属于哪个段,段基是什么;位移是相对段基的位移是多少;类型决定变量的存储形式。另外,还可以得到变量的长度和大小。 变量的属性值可以通过取属性操作符得到,这些操作符及其功能如下所述。 (1) SEG 功能:返回变量的段基地址。 (2) OFFSET 功能:返回变量的偏移地址。,南开大学 朱耀庭,1. 变量的属性,(3) TYPE 功能:若变量类型为 DB/ DW/ DD/ DF/

42、 DQ/ DT,则分别返回 1/ 2/ 4/ 6/ 8/ 10 (4) LENGTH 功能:返回变量的长度,若变量是按DB/ DW/ DD分配的,则返回变量所占的字节数/字数/双字数。 (5) SIZE 功能:返回变量所占的字节数,SIZE= LENGTH*TYPE。,南开大学 朱耀庭,2. 变量的访问,变量可通过它的名字访问,其作为内存操作数按内存寻址规则决定,访问时的操作类型要与定义时的类型一致。 例如: DATA SEGMENT A DB 52 B DW AB DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE MOV AX,DATA MOV DS

43、,AX MOV AH,A ;A用DB定义只能作为字节操作数 MOV BX,B ;B用DW定义只能作为字操作数 MOV CX,A ;出错,类型不一致 MOV CL,B ;出错,类型不一致 ,南开大学 朱耀庭,3. 修改属性操作符,为了提高访问变量的灵活性,还可以使用修改属性的操作符,来达到临时按指定属性操作的目的。 (1) 修改变量类型操作符PTR 格式: PTR 其中类型可以是BYTE,WORD,DWORD,地址表达式可以是用变量名给出的有效地址、其他形式的有效地址,或能给出一个地址的表达式。 功能:在使用这一操作符的指令中,临时按指定类型操作。,南开大学 朱耀庭,3. 修改属性操作符,例如:

44、 DATA SEGMENT A DB ABCDEF B DW BA DATA ENDS CODE SEGMENT ASSUME DS:SEG A,CS:CODE MOV AX,SEG B MOV DS,AX MOV AL,A ;按字节访问A MOV AX,WORD PTR A ;按字访问A,将BA送入AX MOV AH,BYTE PTR B ;按字节访问B,将A送入AH 又如: INC WORD PTRBX+SI ;类型不知道,必须明确指出访问形式,明确 按字间接访问 INC BYTE PTRBX+4 ;类型不知道,必须明确指出访问形式,明确按 字节间接访问,南开大学 朱耀庭,3. 修改属性操

45、作符,(2) 段的修改 格式: : 功能:临时指定该有效地址相对指定段寻址。 例如: MOV BX,SS:SI+3 ;SI临时相对SS变址 MOV BX,DATA2:WORD PTR100;将DATA2逻辑段中位移100的一个字送入BX中,南开大学 朱耀庭,3. 修改属性操作符,(3) 双重定义变量名 格式:EQU THIS DB|DW|DD| 例如:FOOB EQU THIS BYTE FOOW DW 100 DUP (?) 由于在FOOW前使用了THIS BYTE,这就又定义了一个变量FOOB,它是字节类型的变量,访问它就是按字节访问,而访问FOOW就是按字访问。,南开大学 朱耀庭,4.

46、汇编指令中操作数用到的表达式,在汇编语言中,不仅有各种类型的运算符,还有许多操作符。 通过运算符、操作符及括号把常数和符号连起来,就得到表达式。 表达式又分为数值表达式和地址表达式。 数值表达式是指在汇编过程中能够由汇编程序计算出数值的表达式,南开大学 朱耀庭,4. 汇编指令中操作数用到的表达式,(1) 算数运算符 算术操作符有正(+)、负()、加(+)、减()、乘(*)、除(/)和模(MOD)。 MOD是指除法运算后得到的余数,如19/7的值是2,而19 MOD 7的值则为5(余数)。 例如: ADD AX, 10*4+2 MOV AL, -3 (2) 逻辑运算符 逻辑运算符有按位操作的“与

47、”(AND)、“或”(OR)、“异或”(XOR)和“非”(NOT),另外,还有左移位(SHL)和右移位(SHR)。逻辑运算的结果是数值。 例如: MOV AX, 1 SHL 3 ;将表达式1 SHL 3 的结果8送入AX ADD CX, 256 SHR 2 ;将表达式256 SHR 2的结果64送入CX,南开大学 朱耀庭,4. 汇编指令中操作数用到的表达式,(3) 关系运算符 关系运算符有相等(EQ)、不等(NE)、小于(LT)、大于(GT)、小于或等于(LE)、大于或等于(GE)。关系运算的结果是逻辑值(真/假),倘若关系成立,则结果为真0FFFFH,关系不成立,则结果为假0000H。 例如

48、: MOV AX, 1234 GT 1024 ;将关系运算的结果 0FFFFH送入AX MOV BX, 1234 LT 1024 ;将关系运算的结果0送入 BX,南开大学 朱耀庭,4. 汇编指令中操作数用到的表达式,(4) 其他运算符 在汇编语言中除了上述种运算符外,还有上一节介绍的取值操作符(TYPE、LENGTH、SIZE、OFFSET、SEG),修改属性操作符(PTR、段操作符、THIS),HIGH,LOW,WIDTH,MASK,SHORT等。 HIGH 功能:返回表达式值的高8位。 LOW 功能:返回表达式值的低8位。,南开大学 朱耀庭,4. 汇编指令中操作数用到的表达式,(4) 其他

49、运算符 SHORT 功能:确定转移地址的属性,用在JMP指令中,规定转移范围在128127个字节内。 WIDTH 功能:返回记录或其字段的二进制位数,即其宽度。 MASK 功能:返回一个8位或16位二进制数,这个二进制数中被指定记录或字段的对应位是1,其余各位均是0。,南开大学 朱耀庭,4. 汇编指令中操作数用到的表达式,表5-4 运算符及优先级,(5) 运算符及其优先级 在汇编语言中各种运算符及其优先级别从高到低排列见表5-4。,南开大学 朱耀庭,4. 汇编指令中操作数用到的表达式,(6) 地址表达式 地址表达式所表示的是存储器操作数的地址。单个的标号、变量和方括号括起的基址或变址寄存器是地

50、址表达式的特例。在第4章中介绍的寄存器相对寻址、基址加变址寻址和相对基址加变址寻址等寻址方式的各种表示都属于地址表达式。 在一个存储器地址上加减一个数字量,结果仍为存储器地址, 例如: MOV AX, VARW+4 如果VARW是变量,那么“VARW+4”表示以变量VARW的偏移加4为偏移的存储单元。,南开大学 朱耀庭,5.4 汇编语言程序正常结束的方式,在.COM文件中和DEBUG下所写程序可用INT 20H或INT 3H终止程序。对EXE类型的应用程序可通过用INT 21H系统功能调用来终止程序,也可用RET来终止程序,但后者必须将执行模块定义为过程。 对于任一装入内存的可执行文件,DOS

51、都将在代码段前100H字节中建立程序段前缀PSP。通过20H号中断处理程序终止程序前,代码段寄存器CS必须含有PSP的段值。由于对EXE类型的应用程序而言,其代码段与PSP不是同一个段,所以不能简单地直接利用INT 20H来终止程序。DOS在PSP的偏移0处,安排了INT 20H指令。应用程序只要设法转到PSP的偏移0处,就能实现程序的终止。,南开大学 朱耀庭,5.4 汇编语言程序正常结束的方式,例如,用RET指令终止程序如下: MAIN PROC FAR ;使用过程,主程序开始 PUSH DS ;为程序返回DOS设置堆栈值, 入栈保存原DS段址 MOV AX,0 ;设置偏移地址为0 PUSH

52、 AX ;入栈保存偏移地址 RET ;用过程返回DOS MAIN ENDP ;主程序结束,南开大学 朱耀庭,5.4 汇编语言程序正常结束的方式,发送INT 21H中断终止程序前必须保证CS段寄存器中含有程序段前缀PSP的段地址。这个段地址传给DOS中的程序,目的是为了恢复这个程序进入时原有的结束出口、Ctrl+Break出口和标准错误出口地址。为了在程序结束时能带回一个正确和错误的编码,使用DOS功能调用4CH和31H。例如: MOV AH, 4CH INT 21H 这两种结束返回DOS提示符下的方法较之直接使用INT 20H更好些,而且这两个内部功能调用曾多次使用了中断20H。 例题参考例5

53、-4。,南开大学 朱耀庭,5.5 指令简介,南开大学 朱耀庭,1. 数据传送(Data transfer)指令,数据传送指令分为4种: (1) 通用数据传送指令 (2) 输入输出指令 (3) 地址目标传送指令 (4) 标志位传送指令,南开大学 朱耀庭,1. 数据传送(Data transfer)指令,(1) 通用数据传送指令 MOV (MOVe byte or word)传送字节或字。 POP (POP word off stack)字退栈。 PUSH(PUSH Word into stack)字进栈。 XCHG (Exchange byte or word)字节或字交换。 XLAT(Tran

54、slate byte)字节换码 (2) 输入输出指令 IN(INput byte or word)输入字节或字。 OUT(OUTput byte or word)输出字节或字。 ,南开大学 朱耀庭,1. 数据传送(Data transfer)指令,(3) 地址目标传送(Address Object) LEA(Load Effective Address)取有效地址。 LDS(Load pointer using DS)取指示器到DS。 LES(Load pointer using ES)取指示器到ES。 (4) 标志位传送指令 LAHF(Load AH register from Flags)

55、取标志到AH。 SAHF(Store AH register in Flags)取AH到标志。 PUSHF(PUSH Flags into stack)标志进栈。 POPF(POP Flags off stack)标志退栈。,南开大学 朱耀庭,2. 算术运算指令,(1) 加法指令 ADD (ADD byte or word)字节或字相加 ADC (ADd byte or word with Carry)带进位的字节或 字相加 INC (INCrement byte or word by 1)字节或字加1。 AAA (ASCII Adjust for Addition)加法的ASCII码修 正 DAA (Decimal Adjust for Addition)加法的十进制修 正,南开大学 朱耀庭,2. 算术运算指令,(2) 减法指令 SUB (SUBtract byte or word)字节或字相减 SBB (SUBtract Byte or word with carry)带借位的字节 或字相减 NEG (NEGate byte or word)字节或字求补 CMP (COMPare byte or word)字节或字的比较 DEC (DECrement byte or word

温馨提示

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

评论

0/150

提交评论