收藏 分享(赏)

第6章--汇编语言程序格式及伪指令.ppt

上传人:无敌 文档编号:85052 上传时间:2018-03-11 格式:PPT 页数:87 大小:419.02KB
下载 相关 举报
第6章--汇编语言程序格式及伪指令.ppt_第1页
第1页 / 共87页
第6章--汇编语言程序格式及伪指令.ppt_第2页
第2页 / 共87页
第6章--汇编语言程序格式及伪指令.ppt_第3页
第3页 / 共87页
第6章--汇编语言程序格式及伪指令.ppt_第4页
第4页 / 共87页
第6章--汇编语言程序格式及伪指令.ppt_第5页
第5页 / 共87页
点击查看更多>>
资源描述

1、第6章 汇编语言程序格式及伪指令,本章要求: 了解汇编程序功能; 掌握常用汇编伪操作及汇编语言格式; 开始汇编语言工具使用和简单程序的编写(上机实验) 。,6.1 汇编程序功能,程序运行步骤及生成的文件,6.2汇编语言源程序的格式 为了汇编程序MASM(或ASM)能够正确地把ASM源程序翻译成OBJ目标程序,编写一个规范的汇编语言源程序就显得特别的重要: 汇编语言的语句格式及其组成; 指令语句的组成及各成分的书写规定; 伪指令(指示性语句)的种类,书写格式的规定及其用法; 宏指令语句的基本形成和用法; 汇编语言源程序的分段结构的书写格式规定等。 我们编写的源程序需要机器翻译(而不是手工翻译),

2、那伪指令几乎和指令系统中常用的指令占有同等重要的位置。,6.2.1 汇编语言语句的类型 为了对语句、伪指令、表达式等一些常用的规定进行说明,这里先举一个完整源程序的例子。 【例】 在数据段中,变量WEEK存储星期一至星期日的英文缩写,DAY单元中用数17分别表示星期一到星期日,程序根据DAY的内容显示对应星期几的英文缩写。 汇编语言的源程序为: DATA SEGMENT WEEK DB MON, YUE, WED, THU, FRI, SAT, SUN DAY DB 6 DATA ENDS ;- STAK SEGMENT STACK DW 30 DUP(?) STAK ENDS ;-,CODE

3、 SEGMENTASSUME CS:CODE,DS:DATA GO: MOV AX,DATAMOV DS,AX ;设置DSXOR BX,BX ;BX清零 MOV BL,DAY ;取日期 DEC BL MOV DL,BL SHL BL,1 ADD BL, DL MOV CX,3 MOV AH,2 ;显示一个字符 LOP: MOV DL,BX INT 21H INC BX LOOP LOP DONE: MOV AH,4CH ;结束程序,返回DOS INT 21H CODE ENDS END GO,从当前例子可以看出:汇编语言的源程序是分段的,并由若干段组成,本例有三个段(数据段、堆栈段和代码段),

4、每个段都有一个名字(段名),以伪指令SEGMENT作为段的开始,以伪指令ENDS作为段的结束,这两者前后段名都必须有完全相同的名字;源程序可写成一般格式: NAME1 SEGMENT NAME1 ENDS NAME2 SEGMENT NAME2 ENDS NAME3 SEGMENT NAME3 ENDS END标号,每个段由若干条语句行组成,而语句就是完成一种规定操作的说明。源程序中的语句可以分成两类:指令语句和指示性(伪指令)语句,宏指令语句是指令语句的另外一种形式。,语句类型 指令语句:汇编程序汇编时会把指令语句翻译成机器代码,是可执行的指令,也就是IBM-PC指令系统中的指令。这些指令代

5、码命令CPU执行某些操作,如MOV、SUB,JNZ等。它们是在程序运行时执行。 指示性语句(伪指令):汇编程序并不会把它们也绝不可能把它们翻译成机器代码。而是指示、引导汇编程序在汇编过程中做一些操作,是给汇编程序翻译时提供信息,如一个段的起止、符号地址(标号和变量)、给符号赋予具体数值、将一些数据放入指定的存储单元中、在存储器中留一些空单元等等,如: COUNT EQU 100 这条伪指令告诉汇编程序COUNT定义一个立即数,当汇编程序遇到指令语言MOV CX,COUNT时,将COUNT用100 (即64H)代替。 伪指令是在汇编程序运行时执行,一旦形成目标程序,那伪指令的作用就完成了。,宏指

6、令语句:它是将一个程序段,也就是把若干条指令语句用一条宏指令语句来代替。而在汇编程序汇编时,还需将它翻译为一条条机器目标代码指令。 指令与伪指令的格式是相似的,指令语句格式为: 标号: 助记符 操作数1,操作数2 ;注释 指示性语句的格式为: 名字 命令 参数1,参数n;注释 在一个指令语句中的标号后面必须要跟有冒号(:),而指示性语句的名字后面没有冒号,这是两种语句在格式上的主要区别。 标号与指令地址的符号名相联系,标号可以作为转移指令和子程序调用指令的目标操作数(转移目标地址)。 指示性语句中的名字与指令的转移地址毫无关系,因此,条件转移指令和子程序调用指令的目标操作数绝不能用指示性语句的

7、名字。,6.2.2 汇编语言语句的格式 汇编语言源程序中,每个语句可以由四项组成,其格式为: NAME operation operand ;comment 名字项 操作项 操作数项 ;注释项 其中名字项是一个符号(标号或变量),操作项是一个操作码的助记符,可以是指令、伪指令或宏指令名,名字项与操作项、操作项与操作数项之间至少有一个空格。 操作数项由0个或多个操作数组成,它为执行的操作提供原始数据和结果数据的存储所在,操作数项之间用逗号分隔。 注释项用来说明程序或语句完成的功能。分号(;)是识别注释项的开始,也作为注释项与操作数项的分界符。注释项可以占据一个完整的行,常用来说明下面一段程序的功

8、能,或作为修饰源程序中的段分界。在某语句前加分号(;)相当于注销该语句。,1名字项 名字项也称为标识符(Identifier),指令语句中的标号和伪指令语句中的符号名统称为标识符。它们是由若干字符构成的,其组成规则为: 1) 字符个数131个,尽量取有含义字符少的名字; 2) 标识符的第一个字符必须是字母、问号“?”、“”、下划线“_”这四种字符中的一 个,点号“.”只能在第一个字符的位置出现,问号“?”不可以单独使用; 3) 从第二个字符开始,可以是字母、数字、?、或_; 4) 不能使用属于系统专用保留字(Reserved word)。保留字主要有CPU中各寄存器名(如AX,BX,DS等),

9、指令助记符(如MOV,ADD等),伪指令(如SEGMENT、DW等),表达式中的运算符(如GE,LT等)和属性操作符(如PTR、SHORT、 OFFSET、TYPE)等。,标号或变量的共性,都是用来表示本语句的符号地址。但标号是存放指令的存储单元的符号地址,而变量是存放操作数的存储单元的符号地址。 (1) 变量(Variables) 变量通常在数据段、附加段、堆栈段中定义,后面不能跟有冒号“:”。它可以用EQU或LABEL伪指令来定义。变量作为操作数的符号地址,它经常在操作数字段出现,且有三种属性:段属性、偏移属性和类型属性。 段属性:定义变量的段起始地址,此值必须在一个段寄存器中,一般默认在

10、DS段寄存器中,当然可以用段超越前缀来指明ES段寄存器或SS寄存器等。 偏移属性:变量的偏移地址是一个16位无符号数,它代表从段起始地址到定义变量的位置之间的字节数。 类型属性:变量的类型属性,定义该变量所要包含的字节数目,即所求存放的数据长度,如BYTE(1个字节)、WORD(2个字节)、DWORD(4个字节)等。,(2)标号(Label) 标号在代码段中定义,后面要跟有冒号(:),它也可以用EQU或LABEL伪指令来定义。此外,它还可以作为过程名定义。标号经常在转移指令或CALL指令的操作数字段出现,用以表示转移的目标地址。标号有三种属性:段属性、偏移属性和类型属性。 段属性:定义标号的段

11、起始地址,此值必须在一个段寄存器中,而标号所在段的段基值总是在CS段寄存器中。 偏移属性:标号的偏移地址是16位无符号数,它代表从段起始地址到定义标号的位置之间的字节数。 类型属性:用来指明该标号是在本段内引用还是被其它段中引用。如在段内引用的,则称为NEAR属性,表明只需要改变IP值,而不必改变CS值,也就是说转移指令或调用指令与此标号所指的语句或过程是在同一个段内。,FAR属性与NEAR属性不同,要转移到的标号所指语句或过程是在其它段中,所以不仅需要改变IP值,而且需要改变CS的值。 注:若没有对标号进行类型说明就是默认为NEAR属性,例如JMP NEXT,此NEXT标号的属性是NEAR,

12、当然也可以给予类型说明如:JMP NEAR PTR NEXT。 在程序中,标号名或变量名只能在一个地方定义,不能在不同的位置用同一个标号名或变量名,不然汇编出错。 如下列程序段,NEXT在两处定义是错误的,这是绝对不允许的。 NEXT: JC NEXT NEXT: JMP NEXT,2操作项(或操作码项) 操作项可以是指令、伪指令或宏指令的助记符。对于指令,汇编程序将其翻译成机器语言代码。对于伪指令,汇编程序将根据其指示的功能进行处理,汇编程序处理完伪指令所提供的信息后,伪指令的“生命”也就随之结束,不会形成机器代码。对于宏指令,汇编程序将根据其定义进行宏展开,并把相应程序段翻译成机器语言代码

13、。 3操作数项(Operand field) 操作数项由一个或多个项组成,项与项之间用逗号“,”分隔。 对于指令语句,操作数项一般给出操作数地址,特别是存储器操作数,可由多种寻址方式表示操作数项,当然它们可能为一项或二项,也可能不存在操作数项,而是默认的操作数。 操作数项可以为常数(或称常量)、寄存器、标号、变量或表达式组成。 对于伪指令,操作数项给出的是它们所要求的参数。,对于常量与表达式的规定 (1)常数 凡是出现在源程序中的固定值,它在程序运行期间不会变化,就称作常数或常量。常数可以有以下几种体现方式: 1) 数字常数 (1) 二进制数:以字母B结尾的由一串0和1组成的数字序列。如101

14、01101B (2) 八进制数:以字母O或Q结尾的07数字序列,如3776Q,7534O。 (3) 十进制数:由09数字序列,可以用字母D结尾,也可以没有结尾字母。如1999,1999D,从键盘输入默认的是十进制数。 (4) 十六进制数:以字母H结尾,由若干个09的数字或AF(或af)的数字字母所组成的序列。如37ACH,0F6CH。,2)字符串常数 字符串常数是由写在单引号内的1或2个以上字符构成,单引号内的每个字符对应一个字节,汇编程序要把引号中的字符翻译成它的ASCII码。如字符A的ASCII码是41H,则字符串ABC与414243H等价。如:MOV AL,A 与 MOV AL,41H

15、指令是等价的。 3)符号常数 常数也可以用符号名代替,但必须遵守“先定义,后使用”的原则。如: COUNT EQU 100 MOV CX,COUNT ;COUNT即为符号常数,它必须用伪指令EQU来定义。,(2)表达式 表达式:由常数、寄存器、标号、变量与一些运算符和操作符所组合的序列。 表达式的种类:可分为数字表达式和地址表达式两种。汇编程序会按照一定的优先规则对表达式进行计算,可得到一个数值或一个地址。 为了构成表达式,需要用到三种运算符和二种操作符,分述如下: 1) 算术运算符(Arithmetic operators) 算术运算符有、(加减乘除)和MOD(求余)。 注意:算术运算符可以

16、用在数字表达式或地址表达式中,当它用在地址表达式中时,仅当其结果有明确的物理意义时,运算结果才是有效的。,【例】 需要把首地址为DAT的字数组内第10个字传送到AX寄存器,可以使用如下指令实现。 MOV AX,DAT(101)*2 为什么要(101)*2?原因就是,计算机中的地址都是从0开始编排的,第一字的偏移地址是0与1;第二个字的偏移地址是2与3;以此类推,第十个字的偏移地址是18与19,字的地址都是以低字节的地址作代表,所以18(101)*2。【例】 数组BLOCK定义如下,试写出把数组长度(字数)存入CX寄存器的指令序列。 BLOCK DW 1,2,3,4,5,6,7,8,9 WEND

17、 DW ? MOV CX ,(WENDBLOCK)/2 ; 其中WEND 是为计算数组长度而建立的符号地址,汇编程序把地址表达式计算后的指令为: MOV CX ,9,2) 逻辑运算符(Logical operators) 它有AND、OR、XOR和NOT四种。参加运算的数和运算的结果均为整数,逻辑运算符所表达的都是按位操作,它只能用于数字表达式中,不能用于存储器地址操作数的地址表达式中。逻辑运算符与逻辑运算指令的写法相同,但作用是完全不同的两回事。【例】 MOV AX,NOT F3H MOV AH,NOT F3H MOV BL,55H AND FFH MOV DL,55H OR FH MOV

18、CL,55H XOR FFH,MOV AX,0FF0CH MOV AH,CH MOV BL, 55H MOV DL,F5H MOV CL,AAH,3)关系运算符(Relational operators) 运算符用于比较两个表达式。表达式一定是常数或同一段内的变量。若是常数,按照无符号数比较。若是变量,则比较它们的偏移量。比较结果以真(全1)、假(全0)的形式给出。,【例】MOV AX, 0FH EQ 1111B MOV BX, 0FH NE 1111B 与下面两条指令完全等效: MOV AX, 0FFFFH MOV BX, 0【例】MOV AX,(PORT LT 6)AND 80)OR(PO

19、RT GE 6)AND 60) PORT事先已定义,当PORT6时,汇编结果为: MOV AX,80 否则,当PORT6时,汇编结果为:MOV AX,60,4) 数值返回操作符(Numeric returm operators),数值返回操作符也称为分析操作符(Analytic operators)它们分为二组,由SEG,OFFSET,TYPE分别回收变量或标号的段基值,偏移量和类型三种属性的值;对LENGTH,SIZE操作符仅作用于变量。 (1) SEG ;回收段属性 格式:SEG 变量或标号(Variable or Label) 当操作符SEG加在一个变量名或标号的前面时,得到的运算结果是

20、这个变量或标号所在段的段基值。 【例】 设有一个数据段DATA SEGMENT DA1 DB 1,2 DA2 DW 1,2 DA3 DD 1,2DATA ENDS,若要获得当前DS的值,则有: MOV AX,SEG DA1 或 MOV AX,SEG DA2 或 MOV AX,SEG DA3 这三条指令是等价的。,(2) OFFSET ;回收偏移属性 格式:OFFSET 变量或标号(Variable or Label) 汇编程序将回送变量或标号的偏移地址值。 【例】 设ARRAY是在数据段中定义的变量 MOV BX,OFFSET ARRAY 则汇编程序将ARRAY的偏移地址作为立即数回送给BX寄

21、存器,所以这条指令与指令LEA BX,ARRAY是完全等价的。因为在8086中的偏移量与有效地址是一样的概念。 (3) TYPE ;回收类型属性 格式:TYPE 变量或标号(Variable or Label) 如果是变量,则汇编程序将回送该变量类型所表示的字节数:DB(字节)为1,DW(字)为2,DD(双字)为4,DF为6字节,DQ(4字)为8,DT为10字节。 如果是标号,则汇编程序将回送该标号类型的数值:NEAR为-1,FAR为-2.,(4) LENGTH ;回送由DUP定义的变量的单元数,其它情况回送1 格式:LENGTH 变量(Variable) 注意:这个操作符仅加在变量的前面,如

22、果变量首先是用重复数据操作符DUP说明的,则返回外层DUP给定的重复数值;其他情况的返回值皆为1。 (5) SIZE ; 实现LENGTH * TYPE 格式:SIZE 变量(Variable) SIZE操作符仅加在变量的前面,表示数组变量用DUP分配的总字节数。返回值等于LENGTH和TYPE两个操作符返回值的乘积,即: SIZE变量=(LENGTH变量)*(TYPE变量),【例】 DATA SEGMENT DA1 DB 64H DUP(?) DA2 DW 50H DUP(?),1234H,5678H DA3 DB 8,2,3,4 DA4 DW 6,6DUP(0) DA5 DW 50H DU

23、P(?,1,2,3,4) DATA ENDS,若有以下五条指令: MOV AX,LENGTH DA1 MOV BX,LENGTH DA2 MOV CX,LENGTH DA3 MOV DX,LENGTH DA4 MOV SI, LENGTH DA5,下面五条指令等价: MOV AX,64H MOV BX,50H MOV CX,01H MOV DX,01H MOV SI,50H,【例】 DATA SEGMENT DA1 DB 64H DUP(?) DA2 DW 50H DUP(?),1234H,5678H DA3 DB 8,2,3,4 DA4 DW 6,6DUP(0) DA5 DW 50H DUP

24、(?,1,2,3,4) DATA ENDS,若有以下五条指令: MOV AX,SIZE DA1 MOV BX,SIZE DA2 MOV CX,SIZE DA3 MOV DX,SIZE DA4 MOV SI, SIZE DA5,下面五条指令等价: MOV AX,64H MOV BX,0A0H MOV CX,1 MOV DX,2 MOV SI,0A0H,5)属性操作符(Attribute modifying operators) 属性操作符也称为合成操作符(Synthetic operators)合成操作符可以用来指定或临时修改变量或标号的类型属性或存储器操作数的存储单元类型属性。合成操作符有PT

25、R、段操作符(实为段超越符号)、SHORT、THIS、HIGH和LOW等6种。 (1) PTR 格式:类型PTR地址表达式 其中,地址表达式是指要修改类型属性的变量、标号或存储器操作数的存储单元地址,这个操作符的含意,是指定由地址表达式确定的存储单元的类型BYTE、WORD、DWORD或NEAR、FAR等。 这种修改是临时性的,仅在有这修改操作符的语句内有效。可以把类型PTR地址表达式读作:把PTR后面地址表达式的类型属性临时改成PTR前头所指定的类型。,【例】在编程中,为了使操作数的类型相匹配,PTR将扮演着重要的角色。 DA1 DB 33H,44H,55H DA2 DW 66H,77H,8

26、8H 指令: MOV AX,DA1 MOV BL,DA2 这两条指令存在明显的类型不匹配。请注意:只要在操作数中出现变量名,这个变量的三种属性就明显存在,寄存器的使用必须与变量的类型相一致。所以以上两条指令在汇编时将出错,如果使用的寄存器不许更改,则必须临时修改变量类型,如: MOV AX,WORD PTR DA1 MOV BL, BYTE PTR DA2,(2) 段操作符“:”(冒号) 操作符“:”也称为段超越操作符,它跟在段寄存器名(DS,ES,CS和SS)之后,表示段超越,用以给一个存储器操作数指定一个段属性,而不管其原来隐含的段是什么。例如: MOV AX,ES:BX 可见它是用来表示

27、的。此外,也可以用或来表示其段属性。 (3) SHORT操作符 操作符SHORT指定一个标号的类型为SHORT(短标号),即当前IP到引用该标号之间的距离在128127个字节的范围内。短标号可以用于转移指令中,例如: JMP SHORT L1 L1: ,(4) THIS操作符 格式:THIS attribute或TYPE 操作符THIS也可指定存储器操作数的类型。使用THIS操作符可以使标号或变量具有灵活性。它可以像PTR一样建立一个指定类型(BYTE、WORD或DWORD)的或指定段内或段间(NEAR或FAR)的存储器操作数。该操作数的段地址和偏移地址与下一个定义的存储单元偏移地址相同,但类

28、型属性不同。例如要求对同一个数据区,既可以用字节为单位,又可以用字为单位进行存取,则可用以下语句: ARRAYB EQU THIS BYTE ARRAYW DW 100 DUP(?) 上面ARRAYW和ARRAYB实际上代表同一个数据区,其中共有200个字节,但使用ARRAYW的类型为字(WORD),而使用ARRAYB的类型为字节(BYTE),ARRAYW和ARRAYB有相同的段和偏移属性,仅是类型属性不同。,(5)HIGH和LOW操作符(字节分离操作符) 格式: HIGH 表达式 LOW 表达式 用于分离运算对象的高字节和低字节部分。运算对象的表达式中,必须具有常量值,即一个常数或在汇编源程

29、序时能够确定的段或偏移量值的地址表达式。对于地址表达式,HIGHLOW操作符可用于分离出段或偏移量的高字节或低字节。【例】 DATA SEGMENT PARA AT 0836H data ; DATA段的段基值由AT后的0836H确定 ORG 2340H CONST EQU 0ABCDH DA1 DB 10H DUP(?) DA2 DW 20H DUP(0) DATA ENDS,但是HIGH和LOW操作符不能用来分离某一个寄存器或存储器操作数内容的高字节或低字节。如下面的几条指令语句是错误的:MOV AH,HIGH DA1 ;表达式不可为变量MOV AL,LOW DA2 ;MOV BH,HIG

30、H AX ;表达式不可为寄存器MOV BL,LOW BP ;MOV CH,HIGH SI ;MOV CL,LOW DI ;,执行下列指令:MOV AH,HIGH CONSTMOV AL,LOW CONSTMOV BH,HIGH (OFFSET DA1)MOV BL,LOW (OFFSET DA1)MOV CH,HIGH (SEG DA1)MOV CL,LOW (SEG DA2),对应指令汇编后分别为:MOV AH,0ABHMOV AL,0CDHMOV BH,23HMOV BL,40H MOV CH,08H MOV CL,36H,当一个表达式中同时有几个运算符,要按运算符优先级顺序执行。汇编源程

31、序按照以下规则计算表达式的值: 1) 先执行优先级别高的运算; 2) 优先级别相同的操作,从左至右顺序进行; 3)可以用圆括号改变运算的顺序。 下面给出运算符或操作符从高到低的优先级别(其中有些操作符上述并未提及、需要时可查阅有关手册)从高到低排列如下: 1) 在圆括号中的项,方括号中的项,结构变量(变量、字段),然后是LENGTH、SIZE、WIDTH和MASK。 2) 名:(段取代)。 3) PTR,OFFSET,SEG,TYPE,THIS及段操作符“:”。 4) HIGH和LOW。 5) 乘法和除法:,MOD,SHL,SHR。 6) 加法和减法:,。 7) 关系操作:EQ,NE,LT,L

32、E,GT,GE。 8) 逻辑:NOT。 9) 逻辑:AND。 10)逻辑:OR,XOR。 11)SHORT,4注释项 注释项用来解释一段程序或一条或几条指令在程序中所承担的任务。注释是可有可无的。但是,对于汇编语言源程序清单来说,它可使程序易于阅读,而对编程者而言,只不过是一种“备忘录”。注释应该写出本条(或本段)指令在整个程序中的功能和作用,而单纯写出该指令执行的是什么操作,那是没多大意义的,因为只要懂得指令系统的人,都知道指令执行什么操作。所以应注意学习注释的写法,在编制程序时,更应学会写好注释。如在循环程序的初始化时:MOV CX,100 ;CX100MOV SI,2000H ;SI20

33、00HMOV DI,3000H ;DI3000H这样的注释没有什么作用,它们仅是每条指令功能,无法体现它们在整个程序中所承当的角色。若改为:MOV CX,100 ;循环计数器CX置初值MOV SI,2000H ;把源数据区首址送入SI中MOV DI,3000H ;把目的数据区首址送入DI中,6.3 指令语句 大多数指令语句都由操作项和操作数项组成,必要时才有名字项、操作项、操作数项和注释项,但个别的指令语句只有隐含的操作数项,而极个别的指令语句甚至只有操作项,如指令NOP就只有操作项。 在操作数项中所使用的段名、标号名、变量名和符号名,都必须在源程序中加以事先定义,否则,汇编程序在汇编时,找不

34、到定义,就会产生出错处理。 6.3.1 标号名用作转移的目标地址 1. 要在转移到的第一条指令语句之处设置标号 标号有近程(NEAR)和远程(FAR)两种类型,一般来说,只在段内转移时,指令中可以不指定NEAR属性(默认的)。但在段间转移。为防止出错,都要将远程标号在指令中指明,如 JMP FAR PTR 标号。,【例】 C1 SEGMENT EXTRN MEXTPROG:FAR ;说明MEXTPROG是本段外部的 JMP L1 ;段内转移,可以不写NEAR PTR指明L1的类型 L1: JMP FAR PTR MEXTPROG ;段间转移,定要指明类型属性 C1 ENDS C2 SEGMEN

35、T PUBLIC MEXTPROG ;说明MEXTPROG是公用的 MEXTPROG:MOV AX,SI C2 ENDS,2. 用EQU与THIS来定义语句的标号【例】 BETA EQU THIS FAR CMP AL,100 JMP BETA 用属性操作符THIS定义了BETA属性为段间标号。从而实现段间转移。,6.3.2 段名作为立即数(段基值)【例】 现有如下程序段: DATA SEGMENT DA1 DB 33H,?,44H DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA ;段名DATA作为立即数或写SE

36、G DA1 MOV DS,AX CODE ENDS END START 在源程序中,把数据段的段名DATA作为立即数,它是由系统分配的段基值或由段定义中组合类型的AT 表达式来指定其段基值。正因为DATA作为立即数,所以必须经过寄存器才可以传送给DS寄存器。,6.3.3 变量名可作为存储单元的直接寻址 【例】现有如下程序段: DATA SEGMENT DA1 DB 33H DA2 DB 44HDATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA MOV AL,DA1 ;DA1作为直接寻址 ADD AL,DA2 ;DA2作为直接寻址 CODE ENDS 用变量名作为直接寻址的场合是常见的。,6.3.4 符号名用作立即数 如果有一条指令写成MOV AL,DAT;若事先不看对DAT的定义,就难以确定它是变量名还是符号名,从形式上看,在指令操作数部分的变量名、符号名都是同一种书写形式,汇编程序主要根据它的定义来区分。若用DB、DW、DD等伪指令来定义的必然是变量名(数据符号地址);若用EQU或“”来定义的就只能是符号名(代表立即数)。 【例】 符号名代表立即数 COUNT EQU 100 MOV CX,COUNT 汇编后的MOV指令即为:MOV CX,64H,

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

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

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


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

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

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