资源描述
4.1汇编语句表达式4.2汇编伪指令语句,第四章高级汇编语言的语法,4.1汇编语句的表达式,4.1.1汇编语言语句格式4.1.2数值表达式4.1.3标号变量与地址表达式4.1.4特殊运算符,4.1.1汇编语言语句格式,1.指令语句的一般格式如下:标号:指令前缀助记符操作数;注释标号:标号是机器指令语句存放地址的符号表示,代表该指令目标代码的第一个字节地址,后面必须紧跟冒号“:”。指令助记符:指令助记符为语句的核心成分,表示了该语句的操作类型。操作数:操作数表示指令助记符的操作对象。注释:注释均以分号开始,它可占一行或多行,一般放在一条语句的后面。,4.1.2数值表达式,1常量2算术运算符3逻辑运算符4关系运算符,各种形式数字常量格式对照表,4.1.2数值表达式,1.常量,(1)整常量,(2)字符串常量字符串常量是用单引号或双引号引起来的一个或多个字符。字符串常量是以各字符的ASC码表示的。如A用41H表示,字符串A1B2用41H,31H,42H,32H表示。,1.常量,4.1.2数值表达式,(3)符号常量用等价语句EQU或者“=”语句定义的名字来表示常量,可以直接写在汇编与句中能提高程序的可读性,使用修改也很方便。COUNT=60*60;COUNT=3600MOVECX,COUNT,1.常量,4.1.2数值表达式,算术运算符包括:(加)、(减)、*(乘)、(除)、MOD(求模)、SHL(左移)、SHR(右移)几种,它既可以用于数值表达式又可用于地址表达式。,2算术运算符,4.1.2数值表达式,【例】用算术运算符进行数值表达式运算。NUM1EQU25*450;NUM1=50NUM2EQUNUM1/7;NUM2=7NUM4DBNUM1MOD7;NUM4=1VAR1DB1,2,4,4,5VAR2DB12445NUM4EQUVAR2-VAR1;NUM4=5NUM5EQU0FHMOVAL,NUM5SHL4;(AL)=11110000BMOVBL,NUM5SHR4;(BL)=00000000B,4.1.2数值表达式,2算术运算符,逻辑运算符包括:逻辑乘(AND)、逻辑加(OR)、按位加(XOR)、逻辑非(NOT)四种运算。由于逻辑运算是按位操作,且在汇编过程中完成,因而运算的结果仍为整数常量。【例】用逻辑运算符进行运算。MOVAL,44HAND0FH;04HALMOVBL,05HOR40H;45HBLMOVCX,NOT00FFH;0FF00HCXMOVDX,789AHXOR000FH;7895HDX,3逻辑运算符,4.1.2数值表达式,关系运算符包括:相等(EQ),不等(NE),小于(LT),大于(GT),小于等于(LE)及大于等于(GE)。【例】用关系运算符进行数值表达式运算。NUM1DB10LT5;NUM1=0NUM2DB0AAAAHGT7FFFH;NUM2=0FFFFHMOVAX,AEQ41H;0FFFFHAXMOVBX,NUM2LTNUM1;0BX,4关系运算符,4.1.2数值表达式,4.1.3标号与地址表达式,标号是一条指令语句的符号地址。在汇编源程序中,只有在需要转向一条指令语句时,才为该指令语句设置标号,以便在转移类指令(含子程序调用指令)中直接引用这个标号。因此,标号可作为转移类指令的操作数,即转移地址。NEAR(近程)类型标号表示段内标号。需要用2字节(16位方式)或者4字节(32位方式)给出标号所在的段内EA。FAR(远程)类型标号表示段间标号。需要用2字节(16位方式)或者4字节(32位方式)给出标号所在的段地址以及EA,1.标号,4.1.3标号与地址表达式,2.变量,变量是内存中一个数据区的的名字,作为指令的存储器操作数来使用。具有三种属性:段地址,EA和类型。EA是汇编时汇编地址计数器LC的值。变量的类型有:DB,DW,DD,DQ和DT来定义。例如:COUNTDB5;定义变量COUNT类型是字。VARDBA,B;定义字符AB的ASCII码MOVAL,VAR;语句正确,AL和VAR类型相符MOVEAX,VAR;VAR和EAX类型不符,汇编语句的地址表达式形成的结果是存储器的地址,用来表示指令中的标号或者变量操作数,有三个属性:段地址,EA和类型。变量仅对应于数据区的第一个数据项,如果对其他数据项操作,必须要用地址表达式指出那一个数据项是指令的操作数。例如:ARRAYDD2,0,0,2,6,1,8,9,40,4;定义10个双字类型的数据MOVEAX,ARRAY+36;取第10个元素MOVESI,36;第10个元素的地址偏移量送;ESISUBESI,4;ESI4-ESIADDEAX,ARRAYESI;EA=ARRAY+ESI,EAX与;第9个元素相加,3.地址表达式,4.1.3标号与地址表达式,(1)强制类型转换PTR运算符格式:类型PTR地址表达式PTR与EQU连用,可定义与PTR右边地址表达式类型不同的新变量名或新标号,但不另分配存储单元。例如:NBYTEDB0,2,4,6,8;定义NBYTE为字节型变量MOVAX,WORDPTRNBYTE;字节变量临时作字使用MOVAL,NBYTE;显式类型为字节由DB定义MOVCH,NBYTE+4;隐式类型,NBYTE+4伪字节MOVWORDPTRBX,5;PTR强制说明模糊型为字类型MOVAX,SI+8;两个操作数中以确定的类型为准,4.1.4特殊运算符,1.属性替换运算符,(2)段地址取代运算符“:”又称为段地址运算或者跨段前缀。用于临时给定变量,标号或者地址表达式指定一个段属性,地址表达式EA和类型保持不变。在指令中替代默认的段以形成物理地址。例如:MOVDX,ES:BX+DI;EA=BX+DI,PA=ES;*16+EA,临时替换默认的DS,4.1.4特殊运算符,1.属性替换运算符,(3)短取代运算符SHORT告诉汇编程序,目标标号在本条指令的-128+127个字节的范围内,生成节省一个字节的机器指令。一般情况下可以不用。例如:JMPSHORTNEXTBRACHNEXTBRACH:MOVEAX,ECX,4.1.4特殊运算符,1.属性替换运算符,(4)定义类型运算符THIS与PTR类似,他用于建立同一地址而类型不同的变量或者标号,方便按照不同类型存取变量或程序发生转移。他不分配存储单元,标号或变量的段属性为语句所在段的段地址,EA是该语句所在的下一个可用的存储单元地址。例如:BYTE_VAREQUTHISBYTE;定义BYTE_VAR为字节WORD_VARDW8800HMOVAL,BYTE_VAR;BYTE_VAR地址同;WORD_VAR,AL=00HMOVAX,WORD_VAR;AX=8800H,4.1.4特殊运算符,1.属性替换运算符,SEG分离出其后变量或标号所在段的段首址;OFFSET分离出其后变量或标号的偏移地址。例如:ARRAYWDW20DUP(0).START:MOVAX,SEGARRRYW;ARRAYW段址-AXMOVDS,AXMOVBX,OFFSETARRAYW;ARRAYW的EA-BX,4.1.4特殊运算符,2.属性分离运算符,TYPE运算符格式:TYPE变量或标号功能:分离出其后变量或标号的类型。如果是变量,将返回该变量的类型对应字节数;如果是标号,则返回代表标号类型的数值。,4.1.4特殊运算符,2.属性分离运算符,(1)LENGTH运算符格式:LENGTH变量功能:取出变量所含的数据存储单元个数。【例】取出变量占存储单元个数。DATASEGMENTADBABCDEFBDW10DUP(1,2DUP(2)CDB4,20DUP(0)DATAENDSMOVAX,LENGTHA;1AXMOVBX,LENGTHB;10BXMOVCX,LENGTHC;1CX,4.1.4特殊运算符,3.返回值运算符,(2)SIZE运算符格式:SIZE变量功能:取出变量所含的数据存储区大小。其返回值为:LENGTH变量*TYPE变量例如:上例中A、B、C三变量:SIZEA=LENGTHA*TYPEA=1SIZEB=LENGTHB*TYPEB=20SIZEC=LENGTHC*TYPEC=1,3.返回值运算符,4.1.4特殊运算符,(3)动态求数据项的个数对字符串变量求数据项的个数,或者表达式有多个DUP项嵌套,或者表达式没有DUP项时,使用SIZE达不到取数据项的个数的目的。在程序中使用“$”符号来代表汇编程序下一个可用偏移值,来达到动态求数据项的个数的目的。例如:STRINGDBAdvancedassemblyCOUNTEQU$-STRING;COUNT=16,3.返回值运算符,4.1.4特殊运算符,(4)字节分离运算符字节分离运算符包括:HIGH和LOW。格式:HIGH常量或地址表达式LOW常量或地址表达式功能:HIGH用来分离出其后16位常量或地址表达式的偏移量的高字节;LOW用来分离出其后16位常量或地址表达式偏移量的低字节。,3.返回值运算符,4.1.4特殊运算符,(4)字节分离运算符例如:WVALEQU0CA19HMOVAH,HIGH8162H;取高位字节81H-AHMOVAL,LOWWVAL;取低位字节19H-AL,3.返回值运算符,4.1.4特殊运算符,4运算符的优先级,4.1.4特殊运算符,4.2汇编伪指令语句,4.2.1方式伪指令4.2.2数据与符号定义伪指令4.2.3段定义与段管理伪指令SEGMENT/ENDS4.4.4假定伪指令ASSUME4.4.5置汇编地址计数器伪指令ORG4.4.6源程序结束伪指令,伪指令语句格式如下:名字伪指令符参数,参数;注释名字:符号名是伪指令语句的一个可选项。伪指令符:伪指令符指定汇编程序要完成的具体操作,如数据定义伪指令DB、DW、DD,段定义伪指令SEGMENT,假定伪指令ASSUME等。参数表:伪指令后面的操作数可以是常数、字符串、变量、表达式等,其个数由具体的伪指令决定,各个操作数之间必须以“逗号”分隔。注释:伪指令的注释必须以“;”开始,其作用同指令语句中的注释部分。,4.2汇编伪指令语句,32位pc系列微机有386、486、Pentium等多种CPU也就有多种指令系统。这些指令虽然向上兼容,却是不断进行扩充的,增加了许多功能丰富的新指令。为了告诉汇编程序怎样进行汇编,识别哪种类型的CPU指令系统,以保证扩充功能的指令能够正确汇编,于是采用方式伪指令来制定具体的指令系统。如果没有指定,则masm默认的是:8086/8088cpu和8087协处理器的指令系统以及浮点变量的IEEE格式。方式伪指令主要有:.8086.386.386P.486.486P.586.686.MMX等。,4.2.1方式伪指令,如果没有指定,则masm默认的是:8086/8088cpu和8087协处理器的指令系统以及浮点变量的IEEE格式。方式伪指令主要有:.8086.386.386P.486.486P.586.686.MMX等。例如:.386CODESSEGMENTCODE;设置Pentium兼容的32位386方式CODESENDS,4.2.1方式伪指令,(1)格式:符号名EQ表达式功能:为常量、表达式及其他各种符号定义一个等价的符号名,但它不申请存储单元。用符号表示常量、数值表达式,即定义符号常量。使用符号常量可使程序简单明了,增强程序的可读性和通用性。EQU与属性运算符TR或THIS联合使用,可以给变量或标号定义新的类型属性并重新命名,但保持其段偏移地址属性不变。利用EQU可以用一个符号名替代一个复杂的地址表达式和其他一些符号,如指令助记符、变量名、标号、段名、寄存器名、宏定义名等。,4.2.2数据与符号定义伪指令,1.定义符号伪指令,(2)格式:符号名=表达式功能:为常量、表达式及其他各种符号定义一个等价的符号名,并能对所定义的符号多次重复定义,且以最后一次定义的值为准。【例】定义等价符号名。COST=20M=MOVCOST=COST+10;30LOSTM=ADD;M=ADD,4.2.2数据与符号定义伪指令,1.定义符号伪指令,(3)格式:变量名或标号LABEL类型功能:定义与原有变量类型不同的新变量或为指令语句定义有指定类型的标号。通常与数据定义伪指令连用,其功能类似语句“变量名或标号EQUTHIS类型”。【例】定义新类型的变量。DDBUFLABELDWORDBUFDB200DUP(0)ALABELFARB:LEADX,BUF,4.2.2数据与符号定义伪指令,1.定义符号伪指令,为了提供模块程序的设计功能,汇编语言提供了划分模块并命名的能力。(1)模块命名语句NAME格式:NAME模块名源程序模块开始的一个语句,有模块名则为模块的名字,名字不要使用程序的变量、标号和保留字。NAME语句在原程序中也可以不必写出(2)源程序模块结束语句END格式:END表达式源程序模块的最后一个语句。如果有表达式的值,则为程序开始执行目标代码的地址。汇编结束后,指令指针IP或EIP指向这个入口地址。,4.2.2数据与符号定义伪指令,2.程序模块名与结束语句,例如:NAMEPentium_MASM61XCODESSEGMENTSTART:CODEENDSENDSTART,4.2.2数据与符号定义伪指令,2.程序模块名与结束语句,常用的数据定义伪指令有DB(8位),DW(16位),DD(32位),DQ(64位),DT(80位)。格式:变量名数据定义伪指令表达式,表达式功能:定义数据存储区,类型由数据定义伪指令确定,初值由表达式给定表达式可以有以下几种类型:,4.2.2数据与符号定义伪指令,3.数据定义以及存储分配伪指令,(1)数值表达式;(2)?定义的数据项没有确定的初值,只分配存储单元;(3)ASCII字符串多于2个以上字符的字符串可以用DB来定义;(4)nDUP(?)重复定义n个数据项,内容不确定;nDUP(表达式,表达式,);定义n个数据项nDUP(mDUP(表达式1)多层嵌套DUP项(5)表示名字(6)汇编指针$,4.2.2数据与符号定义伪指令,3.数据定义以及存储分配伪指令,例如:VARNDB88;定义一个字节88HVARMDW60*60;定义一个双字3600STRDWAB;定义一个双字ABERRORDBsyntaxerror!,13,10;定义一个字符串和数字TABBDB2DUP(3DUP(8),A);定义2个字符串,;每个字符串3个8和一个A,4.2.2数据与符号定义伪指令,3.数据定义以及存储分配伪指令,1.定义段语句SEGMENT和ENDS,4.2.3段定义与段管理伪指令,格式:段名SEGMENT使用类型边界类型连接类型类别段名是为该段起的名字,用来指出汇编程序为该段分配的存储区起始位置。(1)使用类型只有使用了.386等方式伪指令,使用类型才有用。有两种类型:USE16-该段按照16位寻址,与8088寻址方式相同;USE32-该段按照32位寻址,地址指针48位:段地址16位,EA32位若在段定义是没有给出使用类型,使用了.386后默认的是USE32.,4.2.3段定义与段管理伪指令,(2)边界类型PARA:表示本段必须从能被16整除的地址处开始存放,即段起始地址最低四位必须是0,称为节地址。BYTE:表示本段起始地址可以从任一地址处开始存放。WORD:表示本段要从一个偶数地址处开始存放,即段起始地址的最低一位必须是0,称为字地址。DWORD:表示本段要从一个4的倍数地址处开始存放,即段起始地址的最低两位必须是0,双字地址,常用于32位寻址。PAGE:表示本段要从能被256整除的地址处开始存放,即起始地址的最低八位必须是0,称为页地址。,1.定义段语句SEGMENT和ENDS,4.2.3段定义与段管理伪指令,(3)连接类型组合方式有六种类型可供选择。无省略连接类型。本段有自己的段地址,与其他同名段独立。PUBLIC同名同类段连接。程序连接时将本段与其他同名同类型(可以包括不同的模块)的段连接在一起,组成同一个物理段,具有同一个段地址。STACK指定堆栈段。Link程序连接后的段为堆栈段,与PUBLIC处理相同。COMMON指明覆盖段。连接时产生一个覆盖段,类别相同的同名段有相同的起始段地址,段的长度选取含COMMON段的最大长度。MEMORY指定存储方式段。AT表达式指定段地址值表达式。将给定表达式的值作为16位寻址的非代码段的段地址值,可作为变量赋予绝对地址。,1.定义段语句SEGMENT和ENDS,4.2.3段定义与段管理伪指令,(4)类别说明:定义逻辑段时若类别选择项缺省,则表明该类别为空。如果有类别说明,则必须用单引号将类别括起来,类别是任何合法的名字。连接时,LINK程序将类别名相同的段依次连续存放在内存中。,1.定义段语句SEGMENT和ENDS,4.2.3段定义与段管理伪指令,格式:ORG数值表达式功能:将数值表达式的值赋给汇编地址计数器。数值表达式的值须为065545之间的非负整数。例:给汇编地址计数器赋值。DATASEGMENTORG10;置值为10VAR1DW100H,200HORG+5;置的值为14+5,即为19VAR2DB1,2,+1,+2NEQU-VAR2;()=24DATAENDS,2.置汇编计数器语句ORG,4.2.3段定义与段管理伪指令,格式:ASSUME段寄存器:段名,段寄存器:段名功能:建立段寄存器与段之间的对应关系。该伪指令一般出现在代码段中。例:用ASSUME伪指令建立代码段、堆栈段与CS和SS的对应关系。DATA1SEGMENTADB1,2,4DATA1ENDSSTACKSEGMENTSTACKDB200DUP(0)STACKENDSDATA2SGEMENTBDB124ABC,3.指示段寄存器语句(假定语句)ASSUME,4.2.3段定义与段管理伪指令,格式:GROUP段名,功能:GROUP伪指令可以把模块中若干不同的段集合成一个组,并赋予一个组名,使他们都装在同一个物理段(64KB)中。CGROUPGROUPDATA1,DATA2ASSUMEDS:CGROUP,CS:CODESDATA1SEGMENTWORDPUBLICDATAVAR1DW10DUP(?)START:MOVAX,CGROUPMOVDS,AXMOV,OFFSETCGROUP:VAR1,4.段组语句GROUP,
展开阅读全文