ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:31.55KB ,
资源ID:19274315      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/19274315.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第4章伪指令与源程序格式汇总文档格式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第4章伪指令与源程序格式汇总文档格式.docx

1、mov ds,axmov dx,offset string mov ah,9 int 21h mov ah,4ch int 21hcode ends end start ;汇编结束, 程序起始点start: 1段定义伪指令汇编程序在把源程序转换为目标程序时,必须确定标号和变量(代码段和数据段的符号地址)的偏移地址,连接程序对针目标程序把不同的段和模块连接在一起,确定各个段的段地址。段地址确定了,其中的指令、标号和变量的段地址也就确定了,这样就形成一个可执行程序。为此,需要段定义伪指令。段定义伪指令格式:segment_name SEGMENTsegment_name ENDS其中segment

2、_name由用户确定,大写的为关键字。段定义伪指令两句成对出现,两句之间为其它指令。为了确定用户定义的段和哪个段寄存器的关系,用ASSUME伪指令来实现。ASSUME伪指令格式:ASSUME register_name:segment_name ,register_name:segment_name其中register_name为段寄存器名,必须是CS,DS,ES和SS。而segment_name则必须是由段定义伪指令定义的段中的段名。ASSUME伪指令只是指定把某个段分配给哪一个段寄存器,它并不能把段地址装入段寄存器中,所以在代码段中,还必须把段地址装入相应的段寄存器中。为此,还需要用两条M

3、OV指令完成这一操作。但是,代码段不需要这样做,代码段的这一操作是在程序初始化时完成的。一般情况下,使用上述的段定义伪指令就可以了,如果需要对段定义作进一步地控制,SEGMENT伪指令还可以增加类型及属性的说明,其格式如下: segment_name SEGMENT 定位类型组合类型 使用类型“类别”如果需要用连接程序把本程序与其他程序模块相连接时,就需要使用这些说明,具体内容安排在第6章有关子程序的多模块设计中介绍。2简化的段定义伪指令MASM5.0以上版本还支持一种简化的段定义方法,把例4.1程序用简化的段定义方法可以改写如下:例4.2.model small ;定义存储模型为small

4、.data ;.code ;mov ax,data ;end start 首先用.MODEL伪指令说明在内存中如何安排各个段,存储模型为SMALL的意思是:所有数据都放在一个64KB的数据段,所有代码都放在另一个64KB的代码段,数据和代码都为近访问。这是最常用的一种模型。.DATA伪指令用来定义数据段,但没有给出段名,默认段名是_DATA。DATA表示段名_DATA,在指令中表示段地址。简化段定义的表达能力不如SEGMENT伪指令那样完整而清楚,所以很多时候还是用SEGMENT伪指令。有关简化段定义的更多说明在第6章有关子程序的多模块设计中介绍。4.1.3 程序开始和结束伪指令在前面例子中,

5、都没有使用表示程序开始的伪指令。用户根据需要可以在程序的开始用NAME或TITLE伪指令定义该程序模块名。NAME的格式为:NAME module_name其中module_name 为模块的名字。如果程序中没有使用NAME伪指令,也可使用TITLE伪指令来指定模块名,其格式为:TITLE text其中text中的前六个字符被汇编程序作为模块的名字。TITLE伪指令的另一个作用是在列表文件的每一页上打印标题。标题text最多可有6 0个字符。如果程序中既无NAME又无TITLE伪指令,则用源文件名作为模块名。所以NAME及TITLE伪指令不是必要的。表示源程序结束的伪操作的格式为:END la

6、bel汇编程序将在遇到END时结束汇编。其中标号label指示程序开始执行的起始地址。如果是多个程序模块相连接,则只有主程序需要使用标号,其他子程序模块则只用END而不能指定标号。 4.1.4 数据定义与存储器单元分配伪指令我们知道,指令语句的一般格式是:标号: 操作码 操作数 ;注释 这一类伪指令的格式是:变量 操作码 N个操作数 ;其中变量字段是可有可无的,它用符号地址表示。其作用与指令语句前的标号相同。但它的后面不跟冒号。操作码字段说明所用伪操作的助记符,即伪操作,说明所定义的数据类型。常用的有以下几种:DB 伪操作用来定义字节,其后的每个操作数都占有一个字节(8位)。DW 伪操作用来定

7、义字,其后的每个操作数占有一个字(16位,其低位字节在第一个字节地址中,高位字节在第二个字节地址中,即数据低位在低地址,数据高位在高地址)。DD 伪操作用来定义双字,其后的每个操作数占有两个字(32位)。DF 伪操作用来定义6个字节的字,其后的每个操作数占有48位。DQ 伪操作用来定义4个字,其后的每个操作数占有4个字(64位),可用来存放双精度浮点数。DT 伪操作用来定义1O个字节,其后的每个操作数占有1O个字节,为压缩的BCD码。(需要说明的是,MASM6允许DB,DW,DD,DF,DQ,DT伪操作分别用BYTE,WORD,DWORD,FWORD,QWORD,TBYTE代替)。这些伪操作可

8、以把其后跟着的数据存人指定的存储单元,形成初始化数据;或者只分配存储空间而并不确定数值。下面举例说明各种用法。例4.3 操作数为常数、数据表达式。D_BYTE DB 10,5,10HD_WORD DW 14,100H,-5,0ABCDHD_DWORD DD 48 程序中默认的数据为十进制数,10H为十六进制数,用DB定义的数据的值不能超出一个字节所能表示的范围。数据10的符号地址是D_BYTE,数据5的符号地址是D_BYTE+1。数据可以是负数,均为补码形式存放。允许数据表达式,如48,等价为32。当数据第一位不是数字,应在前面加0,如0ABCDH。数据在内存中的存放如图4.1所示。D_BYT

9、E D_WORD D_DWORD 0A05100E0001FBFFCDAB20图4.1例4.3的汇编结果 例4.4 操作数为字符串。问号?仅预留空间。数据在内存中的存放如图4.2所示。MESSAGE DB HELLO,? DB ABCDMESSAGE 43454C4F-414244图4.2 例4.4的汇编结果例4.5 用操作符复制操作数。数据在内存中的存放如图4.3所示。ARRAY DB 2 DUP(1,3,2 DUP(4,5)ARRAY 0304图4.3 例4.5的汇编结果例4.6 指令中使用隐含类型属性。OPER1 DB ?, ?OPER2 DW ? MOV OPER1, 0 MOV OP

10、ER2, 0 MOV OPER2, AX第一条指令将使OPER1字节单元清零,第二条指令将使OPER2字单元清零,因为OPER2为字类型变量,第三条指令两个操作数类型一致,无需说明。例4.7 在指令中使用类型属性操作符指定操作数类型。OPER1 DB 3, 4OPER2 DW 5678H, 9MOV AX,OPER1MOV BL, OPER2MOV BX, 0前两条指令操作数类型不匹配,第三条指令的目标操作数类型不明确,所以都是错误的。解决的办法是可在指令中对操作数类型作临时性指定,以使操作数类型匹配和明确。这三条指令可改为:MOV AX,WORD PTR OPER1MOV BL, BYTE

11、PTR OPER2MOV BYTE PTRBX, 0使用类型属性操作符WORD PTR,BYTE PTR 可对操作数类型进行重新指定。指令执行结果:AX=0403H,BL=78H。实际上一个变量也可以定义成不同类型,以方便使用。这可以用LABEL伪操作来定义,格式为:name LABEL type例4.8 把变量定义成不同类型,指令中可灵活选用。指令执行结果如图4.4所示。OPR_B LABEL BYTEOPR_W DW 4 DUP(0)MOV AX, 1234HMOV OPR_B, ALMOV OPR_W+2, AXOPR_BOPR_W 图4.4 (1) 例4.8的数据定义3412图4.4

12、(2) 例4.8的指令执行结果OPR_B LABEL BYTE伪操作使得OPR_B和OPR_W指向同一个内存单元。4.1.5 表达式赋值伪指令汇编语言程序也允许表达式,以方便程序设计。可以用赋值伪操作给表达式赋予一个名字。其格式如下:Expression_name EQU Expression上式中的表达式必须是有效的操作数格式或有效的指令助记符,此后,程序中凡需要用到该表达式之处,就可以用表达式名来代替了。举例如下:VAL EQU 86 DATA EQU VAL+5 ADDR EQU BP+VAL 此后,指令 MOV AX,ADDR 就代表MOV AX,BP+86,可见,EQU伪操作的引入提

13、高了程序的可读性,也更加易于程序的修改。必须注意:在EQU语句的表达式中,如果有变量或标号的表达式,必须先定义后引用。 另一个更为简洁的赋值伪操作是,格式同EQU,只是用替换EQU。它们之间的区别是EQU伪操作中的表达式名是不允许重复定义的,而伪操作则允许重复定义。例如,VAL=53VAL=VAL+53VAL可以多次被伪操作赋值,而EQU则不允许重复定义。4.1.6 汇编地址计数器与定位伪指令1地址计数器$在汇编程序对源程序汇编的过程中,为了按序存放程序中定义的数据变量和指令,使用16位的地址计数器(location counter)来保存当前正在汇编的指令的偏移地址。当开始汇编或在每一段开始

14、时,把地址计数器初始化为零,以后在汇编过程中,每处理一条指令,地址计数器就增加一个值,此值为该指令所需要的字节数。地址计数器的值可用$来表示,汇编语言允许用户直接用$来引用地址计数器的值。如在指令中引用$,JMP $+8的转向地址是本条指令的首地址加上8。显然$+8必须是另一条指令的首地址,否则汇编程序将指示出错。当$用在伪操作的参数字段时,它所表示的是地址计数器的当前值。例4.9 考察$的作用,假定$初值=0,数据在内存中的存放如图4.5所示。ARRAY DW 3,$+7,7COU=$NEW DW COUARRAY NEW 090706图4.5 例4.9的汇编结果2. ORG伪操作ORG伪操

15、作用来设置当前地址计数器的值,其格式为:ORG constant expression如常数表达式的值为n,则ORG伪操作可以使下一个字节的地址为n。例4.10 考察ORG伪操作,数据在内存中的存放如图4.6所示。ORG 0DB 3ORG 4BUFF DB 5ORG $+6VAL DB 9BUFF VAL图4.6 例4.10的汇编结果可以看成是从4号单元开始定义了一个名为BUFF长度为6个字节的键盘输入缓冲区。3EVEN伪操作EVEN伪操作使下一个变量或指令开始于偶数地址。一个字的地址最好从偶数地址开始。例如:EVENARRAY DW 80 DUP(?)4ALIGN伪操作ALIGN伪操作使下一

16、个变量的地址从4的倍数开始,这可以用来保证双字数组边界从4的倍数开始,其格式为:ALIGN boundary其中Boundary必须是2的幂。ALIGN 84.1.7 基数控制伪指令汇编程序默认的数为十进制数,所以在程序中使用其他基数表示的常数时,需要专门给以标记如下: (1)二进制数:由一串0和1组成,其后跟以字母B,如00101001B。 (2)十进制数:由09的数字组成的数,一般情况下,后面不必加上标记,在指定了其它基数的情况下,后面跟字母D,例如23D。 (3)十六进制数:由09及AF组成的数,后面跟字母H。这个数的第一个字符必须是09,所以如果第一个字符是AF时,应在其前面加上数字0

17、,如0FFFFH。 RADIX伪操作可以把默认的基数改变为216范围内的任何基数。其格式如下:.RADIX expression其中表达式用来表示基数值(用十进制数表示)。 注意:在用.RADIX把基数定为十六进制后,十进制数后面都应跟字母D。在这种情况下,如果某个十六进制数的末字符为D,则应在其后跟字母H,以免与十进制数发生混淆。4.1.8 过程定义伪指令子程序又称过程,可以把一个程序写成一个过程或多个过程,这样可以使程序结构更加清晰,基本的过程定义伪指令的格式为:procedure_name PROC Attributeprocedure_name ENDP其中过程名(procedure_

18、name)为标识符,起到标号的作用,是子程序入口的符号地址。属性(Attribute)是指类型属性,可以是NEAR或FAR。例4.1的程序段可以改写为过程,见下例:例4.11data main proc far ;定义过程mainmov ax,data mov dx,offset stringmov ah,9int 21hmain endp end main ;汇编结束, 程序起始点main该程序的过程部分也可写成:main proc far push ds ;ds进栈mov ax,0 ;0进栈push axret ;返回 该过程对DOS来说是一个远过程,这里在过程的开始把当前DS的值和0压入

19、堆栈,过程的最后用RET返回到DOS命令状态。这是一个固定用法。RET指令使堆栈中的2个字(0和DS的值)弹出到IP和CS,实际上是执行了该处的退出程序的指令INT 20H。增强功能的过程定义在第六章介绍。但一般情况下,都是使用基本的过程定义。4.2 语句格式程序中用得最多的是指令和有关数据定义的伪指令,这些语句基本上可以由4项组成,格式如下:name operation 0perand ;comment 名字 操作 操作数 ;名字项是一个符号,可以是指令的标号,也可以是变量名。 操作项是一个操作码的助记符,它可以是指令、伪指令或宏指令名。 操作数项由一个或多个表达式组成,它提供该操作所要求的

20、操作数或相关信息。 注释项用来说明程序或语句的功能。 上面带方括号的两项是可有可无的,各项之间必须用空格隔开。下面分别说明各项的表示方法。4.2.1 名字项和操作项1名字项名字项用下列字符来表示: 字母AZ 数字O9 专用字符?,-,$除数字外,所有字符都可以放在源语句的第一个位置。名字中如果用到,则必须是第一个字符。名字项可以是标号或变量,用来表示本语句的符号地址。如果是指令的标号,后面跟冒号:。作为一个地址符号,显然应有3种属性:段、偏移及类型。段属性,定义该地址符号的段起始地址,此值必须在一个段寄存器中。偏移属性,偏移地址是从段起始地址到定义该地址符号的位置之间的字节数。对于16位段是1

21、6位无符号数。类型属性,对于标号,用来指出该标号是在本段内引用还是在其他段中引用的。如是在段内引用的,则称为NEAR,对于16位段,指针长度为2字节。如在段外引用,则称为FAR,对于16位段,指针长度为4字节(段地址2字节,偏移地址2字节)。对于变量,类型属性定义该变量所保留的字节数。如BYTE(1个字节)、WORD(2个字节)、DWORD(4个字节)、FWORD(6个字节)、QWORD(8个字节)、TBYTE(1O个字节),这一点在数据定义伪操作中已作了说明。 作为一个地址符号,在同一个程序中,显然不能重复定义,即同样的标号或变量的定义只允许出现一次,否则汇编程序会指示出错。2操作项 操作项

22、可以是指令、伪指令或宏指令的助记符。对于指令,汇编程序将其翻译为机器语言指令。对于伪指令,汇编程序将根据其所要求进行处理。对于宏指令,则将根据宏定义展开。有关宏指令的具体内容将在第7章专门介绍。4.2.2 表达式和操作符 操作数项是指令的最复杂最灵活的一项。操作数项由一个或多个表达式组成。对于指令,操作数项一般给出操作数地址,它们通常不超过两个。对于伪操作或宏指令,则给出它们所要求的参数。操作数项可以是常数、寄存器、标号、变量。这些我们已经知道。操作数项还可以是表达式,而表达式是常数、寄存器、标号、变量与一些操作符(运算符)相组合的序列。在汇编期间,汇编程序按照一定的优先规则对表达式进行计算后

23、可得到一个数值或一个地址,如是数值,这个表达式就是数字表达式,如是地址,这个表达式就是地址表达式。那么表达式有哪些操作符呢?下面介绍一些常用的操作符在表达式中的作用。特别注意的是,表达式在汇编阶段起作用,只有正确的表达式才能通过汇编。1算术操作符算术操作符有,*,/和MOD。其中MOD是指除法运算后得到的余数,如7/5的商为1,而7 MOD 5 为2(余数)。要注意的是,算术操作符在表达式中的使用,其结果必须有明确的物理意义时才是有效的,下面举例说明:例4.12 算术操作符的使用设有如下定义:VAL=4DA1 DW 6,2,9,3DA2 DW 15,17,24上面定义的VAL是常数,我们无需确

24、定它的位置就可以使用。DA1和DA2是变量的符号地址,它们在内存中有确定的位置,我们只有根据它们的地址才能访问。MOV AX,DA1*4 ;错,地址乘或除,没有意义MOV AX,DA1*DA2 ;MOV AX,DA1+DA2 ;错,地址相加,没有意义MOV AX,BX+VAL ;错,BX+VAL须用指令实现MOV AX,BX+VAL ;地址表达式,汇编成MOV AX,BX+4MOV AX,DA1+VAL ;地址表达式,汇编成直接寻址指令,执行后,AX=9MOV AX,VAL*4/2 ;数字表达式,汇编成MOV AX,8MOV AX,VAL*4/2 ;数字表达式,汇编成MOV AX,8 MOV

25、CX,(DA2-DA1)/2 ;地址相减,得到DA1存储区长度,汇编成MOV CX,4 2逻辑与移位操作符逻辑操作符有AND,OR,XOR和NOT;移位操作符有SHL和SHR。它们都是按位操作的。只能用于数字表达式中。逻辑操作符要求汇编程序对其前后两个操作数(或表达式)作指定的逻辑操作。例4.13 逻辑操作符的使用MOV AX,BX AND 0FFH ;错,BX AND VAL须用指令实现MOV AX,VAL AND 0F0H ;汇编成MOV AX,0AND AX,VAL OR 0F0H ;汇编成AND AX,0F4H移位操作符的格式是: expression SHI(或SHR) numshift汇编程序将expression 左移或

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1