汇编语言程序设计-吴向军-27949Chapter-4_第1页
汇编语言程序设计-吴向军-27949Chapter-4_第2页
汇编语言程序设计-吴向军-27949Chapter-4_第3页
汇编语言程序设计-吴向军-27949Chapter-4_第4页
汇编语言程序设计-吴向军-27949Chapter-4_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

汇编语言程序设计,吴向军,2011.5.10,E-Mail:issxjwu,第4章标识符和表达式,标识符和表达式是程序设计经常用到的两个基本概念.4.1标识符在汇编语言中,标识符最多由31个字母、数字及规定的特殊字符(?、_、$)等组成,但它不能用数字开头.标号、内存变量名、子程序名和宏名等都是标识符.通常情况下,汇编语言不区分标识符中字母的大小写.和高级语言的变量名一样,一般要求标识符尽可能取得有点含义,这会有助于对程序的理解.标识符不能是汇编语言的保留字,汇编语言的保留字主要是指:指令助忆符、伪指令定义符、寄存器名以及一些具有特殊含义的字符串等.例如:MSG1、ERRMSG2、ASC1、asc2等是合法的标识符,而1a、ah、mov等就不是标识符.试比较ABCDH和0ABCDH之间的差异.前者是标识符,而后者是十六进制数值.,第4章标识符和表达式,4.2简单内存变量的定义在高级语言程序中,要给存储单元取一个符号名,然后通过引用该符号名来访问其所对应的存储单元.在汇编语言程序中要灵活一些,它可以给存储单元取符号名,也可以不取符号名.当给存储单元取符号名时,则可通过该符号名来访问其对应的存储单元;当不给存储单元取符号名时,则可通过存储单元的偏移量(有效地址)来访问它.,第4章标识符和表达式,4.2简单内存变量的定义4.2.1内存变量定义的一般形式定义内存变量语句是程序中经常使用的伪指令语句,其一般格式如下:变量名数据定义符表达式1,表达式2,表达式n;注释该定义格式的主要解释如下:变量名必须是一个合法的标识符,它可以写,也可以不写;数据定义符用于确定内存单元的数据类型,常用定义符有:DB、DW和DD等;表达式是定义内存单元时的初值表达式,一个定义语句可以有多个初值表达式,各表达式之间必须用逗号分开;如果某个存储单元没有初值表达式,则必须用一个问号?来表示;在定义语句的后面可以书写注释内容,也可以不写.,第4章标识符和表达式,4.2简单内存变量的定义4.2.1内存变量定义的一般形式在定义变量时,虽然可以不写变量名,但我们建议还是要写,因为不写变量名,就意味着只能用内存单元的偏移量来访问它.这时,一旦内存单元的偏移量发生变化,那么程序中所有引用都要修改.这不仅增加了程序维护的工作量,而且也容易因遗漏修改而出错.,第4章标识符和表达式,4.2简单内存变量的定义4.2.2字节变量字节变量的定义符为DB/BYTE(DefineByte)(*),每个字节变量只占一个字节单元.例如:COUNTERDB6DBA,D,0Dh,$TABLEDB1,3,5,7,9,11(*)BYTE是MASM6.0及其以后版本的数据类型说明符,随后的其它类型说明符同此说明.,COUNTER,TABLE,第4章标识符和表达式,4.2简单内存变量的定义4.2.2字节变量用定义符DB还可定义一种特殊的数据形式字符串.在定义字符串时,必须用成对的单引号或双引号把所要的字符括起来,括号内字符的ASCII码将依次存放在相应的字节单元内.例如:MSG1DBIamastudent.上面的例子也可改写为另一种等价的语句:MSG1DBI,a,m,a,s,t,u,d,e,n,t,.显然,前者比后者方便得多,所以,在程序中都采用前者的书写方式.,第4章标识符和表达式,4.2简单内存变量的定义4.2.3字变量字变量的定义符为DW/WORD(DefineWord),每个字变量占两个连续的字节单元.例如:Word1DW89H,1909H,-1DW0abcdH,?,0由于字变量的数据是按照高高低低的原则存于存储单元之中的,而字节数据是按照排列顺序存于存储单元中的,所以,它们的存储方式有所不同.,第4章标识符和表达式,4.2简单内存变量的定义4.2.3字变量试比较下面两个定义的存储顺序.B1DBABW1DWAB其中:41H和42H分别是A和B的ASCII码.,第4章标识符和表达式,4.2简单内存变量的定义4.2.4双字变量双字变量的定义符为DD/DWORD(DefineDoubleword),每个双字变量占用二个连续的字单元(四个字节).例如:DD1DD12345678H,?DD2DD0abcd1243H上述定义的内存分配如下所示,双字的内容也是按高高低低的原则来存储的.,第4章标识符和表达式,4.2简单内存变量的定义4.2.5六字节变量六字节变量的定义符为DF/FWORD(DefineFarword).每个六字节变量占用六个连续的字节.例如:DF1DF1234567890abH,0H,-1DF1abcd23H第一个六字节常量1234567890abH在内存中的分配方式如下所示,它也是按“高高低低”的原则来存储的.其它六字节常量的存储方式与此一致.,第4章标识符和表达式,4.2简单内存变量的定义4.2.6八字节变量八字节变量的定义符为DQ/QWORD(DefineQuadword).每个八字节变量占用八个连续的字节.例如:DQ1DQ12345678H,0H,-1234HDQ?,1238H,?第一个八字节常量12345678H在内存中的分配方式如下所示,其存储原则与前面相同.其它八字节常量的存储方式与此一致.,第4章标识符和表达式,4.2简单内存变量的定义4.2.7十字节变量十字节变量的定义符为DT/TBYTE(DefineTenbytes).每个十字节变量占用十个连续的字节.例如:DT1DT12345678H,?DT2DT?,-1H第一个十字节常量12345678H在内存中的分配方式如下所示,它同样按“高高低低”的原则来存储.其它十字节常量的存储方式与此一致.,第4章标识符和表达式,4.3调整偏移量伪指令调整偏移量伪指令是在内存变量定义时用来调整内存变量起始偏移量,它们在把源程序汇编成目标文件时起作用.常用的调整偏移量伪指令有:EVEN、ALIGN和ORG4.3.1偶对齐伪指令EVEN偶对齐伪指令格式:EVEN伪指令的作用是:告诉汇编程序(Assember),本伪指令下面的内存变量从下一个偶地址单元开始分配.如果下一个偏移量是偶地址,那么,该伪指令不起作用;否则,汇编程序将空出一个字节,从下一偶地址开始为其后变量分配内存单元.,第4章标识符和表达式,4.3调整偏移量伪指令4.3.1偶对齐伪指令EVEN假设有下列变量定义,并且变量B1的偏移量是偶数.B1DB12H;为了表示方便,不妨再假设其偏移量为:xxxx0HW1DW4567H可把前面的变量定义改变成下列形式:B1DB12HEVENW1DW4567H,第4章标识符和表达式,4.3调整偏移量伪指令4.3.2对齐伪指令ALIGN对齐伪指令格式:ALIGNNum其中:Num必须是2的幂,如:2、4、8和16等.伪指令的作用是:告诉汇编程序,本伪指令下面的内存变量必须从下一个能被Num整除的地址开始分配.若下一个地址正好能被Num整除,那么,该伪指令不起作用;汇编程序将空出若干个字节,直到下一个地址能被Num整除为止.试比较下面二组变量定义,它们的对齐效果一致吗?,B1DB12HEVENW1DW4567H,B1DB12HALIGN2W1DW4567H,第4章标识符和表达式,4.3调整偏移量伪指令4.3.3调整偏移量伪指令ORG调整偏移量伪指令格式:ORG数值表达式伪指令的作用是:告诉汇编程序,本伪指令下面的内存变量从该数值表达式所指定的偏移量开始分配.假设有下列变量定义,且变量word1的偏移量为0.word1DW1234hbyte1DB56hword2DW0abcdhORG1byte2DB?word3DW?byte3DB?,第4章标识符和表达式,4.3调整偏移量伪指令4.3.4偏移量计数器的值汇编语言提供了一个特殊的符号$来引用偏移量计数器的值.例如:W1DW$,$ORG$+3;从当前地址开始空3个字节B1DB43h假设:在给变量W1分配内存单元时,当前偏移量计数器的值为2.,第4章标识符和表达式,4.4复合内存变量的定义4.4.1重复说明符DUP汇编语言提供了变量的重复说明符DUP,其说明的一般形式如下:countDUP(表达式,表达式,表达式)解释:count是重复次数,(表达式,表达式,表达式)是被重复的部分,表达式可以是存储单元的初值,也可以是含义另一个DUP的式子.如果在表达式的括号中有多个表达式,那么,它们之间要用逗号,分开.例如:BUFFERDB100DUP(?)STRINGDB120DUP(ABCDE),0DATA1DW50DUP(10H,20DUP(1,2,3),20H)POINTSDD12,30DUP(0),第4章标识符和表达式,4.4复合内存变量的定义4.4.2结构类型的定义1)、结构类型的定义用STRUC和ENDS可以把一系列数据定义语句括起来作为一种新的、用户定义的结构类型.其一般说明格式如下:结构名STRUCAlignment,NONUNIQUE数据定义语句序列结构名ENDS解释:结构名是一个合法的标识符,且具有唯一性.结构名代表整个结构类型,前后两个结构名必须一致.结构内被定义的变量为结构字段,变量名即为字段名.一个结构中允许含有任意多个字段,各字段的类型和所占字节数也都可任意.如果字段有字段名,则字段名必须唯一.每个字段可独立存取.,第4章标识符和表达式,4.4复合内存变量的定义4.4.2结构类型的定义1)、结构类型的定义对齐方式(Alignment):可用1、2或4来指定结构中字段的字节边界(Byteboundary),其缺省值为1.NONUNIQUE:要求结构中的字段必须用全名才能访问,见本小节中的“结构类型字段的引用”.例如:,NO,CNAME,SCORE,COURSESTRUCNODD?CNAMEDBAssemberSCOREDW0COURSEENDS,第4章标识符和表达式,4.4复合内存变量的定义4.4.2结构类型的定义1)、结构类型的定义结构中的字段可以有字段名,也可以没有字段名.有字段名的字段可直接用该字段名来访问它,没有字段名的字段可以用该字段在结构中的偏移量来访问.例如:PEASONSTRUCNODD?;偏移量为0NAMEDB10dup(?);偏移量为4DB1;偏移量为14PEASONENDS在结构PEASON中,有二个字段有字段名,一个字段没有字段名,但不管有无字段名,我们都可用其偏移量来访问它.,第4章标识符和表达式,4.4复合内存变量的定义4.4.2结构类型的定义2)、结构类型变量的定义在定义某个结构类型后,程序员就可以说明该结构类型的内存变量.它的说明形式与前面介绍的简单数据类型的变量说明基本上相一致.其说明格式如下:变量名结构名解释:变量名即为该结构类型的变量名,它可省缺.如果省缺,则不能用符号名来访问该内存单元;字段值表是给字段赋初值,中间用逗号,分开,其字段值的排列顺序及类型应与该结构说明时各字段相一致;若结构变量中某字段用其定义时的缺省值,则可用逗号来表示;若所有字段都如此,则可省去字段值表,但必须保留尖括号.,第4章标识符和表达式,4.4复合内存变量的定义4.4.2结构类型的定义2)、结构类型变量的定义例如:COURSE1COURSE;使用缺省的初值COURSECOURSE3COURSE;使用缺省的课程名PEASON1PEASON3)、结构类型字段的引用定义了结构类型的变量后,若要访问其结构中的某字段,则可采用如下形式:结构变量名.字段名该引用方式与高级语言的字段引用方式完全一致.还可用偏移量来访问其中的某个字段,但此方法不直观,变动性大,所以,一般情况下,不提倡使用此方法.,第4章标识符和表达式,3)、结构类型字段的引用例如:EXAM1STRUCF1DW?F2DB?EVEN;偶对齐F3DW?EXAM1ENDSE1EXAM1;定义EXAM1的一个变量E1下面二种方法都可把结构变量E1中字段F3的内容赋给寄存器AX,但如果在字段F3之前增加或减少了字段,那么,这些引用需要改变吗?(1)、用字段名直接引用MOVAX,E1.F3(2)、用字段的偏移量间接引用LEASI,E1MOVAX,SI+4;其中4是字段F3的偏移量,第4章标识符和表达式,4.4复合内存变量的定义4.4.3联合类型的定义联合数据类型是一种特殊的数据类型.它可以实现:以一种数据类型存储数据,以另一种数据类型来读取数据.程序员可以根据不同的需要,以不同的数据类型来读取联合类型中的数据.1)、联合类型的说明联合数据类型其说明格式如下:联合类型名UNIONAlignment,NONUNIQUE数据定义语句序列联合类型名ENDS联合类型中的各字段相互覆盖,即同样的存储单元被多个不同的字段所对应,并且其每个字段的偏移量都为0.联合类型所占的字节数是其所有字段所占字节数的最大值.,第4章标识符和表达式,1)、联合类型的说明例如:DATATYPEUNIONBB1DB?;一个字节类型的字段WW1DW?;一个字类型的字段DD1DD?;一个双字类型的字段DATATYPEENDS在联合类型的最外层定义中,在伪指令UNION和ENDS的前面一定要书写该联合类型名,而在其嵌套定义的内层,伪指令UNION和ENDS之前一定不能写联合类型名.UNION1UNIONBBDB?WWDW?UNION;联合类型的嵌套定义形式W1DW?B1DB?ENDSUNION1ENDS,ww1,dd1,BB1,第4章标识符和表达式,2)、联合类型变量的定义联合数据类型的变量只能用第一个字段的数据类型来进行初始化.例如:U1DATATYPE;定义一个联合变量,并初始化其值U2DATATYPE;初始化错误,只能用字节数据来初始化U3UNION13)、联合类型字段的引用定义了联合类型的变量后,就可根据需要,以不同的数据类型或字段名来存取该联合类型中的数据.引用其字段的具体形式如下:联合类型变量名.字段名例如:MOVU3.WW,1234H;给联合类型变量赋字数据MOVAL,U3.BB;AL=34HMOVBX,U3.WW;BX=1234HMOVU3.BB,A;U1的值1241H,41H是A的ASCII码,DATATYPEUNIONBB1DB?WW1DW?DD1DD?DATATYPEENDSUNION1UNIONBBDB?WWDW?UNIONW1DW?B1DB?ENDSUNION1ENDS,第4章标识符和表达式,4.4复合内存变量的定义4.4.4记录类型的定义1)、记录类型的说明汇编语言的记录类型与高级语言的记录类型不同,它是为按二进制位存取数据提供方便的.记录类型的说明要用到另一个保留字RECORD,其说明格式如下:记录名RECORD字段,字段,其中字段代表:字段名:宽度=初值表达式,第4章标识符和表达式,4.4复合内存变量的定义4.4.4记录类型的定义1)、记录类型的说明记录名RECORD字段,字段,记录名代表该记录类型;记录类型可以由多个字段组成,每个字段之间要用逗号,分开;字段的属性包括字段名、宽度和初值;字段的宽度表示该字段所占的二进制位数,它必须是一个常数,并且所有字段的宽度之和不能大于16;如果记录的总宽度大于8,则系统为该记录类型分配二个字节,否则,只分配一个字节;记录的最后一个字段排在所分配空间的最低位,然后对记录中的字段依次从右向左分配二进制位,左边没有分完的二进制位补0;初值表达式给出的是该字段的缺省值.如果初值超过了该字段的表示范围,那么,在汇编时将产生错误提示信息;如果某字段没有初值表达式,则其初值为0.,第4章标识符和表达式,4.4复合内存变量的定义4.4.4记录类型的定义1)、记录类型的说明例如:COLORRECORDBLINK:1,BACK:3=0,INTENSE:1=1,FORE:3FLOATRECORDDSIGN:1,DATA:8,ESIGN:1,EXP:4,第4章标识符和表达式,4.4复合内存变量的定义4.4.4记录类型的定义2)、记录变量的定义在程序中,必须先说明记录类型,然后才能定义该记录类型的变量.记录变量是把其二进制位分成一个或多个字段的字节或字变量.其定义格式与其它类型变量的定义方式类似,具体如下:变量名记录名.,第4章标识符和表达式,4.4复合内存变量的定义4.4.4记录类型的定义2)、记录变量的定义例如:COLOR1COLOR,FLOATFLOAT,3)、记录的专用操作符操作符WIDTH操作符WIDTH返回记录或其字段的二进制位数,即其宽度.其一般书写格式如下:WIDTH记录名或WIDTH记录字段名假设有前面定义的记录类型COLOR,那么,WIDTHCOLOR、WIDTHBACK和WIDTHBLINK的值分别为8、3和1.,第4章标识符和表达式,4.4复合内存变量的定义4.4.4记录类型的定义3)、记录的专用操作符操作符MASK操作符MASK返回一个8位或16位二进制数.在该二进制数中,被指定记录或字段使用的对应位的值为1,否则,其值为0.其一般书写格式如下:MASK记录名或MASK记录字段名假设有前面定义的记录类型FLOAT,那么,MASKEXP、MASKDATA和MASKDSIGN的值就分别为000FH、1FE0H和2000H.,第4章标识符和表达式,4.4复合内存变量的定义4.4.4记录类型的定义3)、记录的专用操作符记录字段记录字段名是一个特殊的操作符,它也是操作数,其返回值是该字段移到所在记录的最低位所需要的位数,即该字段最低位在记录中的位置.假设有前面定义的记录类型FLOAT,那么,有:MOVCL,EXP相当于MOVCL,0MOVCL,DATA相当于MOVCL,5,第4章标识符和表达式,4.4复合内存变量的定义4.4.5数据类型的自定义在有了一些数据类型后,程序员还可定义这些数据类型的别名或指针类型.表达这种定义的伪指令是TYPEDEF,其定义形式如下:新数据类型名TYPEDEF位距PTR数据类型其中:位距是NEAR、FAR或PROC等.例如:CHARTYPEDEFBYTE;给BYTE定义一个别名CHARPCHARTYPEDEFPTRCHAR;定义一个字符指针数据类型PCHAR有了上述定义之后,下面的变量说明就是合法的.CH1CHARABCDEF;定义一个字符串常量PCH1PCHARCH1;定义一个指向字符串CH1的变量,第4章标识符和表达式,4.5标号标号是一种特殊的标识符,它代表代码段中的某个具体位置,它主要用于表明转移的目标位置.其说明形式如下:标号:汇编语言指令;注释解释:标号必须是合法标识符,其后面紧跟一个冒号:,冒号与汇编语言指令之间要有分隔符.分隔符是指空格和TAB字符.一般用分隔符使有关内容对齐为宜.,第4章标识符和表达式,4.6内存变量和标号的属性变量是一个符号地址,其值会根据其数据类型来对应从该地址以后的若干个存储单元中所存的数值.标号也是一个符号地址,它所对应的存储单元中存放的是指令代码.它们都是一个符号地址,代表一个存储单元的地址,所以,它们都具有存储单元的属性.除此之外,它们还有各自特殊的属性.,第4章标识符和表达式,4.6内存变量和标号的属性4.6.1段属性操作符段属性操作符(SEG)返回该标识符所在段的段地址.我们一般只会取内存变量所在段的段地址,而很少取标号所在段的段地址.假设有下面变量定义:SCOREDW?NAMEDB10DUP(10);数据段的变量定义MOVAX,SEGSCORE;代码段的指令MOVBX,SEGNAME由于SCORE和NAME在同一段中定义,所以,寄存器AX和BX的值是相等的.,第4章标识符和表达式,4.6内存变量和标号的属性4.6.2偏移量属性操作符偏移量属性操作符(OFFSET)返回该标识符离它所在段的段地址有多少字节.假设有下面变量定义:FIRSTDD12345678H,0;数据段的变量定义SCOREDW?,12HNAMEDB10DUP(10)MOVAX,OFFSETSCOREMOVBX,OFFSETNAMEFIRST的偏移量为0,SCORE的偏移量为8,因为它要跳过二个双字,其它如此类推.由于NAME在SCORE之后,且SCORE之后有二个字,占四个字节,所以,BX的值要比AX的值大4.,假设:FIRST是数据段的第一个被定义的变量名,第4章标识符和表达式,4.6内存变量和标号的属性4.6.3类型属性操作符类型属性操作符(TYPE)是返回该变量所占字节数,或标号的远(FAR)、近(NEAR)类型.PEASONSTRUCNODD?NAMEDB10dup(?)DW1PEASONENDSB1DB1,2,3W1DW200DUP(1,2,30DUP(10,20),101H,-1PEOPLEPEASON,按属性TYPE的含义:TYPEB1为1TYPEW1为2TYPEPEOPLE为16,第4章标识符和表达式,4.6内存变量和标号的属性4.6.4长度属性操作符长度属性操作符(LENGTH)是针对内存变量的操作符,它返回重复操作符DUP中的重复数.如果有嵌套的DUP,则只返回最外层的重复数;如果没有操作符DUP,则返回1.根据属性LENGTH的含义,LENGTHB1、W1和PEOPLE的值分别为:1,200和1.4.6.5容量属性操作符容量属性操作符(SIZE)也是针对内存变量的操作符.它的返回值按下列公式计算:SIZE变量=(LENGTH变量)(TYPE变量)如上例所示,SIZEB1、W1和PEOPLE的值分别为:1,400和16.,PEASONSTRUCNODD?NAMEDB10dup(?)DW1PEASONENDSB1DB1,2,3W1DW200DUP(1,2,30DUP(10,20),101H,-1PEOPLEPEASON,第4章标识符和表达式,4.6内存变量和标号的属性4.6.6强制属性操作符在程序中,我们有时需要对同一个存储单元以不同的属性来访问,这时,就要强制属性操作符PTR.该操作符的作用有点象C语言中的类型强制方法.对于指令:MOVBX,1H,其目标操作数BX是寄存器间接寻址方式,它指向一个存储单元.在作传送操作时,是把1H扩展成8位作字节传送,还是扩展成16位作字传送呢?这就使该指令具有二义性,因为BX指向的存储单元可以字节或字的首地址.含有该指令的程序在汇编时,可能会产生警告或出错信息.,第4章标识符和表达式,4.6内存变量和标号的属性4.6.6强制属性操作符为了使指令中存储单元操作数具有明确的属性,我们可以使用强制属性操作符PTR.其一般格式为:数据类型PTR地址表达式其中:数据类型是所学的各种数据类型,常用的数据类型有:BYTE、WORD、DWORD、NEAR和FAR等.为明确指令中存储单元的属性,可把指令MOVBX,1H可改写成:MOVbyteptrBX,1H或MOVwordptrBX,1H在指令中用操作符PTR强制后,不管其后的地址表达式原数据类型是什么,在本指令中就以PTR前面的类型为准.该强制属性只在本指令有效,是一种临时性的属性,它不会改变原内存单元的定义属性.,第4章标识符和表达式,4.6内存变量和标号的属性4.6.6强制属性操作符例如:W1DW1234H,5678HB1DB2DB5D1DD23456789HMOVAX,wordptrb1;B1开始的二个字节拼成一个字,(AX)=0502HMOVBH,byteptrw1;把字W1的低字节传送给BH,(BH)=34HMOVCH,byteptrw1+1;把字W1的高字节传送给CH,(CH)=12HMOVwordptrd1,12H;把双字D1的低字修改成0012H,(D1)=23450012H上面指令中的强制属性是临时属性,它不能改变这些变量在定义时的永久属性.,W1,B1,D1,第4章标识符和表达式,4.6内存变量和标号的属性4.6.7存储单元别名操作符我们知道:在程序中,可用强制属性操作符PTR来实现以不同的数据类型来访问某一存储单元时.如果要经常以某种其它的数据类型来访问该存储单元的话,那么,就必须在每次访问时都要加上强制属性操作符PTR.在编写程序时就显得比较麻烦.为了克服上述不便,汇编语言提供了另一种操作符THIS,它为同一存储单元取另一别名,该别名可具有其自身的数据属性,但其段地址和偏移量是不变的.操作符THIS的一般格式为:THIS数据类型其中:常用的数据类型有:BYTE、WORD、DWORD、NEAR和FAR等.,第4章标识符和表达式,4.6内存变量和标号的属性4.6.8存储单元别名操作符例如:WBUFFEREQUTHISWORDBUFFERDB20DUP(?),WBUFFER:字属性,BUFFER:字节属性,第4章标识符和表达式,4.7表达式表达式是程序设计中的一个重要的基本概念,它一般由运算符、操作符、括号、常量和一些符号连在一起的式子.在汇编语言中,表达式分为:数值表达式和地址表达式.4.7.1进制伪指令RADIX伪指令RADIX用来设置整数的缺省进制,宏汇编开始时所默认的整数进制为十进制.该伪指令的使用格式如下:.RADIXexp其中:伪指令前面要用点.开始,exp的值必须是区间2,16内的一个整数.该伪指令说明下面整数的默认进制为exp.如果某整数已显式地表明了其进制,则该默认进制对其不起作用.在源文件中,可以使用多个RADIX伪指令来分别说明其后整数的默认进制.,第4章标识符和表达式,4.7表达式4.7.1进制伪指令RADIX例如:.radix8B1DB10,11,12;这三个数是八进制数DB10D;这数是十进制数.radix10MOVAX,1234;1234是十进制数MOVAX,1234H;1234H是十六进制数思考题:.radix16DW90D,101B;前者是十进制数,后者是二进制数吗?,第4章标识符和表达式,4.7表达式4.7.2数值表达式数值表达式是在汇编过程中能由汇编程序计算出来的数值型表达式,它的各组成部分在汇编时就能完全确定.它通常是一些常量的运算组合.1)、常量常量是一个立即数,直接写在汇编语言语句中,在程序的执行过程中,它不可能发生变化.如:10101011B、324Q、1234D、1234H、0abcdH、AB等.在前面的内容里,叙述了用伪指令.RADIX来改变数据基数的方法.2)、算术运算符算术运算符包括符号:+(正)、-(负),运算符:+(加)、-(减)、*(乘)、/(除)和MOD(取模).这些运算符和常量、括号可组成数值表达式.如:120+(321-90)mod3,322*5/32,0abcdH+5,-590等.,第4章标识符和表达式,4.7表达式4.7.2数值表达式3)、关系运算符关系运算符包括符号:EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于等于)和GE(大于等于).该表达式的计算结果规定如下:若关系不成立,则该数值表达式的计算结果为0;否则,其结果为0FFFFH.如:120HLT100H+3,21HLE21H等,计算结果分别为:0和0FFFFH.4)、逻辑运算符逻辑运算符包括按位操作符和移位操作符.具体是:AND、OR、NOT、XOR、SHL(左移位)和SHR(右移位).如:1SHL3,47HAND0FH,NOT56H等,计算结果分别为:8,7和0A9H.,第4章标识符和表达式,4.7表达式4.7.2数值表达式5)、表达式中的其它操作符汇编语言中,还有其它可在数值表达式中使用的操作符.它们是:HIGH(高8位)、LOW(低8位)SEG(段地址)、OFFSET(偏移量)TYPE(标识符类型)、LENGTH(变量长度)、SIZE(变量容量)WIDTH(记录/记录字段宽度)、MASK(记录/记录字段的屏蔽位)在以上操作符中,HIGH和LOW还没有介绍过.它们的使用格式如下:HIGH表达式LOW表达式它们的作用是分别选取表达式计算结果的高8位和低8位.如:HIGH(1234H+100H),LOW1234H等,选取结果分别为:13H和34H.,第4章标识符和表达式,4.7表达式4.7.2数值表达式6)、运算符和操作符的优先级汇编语言有各种运算符和操作符,它们优先级按从高到低的排列:LENGTH、SIZE、WIDTH、MASK、()、.(结构字段)、(记录类型)PTR、SEG、OFFSET、TYPE、THIS、:(段超越前缀)*、/、MOD、SHL、SHRHIGH、LOW+、-EQ、NE、LT、LE、GT、GENOTANDOR、XORSHORT这些符号及其优先级并不要强记,有些符号同时出现的可能性非常小.,第4章标识符和表达式,4.7表达式4.7.3地址表达式地址表达式是计算存储单元地址的表达式,它可由标号、变量名和由括号括起来的基址或变址寄存器组成.其计算结果表示一个存储单元的地址,而不是该存储单元的值.例如:B1DB10H,11H,12HDBABCDW1DW1234H,5678H注意:地址表达式W1+1并不表示字变量W1之后一个字的存储单元,而是字变量W1之后一个字节的存储单元,它的存储单元值是:7812H.,B1,B1+3,W1+2,B1+1,第4章标识符和表达式,4.8符号定义语句4.8.1等价语句1)、一般格式等价语句的一般使用格式如下:符号名EQU表达式其作用是用左边的符号名来代表右边的表达式.注意:等价语句不会给符号名分配存储空间,符号名不能与其它符号同名,也不能被重新定义.,第4章标识符和表达式,4.8符号定义语句4.8.1等价语句2)、用符号名代表常量或表达式当把一个常量或表达式定义成一个具有一定含义的符号名后,在程序中就可以用该符号名来代表该常量或表达式.例如:NUMBEREQU100;给缓冲区的长度取一个符号名BUFF

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论