您好,欢迎访问三七文档
当前位置:首页 > 医学/心理学 > 药学 > 9--汇编语言的伪指令语句
(三)汇编语言的伪指令语句一、符号定义伪指令语句为一个表达式或指令助记符赋予一个符号名。在后继程序文本中,可以使用该符号名来替代这个表达式或指令助记符。(1)等值语句EQU格式:符号名EQU表达式/指令助记符例如:PORT1EQU312;为数值常量312赋予符号名PORT1PORT2EQUPORT1+1;为数值表达式赋予符号名PORT2ADDREQUES:[SI+4];为地址表达式定义一个名字STRINGEQU‘COMPUTER’;为字符串常量定义一个名字COUNTEQUCX;为寄存器CX定义新的符号名LDEQUMOV;为助记符MOV定义新的符号名LD说明:①在EQU语句的表达式中,如果有标号名或变量名,则该语句必须放在它们的定义语句之后。例如ABEQUDATA+2必须放在标识符DATA的定义之后,否则汇编程序将指示以下错误:Symbolnotdefined:DATA②后面的EQU伪操作可以利用前面的EQU伪操作已经定义的符号名。例如:ALPHAEQU7;给数值7赋以符号名ALPHABETAEQUALPHA-2;给7-2=5赋以符号名BETAADDREQUVAR+BETA;给VAR+5赋以符号名ADDR③使用EQU伪操作定义过的符号名不允许重复定义。例如:EMPEQU0;给数值7赋以符号名ALPHAEMPEQUEMP+1;汇编该语句时,汇编程序将指示出错。(2)等号语句=格式:符号名=表达式/指令助记符该语句的功能与EQU完全相同,唯一的区别是:该语句可以对符号名进行重复定义。例如:EMP=0;定义符号名EMP为0EMP=EMP+1;重新定义符号名EMP为1,完全合法。二、数据定义伪指令语句数据定义语句用于定义变量,该语句指定变量的名称和变量的类型,并为该变量分配存储单元。(1)数据定义语句的格式[变量名]数据定义符操作数[,操作数]…[,操作数]其中,①变量名:可选项。②操作数:赋给变量的初值,多个相同类型的变量可在一条语句中定义。③数据定义符常用数据定义符有以下三种。•DB:定义字节变量,每个变量占有1个字节的存储单元。•DW:定义字变量,每个变量占有2个字节的存储单元。•DD:定义双字变量,每个变量占有4个字节的存储单元。此外,还有DQ、DF和DT等类型。对于多字节变量,其变量值的内存存放规则是,低位字节占低地址单元,高位字节占高地址单元。说明:经过定义的变量必然具有以下三个属性。•数据类型字节、字、双字等等。•偏移地址分配给该变量的存储单元的偏移地址。•段基址分配给该变量的存储单元的段基址,也就是定义该变量的逻辑段的段基址。(2)数据定义语句的具体形式和功能根据操作数的不同表达形式,常见的数据定义语句有以下几种具体形式。①操作数是一个数值常量例如:XDB25H;定义一个名为X、初值为25H的字节变量YDW4142H;定义一个名为Y、初值为4142H的字变量ZDD12345678H;定义一个名为Z、初值为12345678H的双字变量X┇25HY42H41HZ78H56H34H12H┇汇编时,汇编程序将完成以下工作:①首先,定义名为X的字节变量,并为其分配一个字节单元,然后再把初值25H装入该单元中。②随后,定义名为Y的字变量,并为其分配一个字单元,然后再把初值4142H装入该单元中。③最后,定义名为Z的双字变量,并为其分配一个双字单元,然后再把初值12345678H装入该单元中。②操作数是一个数值表达式例如:PORTEQU80HOUT_PORTDWPORT+1汇编程序将定义一个名为OUT_PORT的字类型变量,并为其分配一个字单元,然后计算数值表达式(PORT+1)的数值,并把计算结果0081H装入该单元中。┇OUT_PORT81H00H┇③操作数部分使用问号?例如:ADB?;定义字节变量A,并为其分配一个字节单元BDW?;定义字变量B,并为其分配一个字单元汇编程序只为变量分配存储单元,并不赋予其具体的初值,该变量的初值不确定。A┇B┇④操作数部分是用逗号分隔的若干个操作数例如:TABLEDW1,2,3TABLE┇01H00H02H00H03H00H┇汇编程序首先定义一个名为TABLE的字类型变量,并为该变量分配一个字单元,再将变量初始值0001H装入其中。然后,再为一个无名字变量分配一个字单元,并将变量初始值0002H装入其中。最后,再为一个无名字变量分配一个字单元,并将变量初始值0003H装入其中。这个数据定义语句定义了三个变量,第一变量的变量名为TABLE,其它两个变量没有变量名。但是由于这三个变量的存储单元依次排列,具有线性存储特性,因此我们可以将这种数据定义语句看成是数组变量的定义语句,并将第一个变量的变量名TABLE看成是数组变量名,将这三个变量看成是该数组的数组元素。于是各数组元素的访问地址可以用下式来确定。数组元素地址=数组变量名+数组元素下标值*数组元素字节大小TABLE┇01H00H02H00H03H00H┇MOVAX,TABLE;(AX)=0001HMOVAX,TABLE+1*2;(AX)=0002HMOVAX,TABLE+2*2;(AX)=0003H在定义数组变量时,可以使用重复操作符DUP来定义各个数组元素,其定义格式如下。重复次数DUP(操作数1,…,操作数N)这个表达形式的含义是,将括号中的N个操作数,以指定的次序,重复指定次数。其中,重复次数字段是值为正整数的数值表达式。例如:TABLEDB2DUP(0,1),2<=>TABLEDB0,1,0,1,2注意:DUP重复操作符可以嵌套使用,例如以下两式是等价的。TABLEDB2DUP(2DUP(1,2),3)TABLEDB1,2,1,2,3,1,2,1,2,3CDAB⑤操作数是一个字符串常量例如:STRINGDB‘ABCDEF’该语句定义了一个字符数组变量STRING。汇编程序将为这个数组变量分配一个数据区,并将字符串中每一个字符的ASCII码依次装入到数据区的各个字节单元中。STRING┇41H42H43H44HEF45H46H┇STRING2注意:①当字符串长度超过两个字符时,伪指令定义符只能使用DB。②当字符串长度不超过两个字符时,伪指令定义符DB、DW、DD、DQ等都可以使用,但它们的意义有所不同。例如:STRING1DB‘AB’STRING2DW‘AB’BAABSTRING1┇41H42H42H41H┇MOVAL,STRING1;(AL)=41HMOVAL,STRING1+1;(AL)=42HMOVAX,STRING2;(AX)=4142HXADDR2⑥操作数是一个存储器地址(标号、过程名或变量名)例:XDB10HADDR1DWXADDR2DDX┇ADDR1变量X的偏移地址的低字节变量X的偏移地址的高字节变量X的偏移地址的低字节变量X的偏移地址的高字节变量X的段基址的低字节变量X的段基址的高字节┇10H当操作数是一个存储器地址时,数据定义符只能使用DW或DD。此时汇编程序将使用这个存储器地址的偏移地址(DW)或全地址(DD)来初始化变量。全地址的存放格式是,16位偏移地址放在低地址单元,16位段地址放在高地址单元。⑦操作数是如下形式的地址表达式标号或变量名±结果为整数的数值表达式这个地址表达式的运算结果仍然表示一个标号或变量,其类型属性和段基址属性与原来的标号或变量相同,只有其偏移量属性产生相应的增减。因此,汇编程序对这个表达式的处理完全等同于处理一个存储器地址。数据定义符只能使用DW或DD,汇编程序将使用这个新存储器地址(地址表达式的运算结果)的偏移地址(DW)或全地址(DD)来初始化变量。例如:XDB10HADDR1DWX+1ADDR2DDX+1汇编第2条语句时,汇编程序将存储器地址X+1的偏移地址装入到分配给变量ADDR1的双字节存储单元内。汇编第3条语句时,汇编程序将存储器地址X+1的全地址装入到分配给变量ADDR2的双字存储单元内。其中16位偏移地址被存放在低字单元内,16位段地址被存放在高字单元内。⑧操作数是如下形式的数值表达式变量名1-变量名2或者标号1-标号2其中,变量名1和变量名2:同一逻辑段内定义的两个变量名。标号1和标号2:同一代码段内定义的两个标号。同一逻辑段内的两个标号或变量名的相减结果是一个数值,它表示两者之间相距的字节数。TABLE2LENGTH1LENGTH2TABLE1┇01H02H03H04H┇05H06H04H02H例如:TABLE1DB1,2,3,4TABLE2DB5,6LENGTH1DBTABLE2-TABLE1LENGTH2DBLENGTH1-TABLE2说明:数据定义语句定义了变量的数据类型,汇编程序可以利用这种隐含的类型属性来确定某些指令是字指令、还是字节指令。例如:OPER1DB?,?OPER2DW?,?┇MOVOPER1+1,0;字节指令MOVOPER2+2,0;字指令MOVOPER1+1,AL;字节指令MOVOPER2+1,AX;字指令(3)分析运算符(SEG、OFFSET、TYPE、SIZE、LENGTH)分析运算符作用于变量或标号,运算结果为变量或标号的属性值,其使用格式为:运算符变量/标号①SEG和OFFSET运算符SEG和OFFSET运算分别返回变量或标号的段地址和偏移地址。例如:ARRAYDB100DUP(0);定义字节数组变量ARRAY┇MOVAX,SEGARRAY;变量ARRAY的段地址→(AX)MOVDX,AXMOVBX,OFFSETARRAY;变量ARRAY的偏移地址→(BX)MOVAL,[BX]②TYPE、LENGTH和SIZE操作符TYPE操作符返回一个表示变量类型或标号类型的数值。变量的类型值是变量的字节长度值;标号的类型值只起区别作用,没有实际物理意义。类型代码类型值字节变量BYTE1字变量WORD2双字变量DWORD4标号NEAR-1(0FFH)标号FAR-2(0FEH)在数组变量定义语句中,如果第一个操作数项使用DUP运算符定义,则该数组变量的LENGTH运算结果是此DUP运算符前面的重复次数,其它一切情况下,返回1。SIZE运算符的运算结果为TYPE运算结果和LENGTH运算结果的乘积,表示分配给数组变量的字节总数。例如:BUFFER1DB100DUP(0)BUFFER2DW200DUP(20H)BUFFER3DD100DUP(13)则有:TYPEBUFFER1=1LENGTHBUFFER1=100SIZEBUFFER1=100TYPEBUFFER2=2LENGTHBUFFER2=200SIZEBUFFER2=400TYPEBUFFER3=4LENGTHBUFFER3=100SIZEBUFFER3=400(4)合成运算符(PTR、THIS)合成运算符作用于变量或标号,对原变量或标号的类型属性进行修改,从而建立起一个新的变量或标号。①PTR运算符该运算符采用原变量或标号的段属性和偏移地址属性,指定一个新的类型属性,从而建立起一个新的变量或标号,而原变量或标号的类型属性不变。例1:ARRAY1DB0,1,2,3;定义字节数组变量ARRAY1ARRAY2DW4,5,6,1234H;定义字数组变量ARRAY2MOVBX,WORDPTRARRAY1;0100H→(BX)MOVCL,BYTEPTR(ARRAY2+3*2);34H→(CL)MOVWORDPTR[SI],4;0004H→SI所指向的字单元配合EQU伪指令,我们可以定义新的变量名。例如:ARRAY1DB0,1,2,3;定义字节数组变量ARRAY1ARRAY2DW4,5,6,1234H;定义字数组变量ARRAY2┇WEQUWORDPTRARRAY1BEQUBYTEPTRARRAY2新变量W和B的段地址和偏移地址分别与ARRAY1和ARRAY2相同,只是它们的类型已经发生变化。在后面的程序中,可以直接使用这两个新定义的变量。MOVBX,W+3;0403H→(BX)MOVCL,B+6;34H→(CL)②THIS操作符THIS操作符为当前存储单元(当前地址计数器所指向的存储单元)设定一个指定
本文标题:9--汇编语言的伪指令语句
链接地址:https://www.777doc.com/doc-5299747 .html