汇编语言的格式.ppt

上传人:小飞机 文档编号:5993761 上传时间:2023-09-12 格式:PPT 页数:39 大小:275.11KB
返回 下载 相关 举报
汇编语言的格式.ppt_第1页
第1页 / 共39页
汇编语言的格式.ppt_第2页
第2页 / 共39页
汇编语言的格式.ppt_第3页
第3页 / 共39页
汇编语言的格式.ppt_第4页
第4页 / 共39页
汇编语言的格式.ppt_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《汇编语言的格式.ppt》由会员分享,可在线阅读,更多相关《汇编语言的格式.ppt(39页珍藏版)》请在三一办公上搜索。

1、第四章 汇编语言程序基本格式,汇编语盲是一种符号语言,用汇编语言编制的程序,称为汇编语言源程序。由于计算机只能识别0和1组成的机器代码序列。源程序必须翻译成机器语盲目标程序计算机才能识别和执行。江编程序(ASM、MASM等)是将汇编语言源程序翻译成机器语言目标程序的软件。要使汇编程序理解源程序的编程意图,源程序必须遵守一些规范和约定,如语句格式、程序格式、参数表示、符号定义、内存分配等。这些规范和约定的总和组成了汇编语言的语法。本章中将学习80868088汇编语言程序设计必须理解和掌握的源程序格式、伪指令及操作数表达式等语法基础和汇编语言上机过程。,4.1 汇编语言的语句格式,4.1.1 汇编

2、语言的语句分类汇编语言的语句即汇编语言中使用的各种指令,它们可分为三类;汇编指令语句、宏指语句和伪指令语句。汇编指令即用助记符表示的机器指令,将由汇编程序翻译成8086/8088指令系统中的机器代码。这些代码命令8086/8088微处理器执行某些操作,如MOV、ADD、JMP等。,宏指令语句是用一条自定义指令取代的一组汇编指令。汇编程序将它还原成一组机器令供程序运行时执行。使用宏指令可简化源程序减少出错。汇编指令语句和宏指令语句都是指令性语句。伪指令语句是一种指示性语句。它的作用是向汇编程序提供汇编过程要求的一些辅助信息。如:定义各种符号、分配内存单元、实现分段、指定程序在内存中的存放地址等。

3、伪指令与机器码没有对应关系,汇编程序并不把它们也不可能把它们翻译成机器代码。,4.1.2 汇编语言的语句格式 汇编语言的三种语句可以用如下格式统一表示:名字项 操作项 操作数项;注释项 可以看出,每个语句可以由四项组成,其中用方括号括起来的项是可选的项。各项在三类不同的语句中有不同的具体含义。三种语句的具体形式为:汇编指令语句:标号:助记符 操作数1 操作数2;注释,宏指令语句:标号:宏指令名 参数1,参数n;注释伪指令语句:符号名 定义符 参数1,参数n;注释下面分别对各语句组成项作进一步讨论。4.1.3 名字项在指令性语句中的名字项称为标号,标号指出指令代码的存放地址,为转移指令或子程序调

4、用指令提供转移目标地址。标号与指令助记符之间有一个冒号(:)分隔符。在指示性语句中的名字项又称符号名,可以定义为变量名、符号常数、子程序名或段名等。符号名与定义符之间用空格而不用冒号分隔。1关于名字项的规定名字项中可以使用下列字符:字母A-Z(大写)a-z(小写)数字0一9 特殊字符.,_,?等,除数字外,上面所有规定的字符都可以作为名字项的第一个字符,但问号(?)本身不能单独作为名字。名字中如果用到,则必须是第一个字符。名字的有效长度不能超过31个字符,若超过则后续字符无效。有效的名字顷如:GAMMA Second_street Varl8be 无效名字为?(问号不能单独作为名字)0ABCD

5、H(数字开头无效)TH.IRD(必须为首字符)注意:80868088汇编语言中有规定指令助记符、伪指令、寄存器名以及其它在伪指令中用到的各种符号名都不能用作名字,它们是8086/8088汇编语言的保留字。在程序中同样的标号或变量的定义允许出现一次,否则汇编程序会指示出错。,2.名字项的属性问题(1)标号 标号一般在代码段中定义,直接写在汇编指令的开头,后面跟冒号(:)与指令操作码分隔。标号也可以用LABEL或EQU伪指令在数据段中定义。用伪指令定义时,与其它伪指令的符号名定义一样,用空格与定义符分隔。巳定义的标号在转移指令或CALL指令的操作数字段中使用,表示转向地址。子程序名也是一种标号。标

6、号有三种属性:段属性、偏移属性和类型用性。,段属性:定义标号的段起始地址,标号的段总是放在CS段寄存器中。偏移属性:标号的偏移地址,它是16位无符号数,代表从段起始地址到定义标号的位置之间距离的字节数。类型属性:用来指出该标号是在本段内引用还是在其它段中引用。在段内引用的为NEAR类,在段外引用的为FAR类。(2)变量名 变量一般在除代码段以外的其它段中用伪指令定义。变量通常在操作数字段中被引用,它也有段、偏移和类型三种属性。段属性:变量所在段的起始地址。偏移属性:变量的偏移地址,它是一个16位无符号数,代表从段起始地址到定义变量的位置之间的字节数。类型属性:变量的类型属性定义变量的字节数,即

7、所存放数据的长度,如:长度为一个字节的变量,类型为BYTE,长度为一个宇(2个字节)的变量,类型为WORD等。,(3)符号常数 符号常数一般在数据段中用EQU伪指令定义,以一个符号名代替一个常数值或一个表达式的值。符号常数通常在操作数表达式中引用,以减化源程序书写和提高可读性。符号常数不具有段属性和偏移属性。段名也是一种符号常数。在汇编指令中应注意区分符号常数和变量,例如 MOV AX,DATASEG MOV AX,BUFFER 两条指令有相同的格式,若DATSEG已定义为段名,而BUFFER定义为变量名,则前条指令的寻址方式为立即寻址后一条指令的寻址方式为直接寻址。,4.1.4 操作项 操作

8、项对于汇编指令是操作码的助记符,对于宏指令是宏指令名,汇编程序将把它们翻译为机器指令。对于伪指令,汇编程序将根据其指定的伪操作进行处理。操作数项 操作数项由一个或多个操作数表达式组成,它给执行的操作提供原始数据并指出结果效据存储的地方。操作数表达式是由常数、变量和操作数运算符组成的表示操作数或操作数地址的运算式。其中表示操作数的表达式称为数值表达式,表示操作数地址的表达式称为地址表达式。,注意;在指令中写十六进制数时,如果最高位是A到F之间的数字,应在首位前加一个0,这样做的原因一方面是避免常数与变量或标号混淆,因为规定变量或标号的首位不能为0,所以常数0F7H不会被解释为变量F7H,例如在下

9、面两条指令中:MOV AL,OF7H MOV AL,F7H 前一条指令将十六进制立即数F7H(即11110111B)送入AL。后一条指令将数据段中符号地址为F7H的存储单元的内容送人AL。另一方面,这样做也使常数与寄存器名相区别,如在以下两条指令中:MOV ALAH MOV AL,0AH 一条是把寄存器AH中的内容传送给AL寄存器,另一条则是把立即数10送给AL寄存器。,4.1.6 注释项 注释项用来说明程序或语句的功能。分号(;)为注释项的开始引导符,也作为注释项与操作数项的分界符。分号(;)也可以从一行的第一个字符开始,此时整行都是注释,常用来说明下面一段程序的功能。注释项虽然是可选项,但

10、是对于编写汇编语言源程序来说是十分重要的注释项使意义不够直观的源程序容易理解、使用和修改。注释应该写出本条(或本段)指令在程序中的功能和作用,而不应该只是重复描述指令的动作。,4.2 常用伪指令,4.2.1 变量定义伪指令 变量定义语句的主要任务是为一个数据项分配存储单元,定义一个符号变量与这个存储单元相联系,且为这个变量提供一个初始值。1常用的变量定义伪指令 变量名 DB操作数项;定义字节(BYTE)变量 变量名 DW操作数项;定义字(WORD)变量,(2字节)变量名 DD操作数顷,定义双字DWORD)变量,(4字节)变量定义伪指令中的变量名是可选项,它指出变量或数组在内存中的起始地址。变量

11、定义伪指令中操作数项有许多不同的形式,这些形式大大丰富了汇编程序的变量i配能力。(1)操作数是常数或表达式的情况 DATA_BYTE DB 10,4,10H DATA_WORD DW l00,100H,-5 DATA_DW DD 3*20,0FFFDH,(2)操作数是字符串的情况 操作数项中的字符串常量用DB定义,它们必须用单引号括起来。引号中可以是多个字符,其中可以包括任意多个空格(ASCII码为20H)。MESSAGE DB A B STRING DB HELLO(3)操作数为?的情况?用于预留存储空间 ABC DB 0,?,?,?,0 DEF DW?,756H,?,2.操作数复制操作符(

12、DUP)DUP用于重复已定义的一组操作数。格式:重复次数DUP(操作数1,操作数2,)其中重复次数可以使常数或表达式,它的值应该是一个正整数。ARRAY1 DB 2 DUP(0,1,2,?)ARRAY2 DB 100 DUP(?)DUP的操作数可以嵌套使用 ARRAY3 DB 100 DUP(0,2 DUP(2,3),0,3)等价于:ARRAY2 DB 100 DUP(0,2,3,2,3,0,3),3变量的类型匹配 在数据定义伪指令中包含了变量的类型属性,汇编程序可用一个类型值来表示该语句的每一个数据项的长度(即字节数),因此DB伪指令定义的变量属性值为1,DW为2,DD为4。含有变量的表达式

13、的属性值应和表达式中变量的类型值一致。当然,含有多个变量的表式中各变量的类型首先要求一致。这种对表达式的变量一致性要求称为变量的类型匹配。汇编程序能够自动判断一条指令是字操作还是字节操作。OPER1 DB?,?OPER2 DW?,?MOV OPERl,0 MOV OPER2,0 则第一条是字节操作指令,而第二条是字操作指令,如果有下列指令序列:,OPER3 DB 3,4OPER4 DW 1278H,3456H有以下指令:MOV AX,OPER3+1 MOV AL,OPER4 汇编程序在汇编这两条指令时,能发现两条MOV指令中的操作数类型都是不匹配的。前一条MOV指令中OPER3+1为字节类型,

14、而AX为字类型;后一条MOV指令中OPER4为字类型,而AL为字节类型。因而,汇编程序将指示出错。为了使两个操作效类型匹配,在指令中可用类型指针操作符PTR来改变变量的引用类型。,引用格式:变量类型 PTR操作数 MOV AX,W0RD PTR 0PER3+1 MOV AL,BYTE PTR OPER4 这样使0PER3+1类型属性在指令中临时指定为字,使OPER4类型属性在指令中临时指定为字节,实现了操作效类型匹配。程序运行时将把0PER3+I为首址的一个字送AX,即把0PER3+1的内容送AL,把OPER4的第1个字节的内容送AH,指令执行完后AX7804H,第三条指令运行时,将OPER4

15、的第一字节的内容送AL,指令执行完后AL78H。,4.2.2 符号定义伪指令 符号定义指源程序中除变量之外的其它符号名的定义。这些符号名不参与内存地址分配。常见的符号定义伪指令有赋值伪指令EQU和标号定义伪指令LABEL等。1赋值伪指令EQU 对于程序中多次出现同一个表达式,为了方便起见,可以用赋值伪指令给表达式赋予一个名字。格式;表达式名 EQU 表达式 一旦定义,程序中凡需要用到该表达式之处就可以用表达式名来代替了。上式中的表达式可以是任何可以求出常数值的表达式或常数,也可以是任何有效的助记符。当表达式为单个常数时,赋值伪指令即为符号常数定义伪指令。,CONSTANT EQU 256;定义

16、符号常数 DATA EQU HEIGHT+12;地址表达式赋以符号名 先赋值的符号名可以在后面的赋傻语句中引用:ABC EQU 7 ABCD EQU ABC-2 一般情况下,赋值定义符EQU可用等号“=”代替,二者之间的区别仅在于:由EQU定义的符号名不可重新赋值,而由“=”赋值的符号名可以重新赋值。如:EMM6或EMM EQU 6都可将常数6赋给符号名EMM,但不允许两者同时使用。而 XYZ=7 XYZ=XYZ十3是允许的因为“”伪指令允许重复定义。先有XYZ为7,后又有XYZ为10。EQU的指令的一个经常用途是利用当前地址计数器获取数组或字符串变量的长度。如:,STR DB this is

17、 a good example.STRLEN EQU-STRSTRLEN定义为常数,其值等于字符串STR中的字符数。为23。2.标号定义伪指令LABEL 格式:符号名 LABEL 类型这里的符号名可以是标号或变量。利用LABEL伪指令,可以使同一存储地址有不同类型的标号或变量名,它使程序设计更加灵活、方便。倒如:WORD_ARY LABEL WORD BYTE_ARY DB 100 DUP(0)前一条指令将WORD_ARY定义为字类型的标号,但不移动汇编地址分配指针,后一条指令将从内存当前地址分配100字节给BYTE_ARY字节数组,这样做的结果是两个数组占有同一存储空间,WORD_ARY为5

18、0个字的字数组,BYTE_ARY为100个字节的字节数组。,4.2.3 段定义伪指令 80868088的存储器是分段的存储器的物理地址是由段地址和偏移地址组合而成的。所以,80868088必须按段来组织程序和使用存储器这就需要事先对段进行定义。与段定义有关的伪指令有:SEGMENTENDS,ASSUME和ORG。1.段定义伪指令 格式如下:段名 SEGMENT 指令序列 段名 ENDS 段定义指令中的段名是自定义的符号名,可以使用符合名字项规定的任意名字。,由于段名是用户定义名,源程序中必须要有向汇编程序说明段类型的信息,这是用ASSUME伪操作来实现的。其格式为:ASSUME 段寄存器名:段

19、名,段寄存器名,段名,其中,段寄存器名必须是CS、DS、ES和SS中的一个,而段名则必须是由SEGMENT定义的段名。用ASSUME NOTHING可取消前面由ASSUME所指定的所有段寄存器。任何对存储器或堆栈访问的指令,都将使用CS、DS、ES或SS段寄存器的值,才能形成真正的物理地址。因此在这些指令执行之前,必须要首先设定这些段寄存器的值。由于ASSUME伪指令只是指定某个段分配给那个段寄存器,并不把段地址装入段寄存器,所以在存储嚣访问指令执行前,还必须通过MOV指令来给DS、ES和SS段寄存器赋值,即进行段地址装填。注意,代码段寄存器CS的赋值在程序初始化时自动完成,不需要在程序中装填

20、。,例4.1 MY_DATA SEGMENT X DB?Y DW?Z DD?MY_ DATA ENDS MY_EXTRA SEGMENT ALPHA DB?BETA DW?GAMMA DD?MY_EXTRA ENDS MY_STACK SEGMENT DW 100 DUP(?)TOP EQU THIS WORD MY_STACK ENDS,MY_CODE SEGMENT ASSUME CS:MY_CODE,DS:MY_DATA ASSUME ES:MY_EXTRA,SS:MY_STACKSTART:MOV AX,MY_DATA MOV DS,AX MOV AX,MY_EXTRA MOV ES,

21、AX MOV AX,MY_STACK MOV SS,AX LEA SP,TOP MOV AH,4CH INT 21H MY_CODE ENDS END START,3.定位伪指令ORG 定位伪指令用于指定其后的程序段或数据块起始地址的偏移量。格式:ORG 表达式 表迭式必须是一个数值范围为065535的数值表达式,指出偏移地址。伪指令ORG可设置于代码段、数据段的任何地方。表明这语句下面的程序或数据要从表达式指定的地址开始存放。例如;ORG 0100H定位于偏移地址0100H,ORG$+20定位于当前地址以后的20个字节处。无ORG指令时,段内偏移地址是从段名SEGMENT以下0000处开始分

22、配。,例4.2 MY_DATA SEGMENT A DB 12H B DW?C DW 865CH MY_DATA ENDS 变量A的偏移地址为0000H,即存放12H数据的地址,B为预留的字单元。它的偏移地址为0001H,C为字变量,它的偏移地址为0003H。,4.2.4 过程定义语句 过程定义语句用来定义一个子程序。子程序又称过程,在程序中由CALL指令调用,调用结束将返回到调用程序中CALL指令后面一条指令继续执行。子程序中必须有一条返回指令RET以返回调用它的程序。过程定义语句的格式:子程序名 PROC 类型 RET 子程序名 ENDP 子程序的类型有两种:NEAR类型和FAR类型。只在

23、本段内调用的过程是NEAR过程,可在不同段间调用的过程是FAR过程,其中NEAR为隐含类型,即定义时若不指定类型,汇编程序自动按NEAR类型处理。,4.3 操作数运算符,操作数运算符是操作数表达式中使用的运算符。应当注意:操作符要求的操作运算实在汇编过程中而不是在程序运行时实现的,即在程序投入运行时已经实现了。4.3.1 算术运算符 算术运算符有+、-、*、/和MOD。算术运算符可用于数值表达式或地址表达式中,用于地址表达式时,只有当其结果有明确的物理意义时才是有效的。例如,两个地址相乘或相除是无意义的,两个不同段的地址相加也是无意义的。,4.3.2 逻辑运算符 逻辑运算符有AND、OR、XO

24、R和NOT,逻辑运算符是按位操作的,它只能用于数值表达式中。4.3.3 关系运算符 关系运算符有EQ(相等)、NE(不相等)、LT(小于)、GT(大于)、LT(小于或等于)、GE(大于或等于)6种。关系运算符的两个操作数必须都是数字或是同一段内的两个存储器地址。,4.3.4 数值回送操作符 数值回送操作符有TYPE、LENGTH、SIZE、OFFSET、SEG 5种。这些操作符把一些特征值或存储器地址的一部分作为数值回送。1.类型操作符 TYPE 格式:TYPE 变量或标号 对于变量,汇编程序将回送该变量以字节数表示的类型:DB为1,DW为2,DD为4。对于标号,汇编程序将回送代表该标号类型的

25、数值:NEAR为-1,FAR为-2。例如:ARRAY DW 1,2,3则对于指令ADD SI,TYPE ARRAY汇编结果等价于汇编指令ADDSI,2,2单元数操作符LENGTH 格式:LENGTH变量 对于变量中使用DUP的情况,汇编程序将回送分配给该变量的单元数(以变量类型为单位)。而对于其它情况,则回送1。例如:FEES DW l00 DUP(0),则对于指令MOV CX,LENGTH FEES汇编结果等价于汇编指令MOV CX,100。又如:TABLE DB ABCD,对于指令MOV CX,LENGTH TABLE汇编结果等价于汇编 指令MOV CX,1。,3.字节数操作符 SIZE

26、格式,SIZE 变量 汇编程序将回送分配给该变量的字节数。此值是LENGTH值和TYPE值的乘积。例如:FEES DW 100 DUP(0)对于指令MOV CX,SIZE FEES,汇编程序回送分配给该变量的字节数为200。汇编结果与MOV CX,200指令相同因为FEES的TYPE值为2。,4偏移量操作符OFFSET 格式:OFFSET 变量或标号 汇编程序将回送变量或标号的偏移地址值。例如:MOV BX,OFFSET BUFFER 汇编程序将BUFFER的偏移地址作为立即数回送给指令,在程序执行时,该偏移地址将装入BX寄存器中。所以这条指令与指令:LEA BX,BUFFER等价。5段地址操

27、作符SEG 格式;SEG变量或标号汇编程序将回送变量或标号的段地址值。例如:DATA_SEG是从存储器物理地址05000H地址开始的一个数据段的段名,OPERI是该段中的一个变量名,则MOV BX,SEG OPERl将把段地址0500H作为立即数插入指令。执行期间则使BX寄存器的内容为0500H。,4.3.5 属性操作符 属性操作符有PTR、SHORT、THIS、HIGH和LOW 5种。1指针操作符PTR 格式:类型 PTR 表达式 类型可以是BYTE,WORD,DWORD,FAR和NEAR之一。表达式是存储器操作数。PTR用来为表达式确定新的类型属性,它本身并不改变存储器分配情况,只是用来给

28、已分配的存储器地址赋予另一种属性,使该地址具有另一种类型。格式中的类型字段表示所赋予的新的类型属性,而表达式字段则是被取代类型的符号地址。,已有数据定义如下:TWO_BYTE DW?TWO_BYTE已定义为字操作数的存储地址,可以用以下语句给这两个字节赋予另一种类型定义:0NE_BYTE EQU BYTE PTR TWO_BYT OTHER_BYTE EQU BYTE PTR(TWO_BYTE+1 这时ONE_BYTE和TWO_BYTE两个符号地址具有相同的段地址及偏移地址,但是它们的类型属性不同,前者为1,后者为2。有时指令要求使用PTR操作符。例:MOV BX,6 指令把立即数存入BX寄存

29、器内容指定的存储单元中,但汇编程序不能分清是存入字单元还是字节单元,此时必须用PTR操作将来说明属性。MOV BYTE PTRBX,6或 MOV WORD PTRBX,6,2.指定操作符THIS 格式:THIS属性或类型 THIS和PTR相似,可建立一个指定类型(BYTE、WORD或DWORD)或指定距离(NEAR或FAR)的地址操作数。该操作数的段地址和偏移地址与下一个存储单元地址相同。FIRST_TYPE EQU THIS BYTE WORD_TABLE DW l00 DUP(?)此时,FIRST_TYPE的偏移地址值和WORD_TABLE完全相同,前者是字节类型,后者是字类型。,3短转移操作符SHORT SHORT用于表明JMP指令中转移地址的属性,指出转移地址是一字节相对位移量的段内转移。4字节分离操作符HIGH和LOW HIGH和LOW针对一个16位数值或地址表达式,HIGH取其高位字节,LOW取其低位字节。CONST EQU 0ABCDHMOV AH,HIGH CONST将汇编成:MOV AH,0ABH,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号