第4章 汇编语言及汇编程序设计_第1页
第4章 汇编语言及汇编程序设计_第2页
第4章 汇编语言及汇编程序设计_第3页
第4章 汇编语言及汇编程序设计_第4页
第4章 汇编语言及汇编程序设计_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

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

文档简介

1、第第4章章 汇编语言及汇编程序设计汇编语言及汇编程序设计 本章学习目标本章学习目标通过本章的学习,应当掌握以下内容通过本章的学习,应当掌握以下内容: 了解汇编语言的基本知识和特点。了解汇编语言的基本知识和特点。 熟悉汇编语言的程序结构及语句的格式。熟悉汇编语言的程序结构及语句的格式。 掌握汇编语言常用伪指令的使用方法。掌握汇编语言常用伪指令的使用方法。 熟练掌握汇编语言程序设计的基本方法:顺序结构、熟练掌握汇编语言程序设计的基本方法:顺序结构、 分支结构、循环结构和子程序结构。分支结构、循环结构和子程序结构。 掌握程序设计中的宏指令和常用的系统功能的调用方法。掌握程序设计中的宏指令和常用的系统

2、功能的调用方法。4.1 4.1 概概 述述 1. 1.汇编语言和汇编程序的基本概念汇编语言和汇编程序的基本概念程序设计语言通常分为程序设计语言通常分为3类:类: 机器语言(机器语言(Machine Language) 汇编语言(汇编语言(Assembler Language) 高级语言(高级语言(High Level Language)机器语言:机器语言: 是一种用二进制编码的是一种用二进制编码的机器(机器(CPUCPU)能够直接识)能够直接识别的别的语言,以表示计算机所要进行操作及操作对象(数据或语言,以表示计算机所要进行操作及操作对象(数据或数据地址)数据地址) 。汇编语言:汇编语言:是一

3、种面向是一种面向CPUCPU指令系统的程序设计语言,它采用指令系统的程序设计语言,它采用指令系统的助记符来表示操作码和操作数,用符号地址表示指令系统的助记符来表示操作码和操作数,用符号地址表示操作数地址操作数地址。 汇编语言的特点: 1 1)汇编语言实质上是机器语言的符号表示,更便于书写和记忆。)汇编语言实质上是机器语言的符号表示,更便于书写和记忆。2 2)用汇编语言编写的程序要比其等效的高级语言程序生成的目标程序)用汇编语言编写的程序要比其等效的高级语言程序生成的目标程序精简、占用内存少、运行速度快,比较适合编写系统软件、实时控制软精简、占用内存少、运行速度快,比较适合编写系统软件、实时控制

4、软件及直接控制计算机硬件的接口程序。件及直接控制计算机硬件的接口程序。3 3)利用汇编语言编写的程序,调试周期长,技巧性强。)利用汇编语言编写的程序,调试周期长,技巧性强。 汇编语言与机器语言属于低级语言,它们与高级语言有较大的汇编语言与机器语言属于低级语言,它们与高级语言有较大的 差别汇编语言中的语句与机器的型号密切相关。如差别汇编语言中的语句与机器的型号密切相关。如Intel 8086系列系列CPU、Intel8031系列单片系列单片CPU等,若等,若CPU型号不同,其指令统就型号不同,其指令统就不同,当然语句的书写格式也就不同。不同,当然语句的书写格式也就不同。汇编语言源程序汇编语言源程

5、序:用汇编语言编写的程序。用汇编语言编写的程序。汇编:汇编:是把汇编语言程序翻译成机器语言描述的目标程序是把汇编语言程序翻译成机器语言描述的目标程序的过程。的过程。汇编语言源程序汇编目标程序汇编程序:汇编程序:汇编程序是完成汇编任务的程序。汇编程序是完成汇编任务的程序。是系统软件中的一种程序,是系统软件中的一种程序,它的作用是把汇编语言源程序自动翻译成机器能识别的它的作用是把汇编语言源程序自动翻译成机器能识别的机器语机器语言目标程序言目标程序。汇编程序以汇编语言源程序文件作为输入,并由汇编程序以汇编语言源程序文件作为输入,并由它产生两种输出文件它产生两种输出文件目标程序文件目标程序文件和和源程

6、序列表文件源程序列表文件。汇编语言源程序目标程序文件汇编程序源程序列表输入输入输出输出.ASM.OBJ.LST翻译翻译8086常用的汇编程序有常用的汇编程序有ASM-86和和宏汇编MASM-862.2.汇编语言语句结构汇编语言语句结构汇编语言语句的种类汇编语言语句的种类指令性语句指令性语句指令系统对应的语句指令系统对应的语句指示性语句指示性语句与伪操作命令和伪操作符对应的命令与伪操作命令和伪操作符对应的命令宏指令语句宏指令语句以某个宏指令名定义的一段指令系列以某个宏指令名定义的一段指令系列指令性命令指令格式:指令性命令指令格式: 标号:标号:前缀前缀 指令助记符指令助记符 操作数操作数;注释;

7、注释 方括号表示的成分可以选用或缺省;方括号表示的成分可以选用或缺省; 标号是后面紧跟标号是后面紧跟“ “ :”的一个的一个标识符。标识符。给该行指令在存储器中的首地给该行指令在存储器中的首地址所起的名称,主要作为转移指令、调用指令和循环指令的使用标号;址所起的名称,主要作为转移指令、调用指令和循环指令的使用标号; 一个源程序中,每个标识符的定义是唯一的,以字母开头,不能是汇一个源程序中,每个标识符的定义是唯一的,以字母开头,不能是汇编语言采用的编语言采用的保留字保留字; 前缀可以是一个或多个,如重复前缀、总线封锁前缀等;前缀可以是一个或多个,如重复前缀、总线封锁前缀等; 指令助记符指令助记符

8、指出该条语句的基本操作功能,指出该条语句的基本操作功能,可以是机器指令、伪指可以是机器指令、伪指令和宏指令的助记符令和宏指令的助记符,是必须有的部分;,是必须有的部分; 操作数可以是一个、两个或没有,由指令类型决定,若有两个操作数,操作数可以是一个、两个或没有,由指令类型决定,若有两个操作数,前面为目的操作数,后面为源操作数,中间用前面为目的操作数,后面为源操作数,中间用逗号逗号隔开;隔开; 注释是以注释是以“ “ ;”开始的字符串开始的字符串可以用英文或者中文书写可以用英文或者中文书写,注释字段是注释字段是语句的非执行部分,语句的非执行部分,不影响程序的汇编与执行,仅用于增加源程序的可读不影

9、响程序的汇编与执行,仅用于增加源程序的可读性。性。4.2 4.2 伪指令伪指令 伪指令伪指令伪指令语句是为伪指令语句是为汇编程序汇编程序和和连接程序连接程序提供一提供一些必要控制的管理性语句,些必要控制的管理性语句,是给汇编程序命令,告诉汇编程是给汇编程序命令,告诉汇编程序如何去处理汇编语言的源程序,如何生成目标代码的指令序如何去处理汇编语言的源程序,如何生成目标代码的指令语句,语句,称为指示性语句。称为指示性语句。汇编时,它不产生目标代码,即当汇编时,它不产生目标代码,即当汇编形成目标程序后则不存在了。汇编形成目标程序后则不存在了。 在汇编语言中,所有符号常量、变量名、标号、过程名、在汇编语

10、言中,所有符号常量、变量名、标号、过程名、记录名、指令助记符、寄存器名等都可称为符号,这些符号记录名、指令助记符、寄存器名等都可称为符号,这些符号可以通过伪指令重新命名或定义新的类型属性。可以通过伪指令重新命名或定义新的类型属性。 MASM-86 MASM-86中规定了几十种伪指令相当丰富,我们只介中规定了几十种伪指令相当丰富,我们只介绍常用的几种。绍常用的几种。指示性命令指令格式;指示性命令指令格式; 符号名符号名 定义符定义符 参数参数1,参数,参数2,参数,参数3, ;注释;注释4.2.1 4.2.1 符号定义伪指令符号定义伪指令1. EQU伪指令伪指令 格式:格式: EQUEQU 其中

11、,表达式可以是一个常数,一个可以求出常数值的表达式,其中,表达式可以是一个常数,一个可以求出常数值的表达式,一个寄存器名或一个指令助记符一个寄存器名或一个指令助记符, ,但表达式的值不能超过但表达式的值不能超过 65535 65535 。例如:例如: COUNT EQU 20 ;COUNT代替常数代替常数20 COUNT1 EQU COUNT+10 ; COUNT1代表表达式代表表达式COUNT+10C EQU CX ;C是寄存器是寄存器CX的同义语的同义语B EQU DS:BP+20 ;地址表达式;地址表达式DS:BP+20可由可由B代替代替有了以上赋值后,下列语句是正确的:有了以上赋值后,

12、下列语句是正确的: MOV AX,COUNT1注意:一个符号一经注意:一个符号一经EQUEQU赋值之后,在整个程序中,这个赋值之后,在整个程序中,这个符号不能重新再赋值,除非用符号不能重新再赋值,除非用PURGEPURGE伪指令解除定义。伪指令解除定义。 等号等号伪指令与伪指令与EQUEQU具有相同的功能,区别仅在于具有相同的功能,区别仅在于等号等号伪指伪指令定义的符号允许重新定义。令定义的符号允许重新定义。例:例: EMP = 60 ;定义定义EMP等于常数等于常数60 EMP=EMP+1;又定义又定义EMP等于常数等于常数61 格式:格式: 2.等号(赋值)伪指令等号(赋值)伪指令3.3.

13、解除符号定义伪指令解除符号定义伪指令 格式:格式: PURGE 符号符号1,符号,符号2. 功能:解除之前引用符号的定义功能:解除之前引用符号的定义4.2.2 4.2.2 内存数据定义伪指令内存数据定义伪指令 常用的数据定义伪指令有常用的数据定义伪指令有DBDB、DWDW、DDDD、DQDQ、DTDT,分别用来分别用来定义字节、单字、双字、四字及十字节类型变量。定义字节、单字、双字、四字及十字节类型变量。 用于将所需要的数据放入指定的存储单元中,或者是为程用于将所需要的数据放入指定的存储单元中,或者是为程序分配指定数目的存储单元,并根据情况对它们进行初始化。序分配指定数目的存储单元,并根据情况

14、对它们进行初始化。基本应用格式如下:基本应用格式如下: 变量名变量名 DB/DB/DW/DD/DQ/DTDW/DD/DQ/DT 表达式表达式 其中:其中:变量名变量名是可选的,它代表所定义的第一单元的地址;是可选的,它代表所定义的第一单元的地址; 中的伪操作指令必须选用一种;中的伪操作指令必须选用一种; 表达式表达式这里的表达式可以是常数、数据表达式、地这里的表达式可以是常数、数据表达式、地址表达式、字符串和数据表格等。址表达式、字符串和数据表格等。 1. DB:定义字节变量,其后的每一个表达式占一个字节定义字节变量,其后的每一个表达式占一个字节。 2. DW:定义字变量,其后的每定义字变量,

15、其后的每个表达式的值占二个字节,个表达式的值占二个字节,低字节在低地址,高字节在高地址。低字节在低地址,高字节在高地址。 3. DD:定义双字变量,其后的每一个表达式的值占四个字定义双字变量,其后的每一个表达式的值占四个字节,同样低字节在低地址,高字节在高地址节,同样低字节在低地址,高字节在高地址。 4. DQ:定义四字变量,其后的每一个表达式的值占八个字定义四字变量,其后的每一个表达式的值占八个字节,低字节放低地址,高字节放高地址。节,低字节放低地址,高字节放高地址。 5. DT:定义十个字节,其后的每一个表达式的值占十个字定义十个字节,其后的每一个表达式的值占十个字节。一般用于存放压缩的节

16、。一般用于存放压缩的BCD码。码。 6. 复制操作符复制操作符 DUP 格式:格式: n n DUP DUP 表达式表达式 用于定义重复变量,用于定义重复变量,DUP是重复数据操作符,是重复数据操作符,n表示重复表示重复次数,括号内的表达式表示要重复的内容。次数,括号内的表达式表示要重复的内容。 例例1 1:VAR1 DB 20H; 给变量给变量VAR1分配一字节单元,分配一字节单元, 并赋值为并赋值为20H其中,其中,VAR1VAR1是它的标号是它的标号( (名称名称) )部分,它代表由伪指令部分,它代表由伪指令DBDB分配的分配的那个单元的符号地址,又叫做变量名。那个单元的符号地址,又叫做

17、变量名。例例2 2: DAT2 DW 3456H, 3456H, 0,?, 1024H0,?, 1024H例例3 3: TAB DB 10 DUPTAB DB 10 DUP(0 0) ;数组变量数组变量TABTAB有有1010为为0 0的字节元素的字节元素 DAT210H24H56H34H00H00H4.2.3 4.2.3 段定义伪指令段定义伪指令(程序块定义)(程序块定义)80868086利用存储器分段技术管理存储器信息,段定义伪指令可利用存储器分段技术管理存储器信息,段定义伪指令可使我们按段来组织程序和使用存储器。使我们按段来组织程序和使用存储器。在汇编和连接时,控在汇编和连接时,控制段的

18、定位、组合和连接。制段的定位、组合和连接。其格式为:其格式为: SEGMENT 定位方式定位方式连接方式连接方式类别类别名名 段体段体 ENDS1. 段名:段名:由编程者为该段起的名字由编程者为该段起的名字 ,起始段名与预结束段,起始段名与预结束段名必须相同。名必须相同。其中定位方式、连接方式和类别名是可选的,若选两其中定位方式、连接方式和类别名是可选的,若选两个以上时,书写时顺序必须与格式中的顺序一致。个以上时,书写时顺序必须与格式中的顺序一致。 2.定位方式:定位方式:告诉汇编程序(告诉汇编程序(MASM.EXEMASM.EXE)对该段汇编时,该段对该段汇编时,该段的起始边界的要求的起始边

19、界的要求。可以有可以有4 4种选择种选择: : PAGE:段超始地址的最低段超始地址的最低8 8位必须为位必须为0 0,它使得段间可能留有,它使得段间可能留有1 1到到255255个字节的间隙。个字节的间隙。 PARA:段起始地址的最低段起始地址的最低4 4位必须为位必须为0 0,它使得段间留有它使得段间留有1 1到到1515个字节的间隙个字节的间隙 。 WORD:段起始地址的最低段起始地址的最低1 1位必须为位必须为0 0,即从偶地址开始。,即从偶地址开始。 BYTE;段起始地址为任意值,段起始地址为任意值,它使得段间不留有任何间隙。它使得段间不留有任何间隙。 在实际应用中,每个段的定位类型

20、常选在实际应用中,每个段的定位类型常选PARAPARA(节)节)型。型。因为若选因为若选PAGEPAGE(页)型,将会使相邻的段间有较大页)型,将会使相邻的段间有较大空间的浪费;而选空间的浪费;而选WORDWORD或或BYTEBYTE型,又很难做到使一个段型,又很难做到使一个段的偏移地址从的偏移地址从0000H0000H开始。开始。 3. 3. 连接方式(组合类型):表示本段与其它段的关系,是为连接程序连接方式(组合类型):表示本段与其它段的关系,是为连接程序提供信息的,可以有提供信息的,可以有6 6种选择。种选择。1)NONE:表示本段与其它段逻辑上不发生关系,有独立的段地址,表示本段与其它

21、段逻辑上不发生关系,有独立的段地址,这是系统隐含的连接方式(缺省时)。这是系统隐含的连接方式(缺省时)。2)PUBLIC:连接时该段与其他模块中说明为连接时该段与其他模块中说明为PUBLIC的的同名同类别的同名同类别的段链接起来共用一个段地址,形成一个物理段。段链接起来共用一个段地址,形成一个物理段。 段地址同,偏移地址不同。段地址同,偏移地址不同。例例1 1:DATA1 SEGMENT PUBLIC X DB 10H DATA1 ENDS DATA1 SEGMENT PUBLIC Y DW 1234H DATA1 ENDS 例例2 2:DATA1 SEGMENT X DB 10H Y DW

22、1234H DATA1 ENDS3)STACK:连接方式与连接方式与PUBLIC,但此段作为堆栈段。,但此段作为堆栈段。 源程序中至少有一个堆栈段。源程序中至少有一个堆栈段。4)COMMON:连接程序为本段和其它连接程序为本段和其它同名同类别的同名同类别的段指定相同的段基址。段指定相同的段基址。因而这些段是因而这些段是相互重叠的相互重叠的。 连接后,段的长度是各模块同名段中最大的连接后,段的长度是各模块同名段中最大的COMMON段长度。段长度。 5) MEMORY:连接程序将把本段定位在被连接在一起的其它所有段之上,:连接程序将把本段定位在被连接在一起的其它所有段之上,即高地址区域。即高地址区

23、域。6) AT 连接程序的把本段地址设为表达式的值所指定的段连接程序的把本段地址设为表达式的值所指定的段地址上,位移量为地址上,位移量为0。不能用于代码段的连接不能用于代码段的连接。 例如例如 AT 1234H ;表示该段段基址为;表示该段段基址为12340H 4.4.类别名类别名: : 类别名是编程者给各段的一种名字信息。连接程序将类别名相类别名是编程者给各段的一种名字信息。连接程序将类别名相同的段组成一个段组,用它们共同的类别名字作为这个段组的名字。通常使同的段组成一个段组,用它们共同的类别名字作为这个段组的名字。通常使用的类别有用的类别有 STACK STACK ,CODECODE,DA

24、TADATA等等。等等。类别必须用单引号类别必须用单引号引起来。引起来。 使用段定义语句的说明:使用段定义语句的说明: 源程序模块中的某一段,可使用一对源程序模块中的某一段,可使用一对SEGMENT和和ENDS编写完毕,也编写完毕,也可以分为多对可以分为多对SEGMENT和和ENDS编写,只要使用相同的段名即可。但这编写,只要使用相同的段名即可。但这些段的些段的SEGMENT语句的连接方式、定义方式、分类名应相同,不得相互语句的连接方式、定义方式、分类名应相同,不得相互矛盾,或者以先出现矛盾,或者以先出现SEGMENTSEGMENT语句为准,其余均省略不写。语句为准,其余均省略不写。 4.2.

25、4 4.2.4 段寄存器说明伪指令段寄存器说明伪指令 段寄存器说明伪指令段寄存器说明伪指令ASSUME 用来设定程序中各实际的用来设定程序中各实际的段与各段寄存器之间的关系,段与各段寄存器之间的关系,格式如下:格式如下: ASSUME段寄存器段寄存器:段名段名 ,段寄存器段寄存器:段名段名 功能:告诉汇编程序哪个段寄存器将为哪个段名寻址。功能:告诉汇编程序哪个段寄存器将为哪个段名寻址。 其中:其中:段寄存器名为段寄存器名为CSCS、DSDS、ESES和和SSSS中的一个;中的一个; 段名为程序中由段名为程序中由SEGMENTSEGMENT定义的段之段名。定义的段之段名。 ASSUMEASSUM

26、E伪指令只是设定了哪个段寄存器指向哪一个段,并伪指令只是设定了哪个段寄存器指向哪一个段,并没有给各段寄存器装入实际的值。所以一般在程序要用指令没有给各段寄存器装入实际的值。所以一般在程序要用指令来完成给段寄存器赋初值。来完成给段寄存器赋初值。注意:注意:CSCS的值在程序初始化时由汇编程序自动给出,因此的值在程序初始化时由汇编程序自动给出,因此一般不在程序中赋值。堆栈段可以不用一般不在程序中赋值。堆栈段可以不用ASSUMEASSUME语句,此时利语句,此时利用系统设置的堆栈。用系统设置的堆栈。例例46 如某一汇编语言源程序如下:如某一汇编语言源程序如下: NAME ASMPLE DATA SE

27、GMENT X DB 10H Y DW 2020H DATA ENDS STACK SEGMENT DW 128DUP(?(?) STACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX CODE ENDS. END START不能向段寄存不能向段寄存器送立即数器送立即数4.2.5 4.2.5 定位伪指令定位伪指令1. 起址定位起址定位 伪指令伪指令ORG 格式为格式为: ORG 功能功能:该指令后生成的目标代码(该指令后生成的目标代码(程序

28、或数据代码)程序或数据代码),从表,从表达式提供的达式提供的偏移地址偏移地址开始存放开始存放。 2.2.地址定位伪指令地址定位伪指令 EVEN格式:格式: EVEN 功能:功能:告诉汇编程序把以下的程序或数据从告诉汇编程序把以下的程序或数据从偶地址开始存放偶地址开始存放。例如例如:DATA SEGMENT X DB 64H EVEN Y DW 1234H ORG 06H Z DB A DATA ENDS64-3412-41偏移地址偏移地址内容内容0000H000100020003000400050006A4.2.6 4.2.6 子程序(子程序(过程定义)过程定义)定义伪指令定义伪指令子程序:具

29、有一定功能的程序段子程序:具有一定功能的程序段。子程序通常以过程的形式编写。子程序通常以过程的形式编写。 格式:格式:子程序名子程序名PROC 类型类型 NEAR/FAR RET 子程序名子程序名ENDP 1 1)子程序名是为该过程取的名字,具有与语句标号相同的子程序名是为该过程取的名字,具有与语句标号相同的属性;属性; 2 2)类型属性可以有类型属性可以有NEARNEAR和和FARFAR两种。若类型缺省或为两种。若类型缺省或为NEARNEAR时,时,表示该过程只能为所在段的程序调用;若为表示该过程只能为所在段的程序调用;若为FARFAR时,则可被跨时,则可被跨段调用。段调用。 3 3)RET

30、RET为过程返回指令,不能省,否则过程将无法返回。返为过程返回指令,不能省,否则过程将无法返回。返回指令属于段内返回还是段间返回与过程类型有关。回指令属于段内返回还是段间返回与过程类型有关。 4.2.6 4.2.6 模块定义伪指令模块定义伪指令 设计大型程序时一般采用模快化结构,先将程序分模块编设计大型程序时一般采用模快化结构,先将程序分模块编写成不同的源程序文件,并分别命名。汇编时也将产生各个不写成不同的源程序文件,并分别命名。汇编时也将产生各个不同的目标代码文件,再通过连接程序连接成一个完整的程序。同的目标代码文件,再通过连接程序连接成一个完整的程序。说明:说明: 模块名是为该模块起的名字

31、模块名是为该模块起的名字( (以字母开头,最多以字母开头,最多6 6个字符),个字符),NAME语句可缺省,若缺省,该模块的源程序文件名就是模块语句可缺省,若缺省,该模块的源程序文件名就是模块名;名; 若该模块是主模块,若该模块是主模块,ENDEND语句后跟一个标号,它表示模块执语句后跟一个标号,它表示模块执行时的起始地址,是该模块第一条行时的起始地址,是该模块第一条指令性语句指令性语句的标号的标号。 ENDEND总是放在程序的最后通知汇编程序,源程序到此结束。总是放在程序的最后通知汇编程序,源程序到此结束。 1.1.模块开始伪指令模块开始伪指令格式格式: NAME 模块名模块名2.2.模块结

32、束指令模块结束指令格式格式: END 标号标号/过程名过程名 功能:功能:由由NAMENAME开始到开始到ENDEND之间定义一个汇之间定义一个汇编语言源程序模块。编语言源程序模块。* *4.2.8 4.2.8 外部符号定义伪指令(外部符号定义伪指令(程序模块连接)1. 公用符号公用符号PUBLIC 格式:格式:PUBLIC ,1 ,符号名符号名2,2, 功能:表示该模块中的符号常量、变量、标号、过程名等可以被其它模功能:表示该模块中的符号常量、变量、标号、过程名等可以被其它模块引用;块引用; 2. 2. 引用符号引用符号 EXTRN 格式:格式:EXTRN 符号符号1 1:类型:类型 ,符号

33、,符号2 2:类型,:类型, 功能:表示在其它模块中定义过并说明为功能:表示在其它模块中定义过并说明为PUBLIC的那些符号,在本模块的那些符号,在本模块中需要引用;中需要引用; * *4.2.9 4.2.9 记录记录 伪指令伪指令 这种伪指令用于对一组这种伪指令用于对一组/一类信息可定义为记录形式一类信息可定义为记录形式按位按位实现信息组实现信息组合。包括有:合。包括有: 1.记录定义伪指令记录定义伪指令 RECORD(宽度宽度116) 2.记录内存分配伪指令(记录的预置)记录内存分配伪指令(记录的预置) 3.记录操作符记录操作符 WIDTH、MASK* *4.2.10 4.2.10 结构结

34、构 伪指令伪指令 结构就是相互关联的一组数据的某种组合形式。使用结构,往往需要结构就是相互关联的一组数据的某种组合形式。使用结构,往往需要进行以下几步工作:进行以下几步工作: 结构的定义,结构的预置(分配),结构的引用结构的定义,结构的预置(分配),结构的引用1.1.结构的定义结构的定义格式:格式: 结构名结构名 STRUC . 结构名结构名 ENDS功能:功能:用伪指令用伪指令STRUCSTRUC和和ENDSENDS把相关数据定义语句组合起来,把相关数据定义语句组合起来,便构成一个完整的结构。并不具体分配内存空间,仅对结构的便构成一个完整的结构。并不具体分配内存空间,仅对结构的使用作说明。使

35、用作说明。例如,对于学生成绩情况,可定义一个结构例如,对于学生成绩情况,可定义一个结构STUDENT: STUDENT STRUC NO DW ? NAME1 DB,ABCD SEX DB ? SCORE DB? STUDENT ENDSSTUDENT叫做结构名,结构内数据定义语句中变量名叫叫做结构名,结构内数据定义语句中变量名叫做结构字段名,如做结构字段名,如NAME1、NO、 SEX 、SCORE都是都是结构字段名。各项数据称为结构的字段。结构字段名。各项数据称为结构的字段。结构的定义完成之后,就好像在某些高级语言中结构的定义完成之后,就好像在某些高级语言中完成了完成了某些数据类型的定义。

36、某些数据类型的定义。2. 结构分配结构分配格式:格式:结构变量名结构变量名 结构名结构名 其中结构名是结构定义时用的名字。其中结构名是结构定义时用的名字。结构变量名是程序中具体使用的变量,它与具体的结构变量名是程序中具体使用的变量,它与具体的存储空间及数存储空间及数据据相联系,程序中可直接引用它。相联系,程序中可直接引用它。字段值表用来给结构变量赋初值,表中各字段的排列顺序及类型字段值表用来给结构变量赋初值,表中各字段的排列顺序及类型应与结构定义时一致,各字段间以逗号分开。应与结构定义时一致,各字段间以逗号分开。 例如,对前面定义的例如,对前面定义的STUDENT结构,可定义一些结构变量,每一

37、个结构,可定义一些结构变量,每一个变量代表一个学生的信息。设有两个学生,则可有:变量代表一个学生的信息。设有两个学生,则可有:STU1 STUDENT STU2 STUDENT 若不在预置语句中放入学生的实际信息,而是在程序运行过程中来若不在预置语句中放入学生的实际信息,而是在程序运行过程中来放入,则仍需开辟一定的存储区,可以这样来预置:放入,则仍需开辟一定的存储区,可以这样来预置:STU1 STUDENT STU2 STUDENT 或者:或者: STU STUDENT 2 DUP() 3. 结构的引用结构的引用程序中引用结构变量,则和其它变量一样,可直接写结构程序中引用结构变量,则和其它变量

38、一样,可直接写结构变量名。变量名。若要引用结构变量中的某一字段,则采用如下形式:若要引用结构变量中的某一字段,则采用如下形式:(1 1)格式)格式1 1:结构变量名:结构变量名结构字段名结构字段名 (2 2)格式)格式2 2: 地址寄存器地址寄存器 结构字段名结构字段名 即先将结构变量的起始地址的偏移量送某个地址寄存器即先将结构变量的起始地址的偏移量送某个地址寄存器若要引用结构变量若要引用结构变量STU1中的中的SCORE字段,则以下两种用法都是正确的字段,则以下两种用法都是正确的; MOV AL,STU SCORE MOV BX,OFFSET STU1 MOV AL,BX SCORE由此看到

39、,若需要查询某个学生的某门成绩,利用结构就很简单方便,由此看到,若需要查询某个学生的某门成绩,利用结构就很简单方便,而不必去计算这个数据的地址。而不必去计算这个数据的地址。4.2.11 4.2.11 块注释块注释 伪指令伪指令格式:格式:COMMENT 定界符定界符 注释注释 定界符定界符其中定界符为任意非空字符,一般用其中定界符为任意非空字符,一般用/或或*号号一般对程序中的单行注释可用一般对程序中的单行注释可用;号引导号引导。较长的注释可用较长的注释可用COMMENT伪指令定义。伪指令定义。例如:例如: COMMENT / 注释注释 ./ 4.3 4.3 表达式及运算符表达式及运算符 在汇

40、编语言中指令的操作数可以是常数、寄存器、变量、在汇编语言中指令的操作数可以是常数、寄存器、变量、标号,还可以是表达式。标号,还可以是表达式。 表达式的组成表达式的组成: 运算对象:运算对象:常量、变量、标号;常量、变量、标号; 运算符:运算符:算术运算符、逻辑运算符、关系运算符、算术运算符、逻辑运算符、关系运算符、 分析运算符和属性运算符分析运算符和属性运算符共共5 5种。种。表达式的运算:表达式的运算: 表达式的运算和运算指令不同,它是由汇编程序表达式的运算和运算指令不同,它是由汇编程序汇编时汇编时完成完成,运算所得结果再作为语句操作数使用。,运算所得结果再作为语句操作数使用。 汇编程序在汇

41、编过程中计算表达式,最终得到一个数值;汇编程序在汇编过程中计算表达式,最终得到一个数值;程序运行之前,就已经计算出了表达式的值;所以,程序程序运行之前,就已经计算出了表达式的值;所以,程序运行速度没有变慢,但增强程序的可读性。运行速度没有变慢,但增强程序的可读性。4.3.14.3.1常数、变量和标号常数、变量和标号 4.3.1.1 4.3.1.1 常数常数 常数:是在汇编时已经确定的常数值,常数可以是常数:是在汇编时已经确定的常数值,常数可以是“数值常数数值常数”和和“字符常数字符常数”。1.1.数值型常数数值型常数 十进制十进制由由0 9数字组成,数字组成,以字母以字母D(d)结尾(缺省情况

42、可以省略)结尾(缺省情况可以省略)100,255D二进制二进制由由0和和1两个数字组成,以字母两个数字组成,以字母B(b)结尾结尾01100100B十六进制十六进制由由0 9、A F数字组成,以字母数字组成,以字母H(h)结结尾,以字母开头的常数需要加一个前导尾,以字母开头的常数需要加一个前导064H,0FFH0B800H八进制八进制由由0 7数字组成,以字母数字组成,以字母Q(q)结尾)结尾)732Q实数实数由由整数、小数和指数组成(浮点表示)整数、小数和指数组成(浮点表示)以十进制形式给出以十进制形式给出-0.31E+42. 2. 字符常数字符常数 字符常数是用单引号或双引号括起来的单个字

43、符或多个字符,其数值字符常数是用单引号或双引号括起来的单个字符或多个字符,其数值是每个字符对应的是每个字符对应的ASCIIASCII码值。码值。4.3.1.2 4.3.1.2 变量变量 变量常以变量常以变量名变量名的形式出现在程序中,可以看作是存放数据的存储单的形式出现在程序中,可以看作是存放数据的存储单元的元的符号地址符号地址,它用来定义存储器中的数据。,它用来定义存储器中的数据。 变量具有三种属性:变量具有三种属性: 段属性:变量所在逻辑段的段地址;段属性:变量所在逻辑段的段地址; 偏移地址属性:变量所在段的段内偏移地址;偏移地址属性:变量所在段的段内偏移地址; 类型属性:变量占用存储单元

44、的字节数:类型属性:变量占用存储单元的字节数: BYTE字节型;字节型; WORD字型;字型; DWORD双字型,四字节;双字型,四字节; QWORD四字型,八字节四字型,八字节 ; TBYTE五字型,十字节。五字型,十字节。 变量的类型属性是由定义变量的伪指令变量的类型属性是由定义变量的伪指令DB、DW、DD、DQ、DT确定确定。 注意:注意:变量实质上是指内存单元的数据,虽然内存单元地变量实质上是指内存单元的数据,虽然内存单元地 址不变,但其中存放的数据可以改变;址不变,但其中存放的数据可以改变; 变量需要事先定义才能使用;变量需要事先定义才能使用; 定义后的变量可以利用变量名等方法引用其

45、中的定义后的变量可以利用变量名等方法引用其中的 数据,即变量的数值。数据,即变量的数值。 4.3.1.3 4.3.1.3 标号标号 标号标号是给指令性语句所在单元地址取的名字,它表明是给指令性语句所在单元地址取的名字,它表明该指令在存储器中的位置该指令在存储器中的位置符号地址,可作为转移类指令符号地址,可作为转移类指令的操作数。的操作数。 它也有三种属性:它也有三种属性: 段属性:段属性:标号(指令代码)所在段的段地址;标号(指令代码)所在段的段地址; 偏移地址属性:偏移地址属性:标号(指令代码)所在段的段内偏移地址;标号(指令代码)所在段的段内偏移地址; 距离属性(也称类型属性):距离属性(

46、也称类型属性): NEAR:近标号,表示该标号在段内使用;近标号,表示该标号在段内使用; FAR: 远标号,表示该标号在段间使用。远标号,表示该标号在段间使用。 4.3.2 4.3.2 表达式及运算符表达式及运算符1.算术运算符算术运算符 算术运算符有:算术运算符有: + +(加)、(加)、- -(减)、(减)、* *(乘)、(乘)、/ /(除)、(除)、MODMOD(模除)、模除)、SHLSHL(左移)、左移)、SHRSHR(右移)共右移)共7 7种。种。 注意点:注意点:除(除(/ /)只取商,模除()只取商,模除(MODMOD)只取余,只取余,SHLSHL一次相一次相当于当于* *2 2

47、,SHRSHR一次相当于一次相当于/2/2。 例如:例如:movmov ax,3 ax,3* *4+5 4+5 ;等价于等价于 movmov ax,17 ax,17 19 mod 7 = 5 19 mod 7 = 5 ;其中;其中MODMOD也称为也称为取模取模或或取余取余,它产生,它产生 除法之后的除法之后的余数。余数。移位运算符实现对移位运算符实现对数值数值的左移、右移的逻辑操作;移入低的左移、右移的逻辑操作;移入低位或高位的是位或高位的是0 0。格式为:数值表达式格式为:数值表达式 SHL/SHR SHL/SHR 移位次数移位次数例如:例如:movmov al,0101b SHL (2

48、al,0101b SHL (2* *2);2);等价于等价于 movmov al,01010000b al,01010000b 以上七种运算可直接对数字进行运算,但对地址的运算,以上七种运算可直接对数字进行运算,但对地址的运算,只用加法和减法才具有实际意义,并且要求进行加、减的两个只用加法和减法才具有实际意义,并且要求进行加、减的两个地址应在同一段内,否则运算结果便不是一个有效地址了。地址应在同一段内,否则运算结果便不是一个有效地址了。 例:这是一个程序的片段,分析算术运算符的使用例:这是一个程序的片段,分析算术运算符的使用。 DATA SEGMENT BUFFER DB 2,3,5,7,4D

49、ATA ENDS CODE SEGMENT MOV AL,BUFFER3 ;将;将BUFFER字节单元以后的第三单元的内容送字节单元以后的第三单元的内容送AL ADD AL,3*2-5 MOD 3 ;将表达式将表达式3*2-5 MOD 3的值和的值和AL的内容相加送的内容相加送AL MOV BL,01010000B SHR 4 ;将二进制数将二进制数01010000右移四次后送右移四次后送BL CODE ENDS2.2.逻辑运算符逻辑运算符 逻辑运算符对其操作数进行逻辑运算符对其操作数进行按位操作按位操作。逻辑运算只能用于数字表达式。逻辑运算只能用于数字表达式中。中。 逻辑运算符有:逻辑运算符

50、有:AND(AND(与与) )、OR(OR(或或) )、XOR(XOR(异或异或) )和和NOT(NOT(非非) )。例:例:MOV AL,0F0H AND 88H ;汇编成;汇编成 MOV AL,80H MOV DH,0F0H OR 88H ;汇编成;汇编成 MOV DH,0F8H AND BL,0F0H XOR 0AH ;汇编成;汇编成 AND BL,0FAH MOV CX,NOT 88H ;汇编成;汇编成 MOV CX,0FF77H 3.3.关系运算符关系运算符 关系运算符有关系运算符有EQEQ( (相等相等) )、NENE( (不相等不相等) )、LTLT( (小于小于) )、GTGT

51、( (大于大于) )、LELE( (小于或等于小于或等于) )、GEGE( (大于或等于大于或等于) )共六种。共六种。 关系运算的结果只可能是两种情况:对两个运算对象进行比较操作,关系运算的结果只可能是两种情况:对两个运算对象进行比较操作,即关系成立或不成立。当关系成立时(即关系成立或不成立。当关系成立时(TRUETRUE) ,运算结果为全运算结果为全1 1,不成,不成立(立(FALSEFALSE)为全为全0 0。例如:例如:MOV AX,2 LT 5; ;2小于小于5关系成立关系成立 ;汇编成;汇编成: MOV AX, 0FFFFH4.4.分析运算符(取值运算符)分析运算符(取值运算符)

52、分析运算符是对存储器地址进行运算的。它可以将存储器地分析运算符是对存储器地址进行运算的。它可以将存储器地址的三个重要属性址的三个重要属性, ,即段、偏移量和类型分离出来,返回到所在即段、偏移量和类型分离出来,返回到所在位置作操作数使用。位置作操作数使用。其操作对象必须是存储器操作数,即变量、其操作对象必须是存储器操作数,即变量、标号或过程名标号或过程名分析运算符共有五个:分析运算符共有五个:SEGSEG、OFFSETOFFSET、TYPETYPE、SIZESIZE和和LENGTHLENGTH使用格式为:取值运算符使用格式为:取值运算符 变量或标号变量或标号 返回的结果是一个数值常量。返回的结果

53、是一个数值常量。 1 1)取段地址运算符取段地址运算符 SEG格式:格式:SEG 该运算返回变量或标号所在段的段地址(字常量)。该运算返回变量或标号所在段的段地址(字常量)。 例:例:MOV AXMOV AX,SEG BUF SEG BUF ;BXBX变量变量BUFBUF的段地址的段地址 2 2)取段内偏移地址符)取段内偏移地址符 OFFSET OFFSET 该运算返回变量或标号所在段的段内偏移地址。该运算返回变量或标号所在段的段内偏移地址。 格式:格式:OFFSET OFFSET 例:设例:设DATA是从存储器实际地址是从存储器实际地址02000H开始的一个数据段,定义如下:开始的一个数据段

54、,定义如下: DATA SEGMENT VAR1 DB 20,30 VAR2 DW 2000H,3000H DATA ENDS 则:则: 1) MOV BX,SEG VAR1 ;汇编成:汇编成: MOV BXMOV BX,0200H0200H 2) MOV CX,SEG VAR2 ;汇编成:汇编成: MOV CXMOV CX,0200H0200H 可见,同段内所有变量的段基址相同,所以用可见,同段内所有变量的段基址相同,所以用SEG求出的数值相等。求出的数值相等。3)MOV AX3)MOV AX,OFFSET VAR1 OFFSET VAR1 ;汇编成汇编成 :MOV AXMOV AX,0 0

55、4)MOV BX4)MOV BX,OFFSET VAR2 OFFSET VAR2 ;汇编成汇编成 :MOV BXMOV BX,2 2 3 3)取类型属性运算符取类型属性运算符 TYPETYPE 格式:格式:TYPE TYPE 该运算返回变量或标号的该运算返回变量或标号的类型值。类型值。 若运算对象是变量,则返回变量类型若运算对象是变量,则返回变量类型所占字节数。所占字节数。 若运算对象是标号,则返回标号的若运算对象是标号,则返回标号的距离属性值距离属性值; 类类 型型类型值类型值 变变 量量 BYTE BYTE 1 1 WORD WORD 2 2 DWORD DWORD 4 4QWORD QW

56、ORD 8 8 TWORD TWORD 10 10 标标号号 NEAR NEAR -1-1补码补码 FAR FAR -2 -2 补码补码5)MOV AL5)MOV AL,TYPE VAR1 TYPE VAR1 ;汇编成汇编成 :MOV ALMOV AL,1 16)MOV BL6)MOV BL,TYPE VAR2 TYPE VAR2 ;汇编成汇编成 :MOV BLMOV BL,2 2 例如:例如:求上例求上例VAR1VAR1、VAR2VAR2的类型值。的类型值。4 4)取数组变量元素个数运算符取数组变量元素个数运算符 LENGTH LENGTH 如果变量是用重复数据操作符如果变量是用重复数据操作

57、符DUPDUP说明的,则返回说明的,则返回DUPDUP前前面的数值(即重复次数);如果没有面的数值(即重复次数);如果没有DUPDUP说明,则返回值总说明,则返回值总是是“1”1”。例例1:若定义:若定义:VAR1 DB 4DUP(1) VAR2 DW 2 DUP(1,2,3)则:则: LENGTH VAR14 LENGTH VAR22例例2:若定义:若定义:VAR1 DB 1,1,1,1 VAR2 DW 1,2,3,1,2,3则则 : LENGTH VAR11 LENGTH VAR21因此因此LENGTHLENGTH运算符只对用运算符只对用DUPDUP定义的变量才有意义定义的变量才有意义。

58、5)取数组变量总字节数运算符取数组变量总字节数运算符 SIZESIZE 该运算符返回复制数组变量所占的总字节数,相当于该运算符返回复制数组变量所占的总字节数,相当于LENGTHLENGTH和和TYPETYPE两个运算符返回值的乘积。两个运算符返回值的乘积。 格式:格式:SIZE 变量变量当当DUP括号内为括号内为 单项数据时,它的值可由下列公式计算:单项数据时,它的值可由下列公式计算: SIZE x LENGTH x * TYPE x SIZE和和LENGTH的功能类似,也是只有用于由的功能类似,也是只有用于由DUP定义的变量定义的变量才才 有意义。有意义。例例1:若定义:若定义:VAR1 D

59、W 5DUP(?) 则:则: SIZE VAR110例例2:若定义:若定义:VAR1 DW ?,?,?,?,?,?,? ,?,? 则则 : SIZE VAR12 5. 属性运算符属性运算符 这种运算符为存储器地址操作数这种运算符为存储器地址操作数临时指定一个新的属性临时指定一个新的属性,而忽略当前的属性,所以又称为属性修改运算符。而忽略当前的属性,所以又称为属性修改运算符。运算符有:运算符有:PTRPTR、段属性前缀、段属性前缀、SHORTSHORT、THISTHIS、HIGHHIGH和和LOWLOW 1) 定义符号类型定义符号类型 PTR格式:格式: PTR PTR 作用:作用: PTRPT

60、R运算符赋予运算符赋予“表达式表达式”指定的指定的“类型类型” 在在PTRPTR表达式中出现的类型表达式中出现的类型可以是可以是BYTEBYTE、WORDWORD、DWORDDWORD、NEARNEAR、FARFAR或结构名称。或结构名称。 PTR PTR右边的地址表达式可以右边的地址表达式可以是标号以及作为地址指针的寄存是标号以及作为地址指针的寄存器、变量和数值的各种组合形式。器、变量和数值的各种组合形式。新的类型只在所处的指令内有效。新的类型只在所处的指令内有效。 例例1:已知内存变量:已知内存变量X1是字型是字型 执行指令执行指令“MOV ALMOV AL,BYTE PRTPRT X1”

温馨提示

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

评论

0/150

提交评论