单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第四章 高级汇编语言的语法,4.1.1 汇编语言语句格式,1、机器指令的形式,标号 指令前缀 助记符 操作数;注释,例如:,EXEC:REP MOVS DEST,SOURCE;(OPS),OPD,构成汇编语言程序的语句主要包括两类:指令与伪指令。它们之间的区别:,指令,是程序运行期间由CPU执行的,汇编后由对应的机器代码所取代。,伪指令,是不可执行的。它只是源程序汇编期间由汇编器处理的命令,用来指示汇编器为数据分配内存空间,或者为汇编器提供源程序结束或段定义等。,2、伪指令语句的形式,名字 伪操作命令 参数,参数 ;注释,伪操作命令包括:,符号定义:EQU,=,LABEL;,数据定义:DB,DW,DQ,DT,RECORD,ORG,SEGMENT,ASSUME,ORG,模块定义:EXTERN,PUBLIC,NAME,END,过程定义:PROC,ENDP,4.1.2 数值表达式,数值表达式是常量或运算符与常量的组合。表达式的值是在,汇编阶段,已经确定或得到的值。,(1)整常量 MOV EAX,0FA5CH,(2)字符串常量 MOV AX,Aa;AX=4161H,(3)符号常量,COUNT=60*60,MOV ECX,COUNT ;COUNT=3600,ECX,算法运算符共7种:+,-,*,/,MOD,SHR,SHL,对于语句:MOV AL,2,可用下列语句替换:,VAL EQU 5,MOV AL,VAL SHL 1 ;VAL=5=00000101B 逻辑右移位为:00000010B=2,注意:移位运算符只对常量移位。而移位指令SHR,SHL只出现在指令码中,对寄存器或内存操作数进行移位操作。,实例:,VAL=5,SHR AL,VAL SHL 1 ;若VAL=5,等价于语句SHR AL,10,逻辑运算符4种:AND,OR,XOR,NOT,分别对常量按位进行逻辑与,或,异或和非的运算。运算的结果也是一个已知的常量。,注意与指令AND,OR,XOR,NOT的区别。,上述指令放在操作码中,而操作符放在操作数中。,例:PORT EQU 29H ;,AND DX,PORT AND 0F0H ;DX表达式的值(20H)DX,关系运算符共6种:EQ(相等),NE(不等),LT(小于),GT(大于),LE(小于等于),GE(大于等于),对两个常量进行运算,结果是两特殊的常量值。如果关系成立(为真),结果为-1,即0FFFFH,如果关系不成立(为假),结果为0。,例:PORT EQU 3,MOV BX,(PORT LT 5)AND 18)OR(PORT GE 5)AND 69),语句被汇编成:MOV BX,18,4.1.3 标号变量与地址表达式,标号:在代码段定义的指令的地址。三个属性值:段地址,EA,类型(FAR,NEAR)。,变量:是内存中一个数据区的名字,作为指令的存储器操作数引用。三个属性值:段地址,EA,类型。,类型由:DB,DW,DD,DQ,DT定义。,如:count dw 5,地址表达式,地址表达式形成的结果是存储器的地址,用来表标指令中的标号或变量操作数,有个属性:段地址,和类型。,而数值表达式的结果只有大小没有属性。,地址表达式可由变量、标号、常量、寄存器及一些运算符组成。,例1:,ARRAYD DD 2,0,0,2,6,1,8,9,4,40,MOV EAX,ARRAYD+36,MOV ESI,36,SUB ESI,4,ADD EAX,ARRAYDESI,例,ARRAYW DW 1,2,3,4,DW 5,6,7,8,DW 9,10,11,12,MOV AX,ARRAYWBXSI,等价于:MOV AX,ARRAYW+BX+SI或者,MOV AX,ARRAYWBX+SI,4.1.4 特殊运算符,1、属性替换运算符,用来取代一个操作数的属性。,(1)强制类型运算符PTR,如:MOV byte ptr BX,5,JMP FAR PTR NEXTLABBX,(2)段取代运算符:,如:MOV DX,ES:BX+DI,2.属性分离运算符,功能:只是分离变量或标号的属性值,而不取代有关的属性。,SEG:取段地址。,OFFSET:取偏移地址。,如:ARRAYW DW 20 DUP(0),start:mov ax,seg ARRAYW,mov ds,ax,mov bx,offset ARRAYW,OFFSET与LEA指令的使用区别,OFFSET是伪指令,在汇编阶段进行计算。所以OFFSET后面的地址表达式不能带寄存器,因为汇编阶段还不能计算出寄存器的值。,如:,MOV DX,OFFSET ARRAYWBX+SI;错误,LEA DX,ARRAYWBX+SI,TYPE运算符,功能:取TYPE后面变量或标号的类型值。,类型是字节、字、双字,则返回:1,2,4,例如:MOV CL,TYPE ARRAYW ;ARRAYW为字类型,则返回。,3、返回数值运算符,(1)LENGTH,取变量数据项个数。,如果变量采用,DUP,定义,则,LENGTH,取,DUP,前面的重复系数。如果有多个,DUP,嵌套,仍取每一个,DUP,前面的系数否则,LENGTH,取值为,例如:,ARRAY DW 100 dup(?),MOV CX,LENGTH ARRAY ;CX=100,ARRAY DB 10 dup(1,20 dup(20H),MOV CX,LENGTH ARRAY ;CX=10,(2)SIZE,取变量数据的字节数用来取变量定义中,有dup项时的字节数,设变量Y,则SIZE Y=LENGTH Y TYPE Y,例如:DW 100 DUP(0),TYPE Y=2 ,LENGTH Y=100,则SIZE Y=2*100=200,(3)动态求数据项个数的方法,对于:STRING DB“macro assemble”,mov cx,size string ;cx=1*1=1,所以size在一些场合并不适用可以考虑动态求取,例如:,string db advanced assembly,counts equ$-string ;counts=16,varw dw 9,8,7,6,5,4,3,2,1,0,countw equ ($-varw);countw=(10*2/2)=10,buffer db 10 dup(2 dup(8),A),countL equ$-buffer ;countL=(10*(2+1)=30,$符号表示:该条包含有$语句之后下一个可用的偏移值。,(4)字节分离运算符HIGH,LOW,功能:从一个字数值或符号常量中得到高字节或低字节。,如:WVAR EQU 0CA19H,mov ah,HIGH WVAR,mov al,LOW WVAR,表达式运算符的优先级,从高到低排列:,LENGTH,SIZE,WIDTH*,MASK*,以及,(),中的项目。,.(,结构引用操作符,),;,:,(段取代运算符),PTR,OFFSET,SEG,TYPE,THIS;HIGH,LOW,*,/,MOD,SHL,SHR;+,-,EQ,NE,LT,LE,GT,GE,NOT;AND;OR,XOR;SHORT,4.2 汇编伪指令语句,方式伪指令,包括:.8086,.386,.386P等,用来指定CPU的类型,例如:.386,code segment,code ends,.8086,code segment,注意:默认是8086方式。,数据与符号定义伪指令,1.定义符号伪指令,包括EQU,=,LABEL,它们只用来定义名字,不分配存储空间,格式:名字EQU 表达式,名字 =表达式,注意,(1),EQU的表达式可以是常量,变量名,标号,指令助记符,寄存器名;而=的表达式只能是数字表达式,主要用来定义符号常量,(2)同一个源程序,EQU符号名不能重复定义,=则可以,(3)同一个源程序中同一符号名,不能同时用EQU和=语句定义,例如:,NUMBER EQU 60 ;NUMBER=60,TIMES EQU NUMBER*24 ;TIMES=60*24=1440,BYTES DB 10 dup(?),WORDF EQU WORD PTR BYTES ;定义新名字,新类型,COUNT EQU CX ;COUNT为CX寄存器的同义名字,DEC COUNT ;相当于CX=CX-1,VALUE =88,VALUE =VALUE+1 ;VALUE=89,MOV CL,VALUE ;CL=89,COUNT =VALUE+1 ;COUNT的值=90,(2)定义名字语句的LABEL格式,格式:名字 LABEL 类型,类型包括:byte,word,dword,near,far等,功能:它可以把同一数据区的内容既看作字节,也可以作为字或双字等类型参与运算,以适应按不同类型的存取操作,如:BARRAY LABEL BYTE,WARRAY DW 50 dup(0),MOV AX,WARRAY48;取数组的第25个元素到AX,MOV AL,BARRAY49;取数组的第50个字节值到AL.,最后一条语句也可以用:MOV AL,BYTE PTR WARRAY49代替,LABEL还可以定义指向同一条指令NEAR和FAR类型的标号由其它程序段来调用FAR标号,在同一段内调用NEAR标号如:,FARSUB LABEL FAR,NEARSUB:MOV EBX,ECX,JZ NEARSUB,在另一个程序段可用:JMP FARSUB 来执行,MOV EBX,ECX,2.程序模块名与结束语句,(1)模块命名语句,格式:NAME 模块名,模块语句可以在程序中不写出,(2)源程序模块结束语句 END,格式:END 表达式,源程序模块的最后一条语句.如果有表达式的值,则为程序开始执行目标代码的地址。程序汇编后,指令指针IP或EIP指向这个入口地址。如:,NAME Pentium_MASM61x,codes segment,start:,codes ends,end start,注意:模块是独立的汇编单元,汇编程序只处理到END为止。后面的语句被忽略。,3.数据定义及存储分配语句,指令:DB(字节),DW(字),DD(双字),DF(长字),DQ(4字),DT(10字),格式:变量名 DB 初值表达式1,初值表达式2,表达式可以是下列的形式:,(1)数值表达式,(2)?定义的数据项无法确定初值,即只分配存储存储单元。,(3)ASCII字符串 多于两个字符的字符串可用DB定义,(4)n,DUP(?),重复运算符,dup,用来重复定义,n,个数据项,内容是未确定的。,(5)n,DUP(,表达式,表达式,),(6)n,DUP(m,DUP(,表达式,1),表达式,2),多层嵌套,DUP,项,共有,n*(m+1),项,初值由表达式确定。,例4.1 定义单项变量,(1)定义单项变量,VARN DB 88,VARM DB 60*60,STRC DW AB,MAXN DD-2147483468,STRS DD AB ;STRS的逻辑值00004142H,物理存储为42410000H,QVAR DQ?,TVAR DT 1024D ;为变量TVAR分配10个字节,初值为整数,即:,00000000000000000400H=1024,例4.2 定义字符串变量,STR1 DB A,B,C,D,STR2 DB ABCDE,ERROR DB syndax error!,13,10,例4.4 定义数组或缓冲区变量,BUF DB 98 dup(?),TABB DB 2 DUP(3 DUP(8),A),ARRA DW 26 DUP(41H),4.2.3 段定义与段管理伪指令,指令包括:SEGMENT,ENDS,ASSUME,GROUP,ORG等。,段完整定义格式:,段名 SEGMENT 使用类型边界类型连接类型类别,段名 ENDS,其中,两处段名是相同的。SEGMENT表示段的开始,ENDS