收藏 分享(赏)

微机原理及应用第4章——汇编语言程序设计.ppt

上传人:hskm5268 文档编号:7800804 上传时间:2019-05-26 格式:PPT 页数:101 大小:310.50KB
下载 相关 举报
微机原理及应用第4章——汇编语言程序设计.ppt_第1页
第1页 / 共101页
微机原理及应用第4章——汇编语言程序设计.ppt_第2页
第2页 / 共101页
微机原理及应用第4章——汇编语言程序设计.ppt_第3页
第3页 / 共101页
微机原理及应用第4章——汇编语言程序设计.ppt_第4页
第4页 / 共101页
微机原理及应用第4章——汇编语言程序设计.ppt_第5页
第5页 / 共101页
点击查看更多>>
资源描述

1、西南交通大学电气学院,第四章 汇编语言程序设计,汇编源程序汇编(过程)手工汇编与机器汇编 汇编程序驻留汇编交叉汇编 宏汇编程序(MASM)小汇编(ASM)必须按严格的语法规则和规定的格式来编写源程序,才能正确汇编成可执行程序。,西南交通大学电气学院,一、完整的汇编语言源程序实例,例 在屏幕上显示字符串“Hello,this is a sample program !”DATA SEGMENT ;数据段MSG1 DB Hello,this is a sample program ! ,0DH,0AH, $ DATA ENDSSTACK SEGMENTST1 DB 100 DUP(?) ;堆栈段S

2、TACK ENDSCODE SEGMENT ;代码段MAIN PROC FARASSUME CS:CODE,DS:DATA,SS:STACKSTART: PUSH DS ;正常返回所需段地址及偏移地址MOV AX,0PUSH AXMOV AX,DATA ;送数据段段地址MOV DS,AXMOV AX,STACK ;送堆栈段段地址MOV SS,AXMOV AH,9 ;DOS 9号功能调用,显示字符串MOV DX,OFFSET MSG1INT 21HRETMAIN ENDPCODE ENDSEND START,西南交通大学电气学院,三段式结构: 数据段、堆栈段、代码段每段均由伪指令SEGMENT开

3、始,ENDS结束。整个源程序用END语句结尾,END后面可跟该程序执行的起始地址START。这里把主程序建立为过程,由DOS调用该过程,进入程序后将DS的内容及0作段地址和偏移地址入栈,以便在程序结束时用RET指令返回DOS。若主程序开始时没有用上面三条指令在堆栈中建立返回信息,则在程序结束时就不能用RET返回指令,而是使用4CH号DOS功能调用,如下所示:MOV AX,4C00HINT 21H,西南交通大学电气学院,二、汇编语言上机过程,1. 源程序的建立调用全屏幕编辑程序EDIT、PE、WS等,源程序文件的扩展名应为 .ASM。也可用WORD来编辑修改,存盘时存为扩展名为 .TXT的文本文

4、档,然后用DOS命令将其改为扩展名为 .ASM即可。2. 汇编用MASM.EXE或ASM.EXE对源文件进行汇编: 检查源程序中语法错误,给出出错信息; 产生目标文件(.OBJ文件)、列表文件(.LST文件)和对照文件(.CRF文件); 展开宏指令。如一个EXAMPLE.ASM源程序的汇编过程及屏幕显示如下:C:MASM EXAMPLE;,西南交通大学电气学院,3. 连接汇编程序产生的二进制目标文件(.OBJ文件)仍然不可执行,必须经过连接,将它转换成 .EXE文件才可执行,连接程序为LINK.EXE,它可以把多个模块连接在一起,这些模块可以是库文件或汇编程序产生的目标文件。连接过程如下:C:

5、LINK EXAMPLE;如果连接多个目标文件,将多个目标文件名一次输入,中间用加号“”连接。 源程序没有堆栈段,连接结果给出无堆栈段的警告错误,但不影响程序执行。 如果需要,可用EXE2BIN文件将 .EXE文件转换成 .COM文件,.COM文件也是可运行文件。,西南交通大学电气学院,第二节 汇编语言程序格式,1指令性语句指令性语句与机器指令相对应,指令性语句格式为:标号: 指令助记符 操作数,操作数 ;注释2伪指令语句伪指令语句没有对应的机器指令,汇编程序汇编源程序时对伪指令进行处理,它可完成数据定义、存储器分配、段定义、段设定、指示程序结束等功能。格式为:名字 伪指令指示符 操作数,操作

6、数 ;注释3宏指令语句宏指令语句由标号、宏指令和注释组成。宏指令是由编程者按一定的规则来定义的一种较“宏大”(MACRO)的指令。一条宏指令可包括多条指令或伪指令语句。使源程序书写精炼、可读性好。,西南交通大学电气学院,4数据项汇编语言中使用的操作数,可以是常数、寄存器、存储器、变量、标号或表达式,其中常数、变量和标号是三种基本数据项。(1) 常数常数必须是固定值,没有属性,是确定的数据。(2) 变量变量通常指存放在存储单元中的值,在程序运行中是可以修改的。,西南交通大学电气学院,所有的变量都具有三个属性: 段属性(SEGMENT) 指变量所在段的段基址,它必须在一个段寄存器中。 偏移属性(O

7、FFSET) 指变量所在地址与所在段的段首地址之间的地址偏移字节数。 类型属性(TYPE) 变量的类型属性指变量中每个元素所包含的字节数,类型包括字节变量(BYTE)、字变量(WORD)及 双字变量(DWORD)等。,西南交通大学电气学院,(3)标号标号是可执行指令语句的地址的符号表示,它可作为转移指令和调用指令CALL的目标操作数,以确定程序转向的目标地址,它也具有三个属性: 段属性(SEGMENT) 标号所在段的段基址。标号的段是它所出现的那个代码段,所以由CS指示。 偏移属性(OFFSET) 标号所在地址与所在段的段首址之间的偏移地址字节数。 类型(TYPE) 标号的类型属性指在转移指令

8、中标号可转移的距离,也称距离属性。类型NEAR,只能实现本代码段内转移或调用;类型FAR,可以作为其它代码段中的目标地址,实现段间转移或调用。,西南交通大学电气学院,(4)保留字保留字是一个汇编语言中预先保留下来的具有特殊含义的符号,只能作为固定的用途。凡是8086的指令、伪指令、寄存器名等都是保留字。因此,标号、变量名、段名、过程名、符号名等都不能使用保留字。,西南交通大学电气学院,第三节 程序块定义伪指令,一、程序分段定义伪指令1. 段定义伪指令SEGMENTENDS段定义伪指令SEGMENTENDS用于段的定义。用它来指定段的名称和范围,并指明段的定位类型、组合类型和类别,其格式为:段名

9、 SEGMENT 定位类型 组合类型 类别 ;段内语句序列段名 ENDSSEGMENT后面可以带有三个参数: 定位类型、组合类型、类别,三个参数必须按格式中规定的次序排列,类别必须用单撇号 撇起来。三个参数用来增加类型及属性说明,可缺省,但8086宏汇编有一缺省值。如需要用连接程序把本程序与其它程序相连时,需要用到这些参数。,西南交通大学电气学院,(1) 定位类型,用来规定对段起始边界的要求,可以有4种选择: PAGE 段起始地址的最低8位必须为0,即从一页(PAGE)的起点开始。 起始地址00000000 PARA 段起始地址的最低4位必须为0,即从某一节(PARAGRAPH)的边界开始。起

10、始地址0000 WORD 段起始地址的最低位必须为0, 从偶地址开始。起始地址0 BYTE 段起始地址为任意值,即从任何字节开始都行。起始地址若定位类型缺省,则缺省值为PARA。,西南交通大学电气学院,(2) 组合类型,表示本段与其它段的关系,为连接程序提供信息的,可以有6种选择: NONE 表示本段与其它段逻辑上不发生关系,每段都有自己的基地址。这是缺省的组合类型。 PUBLIC 连接程序首先将本段与其它同名同类别的段相邻地连接在一起,然后为所有这些PUBLIC段指定一个共同的段基址。 STACK 与PUBLIC同样处理,但此段作为堆栈段。当多个程序模块连接在一起时,各模块中至少有一个模块内

11、有一个STACK段。,西南交通大学电气学院,COMMON 连接程序为本段和其它同名同类别的段指定相同的段基址。因而这些段是相互重叠的。段的长度取决于最长的COMMON段的长度。 AT表达式 连接程序的把本段装在表达式的值所指定的段地址上(表达式的值应为16位)。但这种方式不能用来指定代码段。 MEMORY 连接程序将把本段定位在被连接在一起的其它所有段之上。若有多个MEMORY段,汇编程序认为所遇到的第一个为MEMORY,其余为COMMON。,西南交通大学电气学院,(3) 类别,这是编程者给各段赋予的一种名字信息。连接程序将类别名相同的段组成一个段组,用它们共同的类别名作为这个段组的名字。类别

12、必须用单撇号撇起来。通常使用的类别有 STACK、 CODE 、 DATA 等等。,西南交通大学电气学院,2. 段指示伪指令ASSUME,汇编语言程序要能正确执行,一大前提是要为它设置正确的运行环境。ASSUME伪指令便是用来指示程序中各实际的段与各段寄存器之间的关系的。其格式为:ASSUME 段寄存器名:段名 ,段寄存器名:段名,其中,段名为程序中已定义过的任何段名或组名,也可以是表达式“SEG变量”或“SEG标号”,或者关键字NOTHING。NOTHING表示以前为段寄存器所作的指示已被取消,以后程序运行时不再需要该寄存器,除非再用ASSUME给其重新定义。,西南交通大学电气学院,注意:

13、使用ASSUME伪指令,仅仅告诉汇编程序哪个段寄存器设定指向哪一个段,并没有给各段寄存器装入实际的值。而段地址的真正装入还必须通过给段寄存器赋值的执行性指令来完成。所以在程序的操作部分,要用指令来完成给段寄存器赋初值。例如:CODE SEGMENTASSUME CS:CODE,DS:DATA,ES:NOTHING,SS:STOCKMOV AX,DATAMOV DS,AX,西南交通大学电气学院,一般地,由ASSUME指示过的段寄存器都应赋值。但CS寄存器是一个例外,CS值是由DOS把 .EXE模块装入内存时自动设定的,而不能用上述方式装入段地址值,但ASSUME伪指令中一定要给出CS段寄存器对应

14、的正确段名ASSUME伪指令所在段的段名。对堆栈段若不指示不赋值,此时利用的是系统设置的堆栈。,西南交通大学电气学院,3. 分组伪指令GROUP,GROUP是群或组的意思,它用来把程序块中若干不同名的段集合成一个组,并赋予一个组名,使它们都装入一个物理段中(64KB)。这样,组内各段间的转移都可以看作段内转移。GROUP伪指令的格式如下:组名 GROUP 段名1,段名2,其中段名也可为表达式: “SEG 变量名”或“SEG 标号” 。,西南交通大学电气学院,4. 定位伪指令ORG和当前位置计数器$,汇编程序对源程序中的段进行汇编处理时,将段名填入段表,同时为该段配备一个初值为0的位置计数器。为

15、了能够改变该位置计数器的内容,格式如下:ORG 表达式该指令把位置计数器的值设置成表达式的值。汇编程序以此值作为起始地址,连续存放程序和数据,直到出现一个新的ORG指令。若省略ORG,则从本段起始地址开始连续存放。,西南交通大学电气学院,表达式的值应该是非负的整数,而且要保证计数器指针定位在065535之间。下面是使用ORG伪指令语句的例子:CSEG SEGMENTORG 2 ;目标代码从0002H开始产生ORG $3 ;跳过三个字节后生成目标代码CSEG ENDS其中,$表示位置计数器的当前值,它可以在表达式中使用,它的值是程序下一个所能分配的存储器单元的偏移地址。,西南交通大学电气学院,5

16、. 程序结束伪指令END,格式: END 标号名功能: 标记汇编源程序结束。END是伪指令助记符,不可缺省,放在源程序的最后一行,每个模块只有一个END。汇编程序到END语句停止汇编。标号名是该程序中第一条可执行语句的标号名,可以缺省,若一个程序包含多个模块,END后面带的标号为主程序模块中的标号名称。,西南交通大学电气学院,6. 文件标题伪指令TITLE,格式: TITLE 文本名功能: 将文本名赋给源程序目标模块作名字。TITLE是伪指令助记符,文本名可写60个字符,但汇编程序只将前6个字符作为模块名,在列表文件中打印出标题来。,西南交通大学电气学院,二、过程定义伪指令PROCENDP,在

17、程序设计中,往往将一些重复出现的语句组定义为子程序。子程序又称为过程,可由CALL指令来调用。过程定义的格式为:过程名 PROC NEARFAR ;语句序列RET n ;语句序列过程名 ENDP,西南交通大学电气学院, 过程名是由用户设定的标识符,在程序中可以作为标号使用。 PROC和ENDP必须成对出现。 每一过程中至少得有一个RET n语句,n可缺省,整个过程执行的最后一条语句必须是 RET n。 过程的类型有NEAR和FAR。缺省为NEAR类型。 过程可以“嵌套”使用,即过程又可以调用别的过程。 过程还可以“递归”使用,即过程又可以调用过程本身。,西南交通大学电气学院,SEGX SEGM

18、ENTSUB1 PROC FARCALL SUB2 ;过程“嵌套”RETSUB1 ENDPSUB2 PROC NEARRETSUB2 ENDPCALL FAR PTR SUB1 ;段内调用但要用段间调用来实现SEGX ENDSSEGY SEGMENTCALL FAR PTR SUB1 ;段间调用SEGY ENDS,西南交通大学电气学院,三、程序块间通信伪指令PUBLIC和EXTRN,汇编语言程序设计可采用多模块结构,在多模块间相互访问时,应在每一模块内交待清楚以下两方面信息: 本模块内定义的变量和标号(包括过程名),哪些可以作为外部标识符被其它模块访问?这是PUBLIC的功能。 本模块将访问哪

19、些外部标识符?这是由EXTRN提供的。,西南交通大学电气学院,格式:PUBLIC 符号1,符号2,EXTRN 符号1:类型,符号2:类型,其中符号可以是符号常数、变量、标号或过程名。在一个模块内或者一个段内由PUBLIC定义过的符号,可以在别的模块或段内直接引用;EXTRN说明本模块中使用的符号已在别的模块或段内定义过。类型可以是: BYTE、WORD、DWORD;NEAR、FAR等。当然,这里所有符号的类型必须和它们在其它模块内定义的类型保持一致。,西南交通大学电气学院,分别汇编下面两个程序、。 EXTRN RECEIVE:FAR SUBSEG SEGMENT CSEG SEGMENT RE

20、CEIVE PROC FAR START PROC FAR PUBLIC RECEIVE CALL RECEIVE RET RECEIVE ENDP START ENDP CSEG ENDS SUBSEG ENDSEND END程序中无RECEIVE子程序,由EXTRN声明来自外部;程序声明RECEIVE此子程序可以共享。,西南交通大学电气学院,第四节 MASM中的表达式和运算符,MASM中使用了6类运算符,即:算术运算符、逻辑运算符、关系运算符、数值返回运算符、修改属性运算符和其它运算符。1算术运算符算术运算符完成算术运算,它包括(加法)、(减法)、*(乘法)、(除)、MOD(求余)以及SH

21、L(左移,左移1位相当于乘2)和SHR(右移,右移1位相当于除2)共七种运算。以上七种运算可直接对数字进行运算,但对地址的运算,只用加法和减法才具有实际意义,并且要求进行加、减的两个地址应在同一段内,否则运算结果便不是一个有效地址了,对地址乘是没有意义的。 通常是在标号上加/减某一个数字量,例如DA1+2、K2-3各表示一个存储单元的地址。,西南交通大学电气学院,DATA SEGMENTBUFFER DB 2,3,5,7,4DATA ENDSCODE SEGMENTMOV AL,BUFFER+3 ;将BUFFER字节单元以后的第三单元的内容送ALMOV AH,3*25 MOD 3 ;将表达式3

22、*25MOD 3的值送ALMOV BH,010lB SHL 4 ;将二进制数0101B左移四次后送BHMOV BL,01010000B SHR 4;将二进制数01010000B右移四次后送BLCODE ENDS,西南交通大学电气学院,2逻辑运算符,逻辑运算符对其操作数进行按位操作。逻辑运算符有: AND(与)、OR(或)、XOR(异或)和NOT(非),其中NOT是单操作数运算符,其它是双操作数运算符。 MOV AX,0FF00H AND 10AEH ;将两个数相“与”的结果送AX汇编成: MOV AX,1000H AND CX,00FFH AND 10AEH ;将表达式的值算出后,再和CX相“

23、与”汇编成: AND CX,00AEH,西南交通大学电气学院,从以上两例可看出: 逻辑运算是在汇编时完成的,表达式的值由汇编程序确定,不影响标志位,而逻辑指令是在程序执行时完成逻辑操作的。 0FF00H和00FFH与一个16位数相“与”,可以分别提取其高8位和低8位,这种技术通常称为“屏蔽”。,西南交通大学电气学院,3关系运算符,关系运算符有EQ(相等)、NE(不相等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)共六种。关系运算都是双操作数运算,它的运算对象只能是两个性质相同的项目。对两个性质不同的项目进行关系运算是无意义的。关系运算的结果只可能是两种情况: 即关系成立

24、或不成立。当关系成立时,运算结果为0FFFFH,否则为0。,西南交通大学电气学院, MOV AX,2 LT 5 汇编成: MOV AX,0FFFFH ;2小于5关系成立 MOV AX,2 GT 5汇编成: MOV AX,0 ;2大于5关系不成立AND AX,(NUMB LT 5) AND 30) OR (NUMB GE 5) AND 20)当NUMB5时,汇编成 AND AX,30NUMB5时,汇编成 AND AX,20AND出现在操作符位置是助记符,出现在操作数位置是伪指令。,西南交通大学电气学院,4数值返回运算符,数值返回运算符是对存储器地址进行运算的。它可以将存储器地址的三个重要属性,即

25、段、偏移量和类型分离出来。数值返回运算符共有五个: SEG、OFFSET、TYPE、SIZE和LENGTH,其中SIZE和LENGTH只对数据存储器地址操作数有效。(1) SEG格式: SEG 变量名或标号名SEG用来求取一个变量或标号的段基址。,西南交通大学电气学院,例 DATA是从存储器实际地址02000H开始的一个数据段如下:DATA SEGMENTVAR1 DB 20,30VAR2 DW 2000H,3000HVAR3 DD 22002200H,33003300HDATA ENDS MOV BX,SEG VAR1 汇编成: MOV BX,0200H MOV CX,SEG VAR2 汇编

26、成: MOV CX,0200H MOV DX,SEG VAR3 汇编成: MOV DX,0200H,西南交通大学电气学院,(2) OFFSET格式: OFFSET 变量名或标号名OFFSET运算符返回一个变量或标号的段内偏移地址值,是程序设计中常用的运算符。例对上例中定义的数据段,用OFFSET可以求出VAR2的段内偏移地址。MOV BX,OFFSET VAR2汇编成: MOV BX,2 ;变量VAR2的偏移量为2汇编程序将变量的偏移地址送到BX中,相当于指令:LEA BX,VAR2,西南交通大学电气学院,(3) TYPE,格式: TYPE 变量或标号TYPE运算符可加在变量或标号的前面,所求

27、出的是这些存储器操作数的类型值。 TYPE加在变量前面返回的是这个变量的字节数。对于前例中定义的数据段,则:TYPE VAR11TYPE VAR22TYPE VAR34 TYPE加在标号的前面, 返回该标号的属性是1(NEAR) 或是2(FAR)。,西南交通大学电气学院,(4) LENGTH,LENGTH运算符确定返回其后的变量所含的数据元素的个数,即以变量类型(字节、字或双字)为单位的数据存储单元的个数。格式为: LENGTH 变量LENGTH的取值,根据定义变量时,数据定义伪指令助记符后面第一个表达式的形式来确定。如果助记符后面的第一个表达式为重复子句“n DUP(简单表达式)”,则取值为

28、n,如果是其它形式表达式,则返回的结果都是1。,西南交通大学电气学院,DATA SEGMENTN1 DW 10 DUP(0),2367H,3 DUP(1)N2 DB BASIC ,8 DUP(0)N3 DW 20,5 DUP(2)DATA ENDSCODE SEGMENTMOV AL,LENGTH N1 ;10ALMOV BL,LENGTH N2 ;1BLMOV CL,LENGTH N3 ;1CLCODE ENDS,西南交通大学电气学院,(5) SIZE,SIZE确定返回其后的变量所含的字节存储单元的总数。格式为: SIZE 变量SIZE返回的值是LENGTH返回的值与TYPE返回的值的乘积,

29、即:SIZE 变量LENGTH变量 * TYPE变量SIZE N1LENGTH N1*TYPE N110*220SIZE N21 * 11SIZE N31 * 22,西南交通大学电气学院,5属性修改运算符,这种运算符为存储器地址操作数临时指定一新的属性,而忽略当前的属性,故称为属性修改运算符。共有六个属性修改运算符: PTR、段超越(属性)前缀、SHORT、THIS、HIGH和LOW。(1) PTRPTR用来生成一个新的存储器地址操作数,并不实际分配存储器。格式: 类型 PTR 存储器地址表达式,西南交通大学电气学院,PTR将它左边的类型指定给右边的地址表达式。新的类型由PTR指定,以前的类型

30、则由定义此存储单元时的伪指令(DB、DW等)确定。在PTR表达式中出现的类型可以是BYTE、WORD、DWORD、NEAR、FAR等。VAR1 DW 2030H 此时,VAR1的当前类型为WORD。应用1: 用PTR建立新的变量VAR2和VAR3VAR2 EQU BYTE PTR VAR1VAR3 EQU BYTE PTR VAR1+1VAR1与VAR2为同一存储单元,但类型却不同。TYPE VAR12 ;VAR1是字型的TYPE VAR21 ;VAR2是字节型的,西南交通大学电气学院,(2)段超越前缀格式: 段寄存器名:地址表达式例如,MOV AX,ES:BX+SI以上是常用的段超越的情况。

31、本运算符还有两种形式:段名:地址表达式组名:地址表达式,西南交通大学电气学院,(3)SHORT本运算符用来修饰JMP指令中转移地址的属性,指出转移地址是在下一条指令地址的-128+127个字节范围之内。格式: SHORT 标号 例如:JMP SHORT TAGTAG: 则标号TAG与JMP指令的距离不能大于127个字节。,西南交通大学电气学院,(4)THISTHIS运算符像PTR一样,可以用来建立一个特殊类型的存储器地址操作数,而不实际为它分配新的存储单元。用THIS建立的存储器地址操作数的段和偏移量部分与目前所能分配的下一个存储单元的段和偏移量相同,但类型由THIS指定。格式: THIS 类

32、型凡是在PTR中可以出现的类型,在THIS中也允许出现。,西南交通大学电气学院,应用1: 提高访问变量的灵活性。VAR2 EQU THIS BYTEVAR1 DW 2030H 此时,VAR1和VAR2的段基址和偏移量都相同,但它们的类型不同,即TYPE VAR12TYPE VAR21,西南交通大学电气学院,(5) HIGH和LOW,HIGH和LOW被称为字节分离符。它们将一个16位的数或表达式的高字节和低字节分离出来。例COUNT EQU 2030H ;COUNT为一个符号常数,它等值于2030H。则: MOV AH,HIGH COUNTMOV AL,LOW COUNT汇编成:MOV AH,2

33、0HMOV AL,30H,西南交通大学电气学院,6其它运算符,其它运算符有( )、 、 、MASK和WIDTH等6种。(1) 圆括号( )圆括号用来改变运算符的优先级别, ( )中的运算符具有最高优先权。(2) 方括号 方括号主要用来表示地址表达式或多重变量的下标值。 用 表示地址表达式; 用 来表示多重变量的下标值。(3) 尖括号及圆点 和 运算符在结构中专用,具体说明在结构中解释。(4) MASK和WIDTHMASK和WIDTH运算符在记录中专用。,西南交通大学电气学院,优先级 运 算 符,高 1.()、中的项目,LENGTH,SIZE,WIDTH,MASK2.段超越前缀运算符3.PTR,

34、OFFSET, SEG, TYPE, THIS4.HIGH,LOW5.* ,MOD,SHL,SHR6.+,-7.EQ,NE,LT,LE,GT,GE8.NOT9.AND10.OR,XOR 低 11.SHORT,西南交通大学电气学院,第五节 伪指令及宏指令,一、数据定义及存储器分配伪指令格式: 变量名 DB/DW/DD/DQ/DT , ;注释其中,变量名是任选项,它代表所定义的第一个单元的地址。注释也是任选的。DB 定义字节变量, 占一个字节。DW 定义字变量, 二个字节。DD 定义双字变量, 占四个字节。DQ 定义四字变量, 占八个字节。DT 定义十个字节, 占十个字节。,西南交通大学电气学院,

35、表达式可以是常数、数值表达式、地址表达式、字符串和数据表格。地址表达式只适用于DW和DD两条伪指令,如果该地址表达式为一变量(或标号)名,DW取其偏移地址来初始化变量;DD取其逻辑地址来初始化变量(两个字)。 VAR2 DW VAR1 ;取VAR1的偏移地址来初始化VAR2 VAR3 DW VAR4 ;取VAR1的偏移地址4来初始化VAR3 VAR4 DW VAR4 ;取VAR4自己的偏移地址来初始化自己 VAR5 DD VAR5 ;取VAR5自己的逻辑地址来初始化自己,西南交通大学电气学院,用DUP定义重复数据,格式为:变量名 DBDWDDDQDT n DUP (初值)以初值(确定或不确定)

36、初始化n个存储单位。n表示要重复的次数,可以是n0的数值表达式或常数;初值必须以圆括号括起来,表示要重复的内容。它可以是下列的内容之一: 一个问号?,表示只分配存储单元,但无 确切的初值; 一个数据项表格; 一个数值表达式或地址表达式。,西南交通大学电气学院,DATA SEGMENT ARRAY1 DB 2 DUP (0,1,?)ARRAY2 DW 100 DUP (?)ARRAY3 DB 20 DUP(0,1,4 DUP(2),5)DATA ENDS,西南交通大学电气学院,DATA SEGMENT AT 55HZERO DB 0ONE DW ONETWO DD TWOFOUR DW FOUR

37、5SIX DW ZEROTWOATE DB 5 * 6DATA ENDS,西南交通大学电气学院,二、符号定义伪指令EQU和,1. EQU伪指令格式: 符号名 EQU 表达式其中,符号名应为一个有效的标识符;表达式可以是任何有效形式的表达式、常数、寄存器名甚至是一个有效的指令助记符。此伪指令并不申请分配内存,其功能为:为常数定义一个符号,便于修改,如:ONE EQU 1TWO EQU 2SUM EQU ONETWO ;SUM为3,西南交通大学电气学院,给变量或标号定义新的类型属性并取一个新名字,如:BYTES DB 4 DUP(?)FIRST_W EQU WORD PTR BYTESFIRST_

38、DW EQU DWORD PTR BYTES 给由地址表达式指出的任意存储单元定义一个名字。格式: 符号名 EQU 地址表达式XYZ EQU BP+3A EQU ARRAYBXSIP EQU ES:ALPHA,西南交通大学电气学院,用来给汇编语言中的任何符号定义一个新名字。格式: 新名字 EQU 原符号名COUNT EQU CXLD EQU MOV在使用EQU时,请注意: 一个符号一经EQU赋值之后,在整个程序中,这个符号不能重新再赋值。鉴于这一点,给编程带来了一些不便。因此,8086宏汇编语言还设置了一个“”伪指令。,西南交通大学电气学院,2. 伪指令,其功能与EQU相似,很多情况下可以相互

39、代替,并且打破了EQU的上述限制,即经赋值符号是可以重新定义的。例如:COUNT EQU 20COUNT EQU 20+1 ;但: COUNT20COUNT20+1 ;设LAB1是代码段的一个标号,由于EQU语句中不允许标号出现,所以,下列语句是错误的:LAB2 EQU LAB1+10 ; 但:LAB2LAB1+10 ; ,西南交通大学电气学院,三、LABEL伪指令,LABEL伪指令用于在原来变量的基础上定义一个类型不同的新的变量,或在原来标号基础上定义一个类型不同的新的标号。格式: 变量名或标号名 LABEL 类型变量的类型有BYTE、WORD和DWORD,标号的类型有NEAR和FAR。,西

40、南交通大学电气学院,例用LABEL定义变量。VAR1 LABEL BYTEVAR2 DW 10 DUP(?)VAR1是一个字节型变量,它的开始地址总是与它下面可以分配的第一个存储单元的地址相同。VAR1和VAR2地址相同,但类型不同,VAR1是字节型变量,而VAR2是字型变量。,西南交通大学电气学院,下列三种情况的作用相同:,(1)GO1 LABEL FARGO: 则有: JMP GO ;段内转移JMP GO1 ;段间转移(2)GO1 EQU THIS FARGO: 则有: JMP GO ;段内转移JMP GO1 ;段间转移(3)GO: 则有: JMP GO ;段内转移JMP FAR PTR

41、GO ;段间转移,西南交通大学电气学院,四、结构定义伪指令STRUCENDS,结构就是相互关联的一组数据的某种组合形式。使用结构一般需三个步骤: 定义结构类型; 建立结构变量; 引用结构。1. 结构的定义用伪指令STRUC和ENDS把相关数据定义语句组合起来,便构成一个完整的结构。格式:结构名 STRUC ;数据定义语句序列结构名 ENDS,西南交通大学电气学院,对于学生成绩情况,可定义一个结构STUDENT:STUDENT STRUCNAME1 DB ABCD NO DB ?ENGLISH DB ?MATHS DB ?PHYSIS DB ?STUDENT ENDS其中,STUDENT叫做结构

42、名,结构内数据定义语句中的变量名叫做结构字段名,如NAME1、NO、ENGLISH、MATHS和PHYSICS都是结构字段名。,西南交通大学电气学院,应当注意:结构仅仅是一种数据结构的模式,并不为它分配实际的存储单元和赋值,故称为形式参数,它仅仅告诉汇编程序存在着这样一种形式的数据结构。因此,使用结构之前仅定义是不够的,还必须进行预置,即分配实际的存储单元并赋值。2. 结构的预置(建立)对结构进行预置的格式如下:结构变量名 结构名 其中:结构名是结构定义时用的名字。,西南交通大学电气学院,结构变量名是程序中具体使用的变量,它与具体的存储空间及数据相联系,程序中可直接引用它。 字段值表用来给结构

43、变量赋初值,表中各字段的排列顺序及类型应与结构定义时一致,各字段间以逗号分开。通过结构预置语句,可以对结构中某些字段进行初始化。但初始化时有一定的限制和规定: 在结构定义中具有一项数据的字段才能通过预置来代替初始定义时的值,而用DUP定义的字段或一个字段后有多个数据项的字段,则不能在预置时修改其定义时的值。,西南交通大学电气学院,DATA STRUCA1 DB 29H ;简单元素,可以修改A2 DB 20,30 ;多重元素,不能修改A3 DW ? ;简单元素,可以修改A4 DB ZXC ;可用同长度的字符串修改A5 DW 20 DUP(?) ;多重元素,不能修改DATA ENDS,西南交通大学

44、电气学院,各字段的排列顺序及类型应与结构定义时相一致,以“,”分隔。若某些字段的内容采用定义时的初值,则在预置语句中这些字段的位置仅写一个逗号即可。若所有的字段都如此,则仅写一对尖括号即可。在任何时候不可省略。如果所替换或者以“,”保留的形参少于结构字段的总和,则其后的形参也被确认为实参。字符串的处理:多于形参定义的串长度则截去,少于串长度的后面补空格。,西南交通大学电气学院,3. 结构的引用,程序中引用结构变量,则和其它变量一样,可直接写结构变量名。若要引用结构变量中的某一字段,则采用如下形式:结构变量名 结构字段名或者,先将结构变量的起始地址的偏移量送某个地址寄存器,再用:地址寄存器 结构

45、字段名例如,若要引用结构变量S1中的ENGLISH字段,则以下两种用法都是正确的; MOV AL,S1 ENGLISH MOV BX,OFFSET S1MOV AL,BX ENGLISH,西南交通大学电气学院,五、记录定义伪指令RECORD,描述一个开关量,只有“开”和“关”两种状态,用一位二进制就可以代表了。但是就目前对存储器的分配而言,最小单位是字节,用一个字节描述一个开关量,十分浪费。记录和结构是相似的,只不过结构是用于定义和处理以字节为计算单位的信息组,而记录则是用于定义和处理以位为计算单位的信息组。记录是一种由多个字段组成的8位(字节)或16位(字)的数据类型。通常,使用记录有以下三

46、个步骤: 定义记录类型; 建立记录变量; 引用记录。,西南交通大学电气学院,1. 记录的定义,和结构一样,使用记录之前要对它进行定义。定义的目的在于告诉汇编程序,本记录的各个组成部分的宽度和意义。格式:记录名 RECORD 字段名:宽度 表达式,其中:记录名和字段名是必写的。一个记录至少得有一个字段,若有多个字段,字段间用逗号分隔。宽度代表相应字段所占的位数,取值116位。宽度后的表达式是任选项,它是给相应字段赋 的初值。表达式的值应是一个该字段能容纳下的正整数,若缺省,该字段的初值为0。,西南交通大学电气学院,关于字段的宽度和记录的总宽度,有几点需要说明如下: 各字段的宽度之和应在116之间

47、。 如果记录的总宽度大于8位,那么汇编程序将该记录按字处理,否则按字节处理。 如果记录的总宽度少于8位或16位,那么所有字段就靠右对齐到字节或字的最低有效位置。 如果某字段的位数为7(或8),则可定义为一个字符。,西南交通大学电气学院,例如,某工作人员的情况可用一个记录来描述。工龄占6位,性别占1位(0表示男,1表示女),健康状态占1位(0表示健康,1表示不健康)。可定义记录如下:BTRC RECORD YER:6,SEX:1,STAU:10,西南交通大学电气学院,2. 记录的预置,由预置语句定义出一些具体的记录型的变量。通过对这些记录变量的引用,才能使用记录这种数据结构。格式:记录变量名 记录名 沿用上面定义的BTRC记录,设有一工作人员的工龄为13年,用001101B表示;性别为女,用1表示;健康状态为0,表示健康,则这个工作人员的记录预置如下:ZHA BTRC 这样,存储器中便分配了一个字节,存放有ZHA记录变量的信息,内容为36H。WAN BTRC ;记录变量WAN的内容为43HARRAY BTRC 100 DUP () ;以初值预置100个记录,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报