您好,欢迎访问三七文档
14.1汇编语言语句种类及其格式第四章汇编语言程序格式不同的汇编程序有不同的汇编语言编程规定。目前支持Intel8086/8088系列微机,常用的汇编程序有ASM、MASM、TASM、OPTASM等。本章主要介绍汇编语言程序设计中的一些基本书写格式与语法规则。2每一条指令语句在汇编时都要产生一个可供CPU执行的机器目标代码,它又叫可执行语句。一、指令语句指令语句的一般格式为:标号指令助记符操作数注释;:,一条指令语句最多可以包含4个字段汇编语言的语句可以分为指令语句、伪指令语句和宏指令语句(宏调用语句)。3标号是可选字段,它后面必须有“:”。标号是一条指令的符号地址,代表了该指令的第一个字节存放地址。1.标号字段标号一般放在一个程序段或子程序的入口处,控制程序的执行转到该程序位置。例ADDR1:MOVAL,100在转移指令或子程序调用指令中,可直接引用这个标号。4该字段是一条指令的必选项,它表示这条语句要求CPU完成什么具体操作,如MOV、ADD、SHL等。2.指令助记符字段一条指令可以有一个操作数、两个操作数或者无操作数。3.操作数字段有些指令还可以在指令助记符的前面加上前缀,实现一定的附加操作。如串操作指令前所加的重复前缀REP(见第7章介绍)等。如ADD、MOV指令需要两个操作数,INC、NOT指令只需一个操作数,而CLC指令不需要操作数。54.注释字段例:LABEL1:ADDAX,BX;功能为AX=(AX)+(BX);后面的程序段将完成一次对存储器的访问注释字段为可选项,该字段以分号“;”开始。注释字段可以是一条指令的后面部分,也可以是整个语句行。它的作用是为阅读程序的人加上一些说明性内容注释字段不会产生机器目标代码,它不会影响程序和指令的功能。6伪指令本身并不产生对应的机器目标代码。它仅仅是告诉汇编程序对其后面的指令语句和伪指令语句的操作数应该如何处理。二、伪指令语句伪指令语句又叫命令语句。一条伪指令语句可以包含四个字段。如下所示:符号名伪指令符操作数注释;,71.符号名字段该字段为可选项。根据伪指令的不同,符号名可以是常量名、变量名、过程名、结构名和记录名等等。注意:符号名后面没有冒号“:”,这是与指令语句的重要区别。一条伪指令语句的符号名可以作其它伪指令语句或指令语句的操作数,这时它表示一个常量或存储器地址。8该字段是伪指令语句的必选项,它规定了汇编程序所要完成的具体操作。本章后面的章节将对各种伪指令作详细介绍。2.伪指令符字段该字段是否需要,以及需要几个是由伪指令符字段来决定。3.操作数字段操作数可以是一个常数(二进制、十进制、十六进制等)、字符串、常量名、变量名、标号和一些专用符号(如BYTE、FAR、PARA等)。9注释字段为可选项,该字段必须以分号开始。其作用与指令语句的注释字段相同。4.注释字段三、标识符指令语句中的标号和伪指令语句中符号名统称为标识符。标识符是由若干个字符构成的。标识符构成规则:1.字符的个数为1~31个;2.第一个字符必须是字母、问号、@或下划线“_”这4种字符之一;10保留字主要有CPU中各寄存器名(如AX、CS等),指令助记符(如MOV、ADD),伪指令符(如SEGMENT、DB)、表达式中的运算符(如GE、EQ)以及属性操作符(如PTR、OFFSET等)。3.从第二个字符开始,可以是字母、数字、@、“_”或问号“?”;4.不能使用属于系统专用的保留字。11在说明数据时不仅要指定其数值,还需说明它的属性,如是字节数据还是字数据。4.2汇编语言数据数据是指令和伪指令语句中操作数的基本组成部分。一个数据由数值和属性两部分构成。在汇编语言中常用的数据形式有:常数、变量和标号。12常数在汇编期间其值已完全确定,并且在程序运行过程中,其值不会发生变化。一、常数常数有以下几种形式:1.二进制数:以字母B结尾,如01001001B2.八进制数:以字母O或Q结尾,如631Q254O3.十进制数:以字母D结尾,或者没有结尾字母。如2007D、2007。134.十六进制数:以字母H结尾,如3FEH,如果常数的第一个数字为字母,为了与标识符加以区别,必须在其前面冠以数字“0”。±整数部分•小数部分E±指数部分尾数汇编程序在汇编源程序时,可以把实数转换为4字节、8字节或10字节的二进制数形式存放。例2.134E+105.实数。一般格式为:146.字符串常数:用引号(单引号或双引号)括起来的一个或多个字符,这些字符以它的ASCII码值存储在内存。例如`B`在内存中为42H,`ABC`为41H42H43H。在内存中的存储如图所示。43H42H41H…..….低地址高地址15(3)在数据定义伪指令中使用常数在程序中可以用在以下几种情况:(1)作指令语句的源操作数(2)在指令语句的直接寻址方式、变址(基址)寻址方式或基址变址寻址方式中作位移量。MOVAX,0B2F0HADDAH,64HMOVBX,32H[SI]MOV0ABH[BX],CXADCDX,1234H[BP][DI]DB10HDW3210H16变量用来表示存放数据的存储单元,这些数据在程序运行期间可以被改变。二、变量定义变量就是给变量在内存中分配一定的存储单元。也就是给这个存储单元赋与一个符号名,即变量名,同时还要将这些存储单元预置初置。1.变量的定义与预置定义变量使用数据定义伪指令DB、DW、DD、DQ和DT等。程序中以变量名的形式来访问变量,因此,可以认为变量名就是存放数据的存储单元地址。17变量定义的一般格式:其中表达式1、表达式2是给存储单元赋的初值。DB;定义字节变量DW;定义字变量变量名DD表达式1,表达式2……;定义4字节变量DQ;定义8字节变量DT;定义10字节变量例如:VAR_DATASEGMENTDATA1DB12HDATA2DB20H,30HDATA3DW5678HVAR_DATAENDS18它表示变量所在位置与段起始点之间的字节数。当变量被定义后,就具有了以下三个属性:(1)段属性它表示变量存放在哪一个逻辑段中。(2)偏移量属性(OFFSET)段属性和偏移量属性就构造了变量的逻辑地址例如上面例子中的变量DATA1、DATA2和DATA3三个变量都存放在VAR-DATA逻辑段中。如上述例子中,变量DATA1的偏移量为0,DATA2为1,DATA3为3。19它表示变量占用存储单元的字节数。其中DB伪指令定义的变量为字节,DW定义的变量为字,DD定义的为双字(4字节),DQ定义的为4字,DT定义的为5字。(3)类型属性在变量的定义语句中,给变量赋初值的表达式可以使用下面4种形式:例如:DATA1DB32,30HDATA1的内容为32(20H),DATA1+1单元内容为30H.(1)数值表达式20例如:DA-BYTEDB?,?,?表示让汇编程序分配三个字节存储单元。这些存储单元的内容的值为任意值。不带引号的问号“?”表示可以预置任意内容。(2)?表达式对于DB伪指令,字符串为用引号括起来的不超过255个字符。给每一个字符分配一个字节单元。字符串按从左到右,将字符的ASCII编码值以地址递增的排列顺序依次存放。(3)字符串表达式21对于DW伪指令可以给两个字符组成的字符串分配两个字节存储单元。例如:STRING2DW‘AB’,‘CD’,’EF’例如:STRING1DB‘ABCDEF’STRING241H42H43H44H45H46H‘B’‘A’‘D’‘C’‘E’‘F’46H41H42H43H44H45HSTRING1‘A’‘B’‘C’‘D’‘E’‘F’注意:两个字符的存放顺序是前一个字符放在高地址,后一字符放低地址单元。22例如:STRING3DD‘AB’,‘CD’注意:DW和DD伪指令不能用两个以上字符构成的字符串赋初值,否则将出错。对于DD伪指令,只能给两个字符组成的字符串分配4个字节单元。41H42H43H44H00000000STRING3‘A’‘B’‘D’‘C’两个字符存放在较低地址的两个字节单元中。存放顺序与DW伪指令相同,而较高的两个字节单元都存放0。23(4)DUP表达式DUP称为重复数据操作符。使用DUP表达式的一般格式为:DB变量名DW表达式1DUP(表达式2)DD其中:表达式1是重复的次数,表达式2是重复的内容。例如:DATA_ADB10HDUP(?)DATA_BDB20HDUP(‘AB’)分配16个字节单元分配20H*2=40H个字节,其内容为重复字符串‘AB’。24DUP还可以嵌套使用,即表达式2又可以是一个带DUP的表达式。例如:DATA_CDB10HDUP(4DUP(2),7)重复10H个数字序列“2,2,2,2,7”,共占用10H*5=50H个字节。2.变量的使用(1)在指令语句中引用例如:DA1DB0FEHDA2DW52ACH……MOVAL,DA1;将0FEH传送到AL中MOVBX,DA2;将52ACH传送到BX中在指令语句中直接引用变量名就是对其存储单元的内容进行存取25当变量出现在变址(基址)寻址或基址变址寻址的操作数中时表示取用该变量的偏移量。例如:DA3DB10HDUP(?)DA4DW10HDUP(1)MOVDA3[SI],ALADDDX,DA4[BX][DI]......DA3DA4(SI)(BX)+(DI)111111将AL的内容送入从DA3开始再偏移(SI)的存储单元中将从DA4开始再偏移(BX)+(DI)的字存储单元的内容与DX的内容相加,结果送回DX中。26后面三条伪指令的操作数中都包含了前面定义的两个变量设上述语句所在段的段基值为0915H,NUM的偏移量为0004H,则存储单元的分配情况如图所示。75H0000000400040015H09H0700......ADR3NUMARRAY+0+1+3FADR1ADR2(2)在伪指令语句中引用NUMDB75HARRAYDW20HDUP(0)ADR1DWNUMADR2DDNUMADR3DWARRAY[2]它表示取变量地址的偏移量取变量段基值和偏移量。前两个字节存偏移量,后两个字节存段基值27标号写一条指令的前面,它就是该指令在内存的存放地址的符号表示,也就是指令地址的别名。三、标号例如:MOVCX,100LAB:MOVAX,BX……LOOPLABJNENEXT;不为零转移……NEXT:……标号主要用在程序中需要改变程序的执行顺序时,用来标记转移的目的地,即作转移指令的操作数。28它表示该标号可以被段内还是段间的指令调用。每个标号具有三属性(1)段属性(SEG)它表示该标号所代表的地址在哪个逻辑段中,即段基值。(2)偏移量属性(OFFSET)它表示该标号所代表的地址在段内与段起点间的字节数,即地址的偏移量。(3)距离属性(也叫类型属性)该标号只能作段内转移,也就是说只能是与该标号所指指令同在一个逻辑段的转移指令和调用指令才能使用它。NEAR(近):29当标号加在指令语句前面时,它隐含为NEAR属性。a.隐含方式例SUB1:MOVAX,30HSUB1的距离属性为NEAR也就是它只能被本段的转移指令和调用指令访问。b.用LABEL伪指令给标号指定距离属性类型为NEAR或FAR。该语句应与指令语句连用。格式:标号名LABEL类型该标号可以被非本段的转移和调用指令使用。标号的距离属性可以有两种方法来指定:FAR(远):30例如:SUB1_FARLABELFARSUB1:MOVAX,30H…...SUB1_FAR与SUB1两个标号具有相同的段属性和偏移量属性,即相同的逻辑地址。被转移指令或调用指令访问时,是指同一个入口地址,但SUB1-FAR可以被其它段的指令调用。LABEL伪指令还可以用来定义变量的属性,即改变一个变量的属性,如把字变量的高低字节作为字节变量来处理。例如:DATA_BYTELABELBYTEDATA_WORDDW20HDUP(?)DATA_BYTE与DATA_WORD具有相同的段基值和偏移量。DATA_BYTE可以被用来存取一个字节数据,而DATA_WORD则不能。31在源程序设计中,使用符号定义语句将一些常数或表
本文标题:汇编语言程序格式
链接地址:https://www.777doc.com/doc-4781359 .html