290 likes | 443 Views
第七章 高级汇编语言技术. 宏汇编 重复汇编 条件汇编. 宏定义和宏调用. 宏 : 源程序中的一段有独立功能的程序代码。在源程序 中定义一次可以多次调用。. 宏定义. 定义格式: 宏名 MACRO [ 哑元参数列表 ] (宏定义体) ENDM MACRO 与 ENDM 是一对伪操作。 宏名的要求: 第一个符号必须是字母。 调用格式: 宏名 实参列表 定义: MULTIPLY MACRO OPR1,OPR2,RESULT PUSH DX PUSH AX
E N D
第七章 高级汇编语言技术 宏汇编 重复汇编 条件汇编
宏定义和宏调用 宏:源程序中的一段有独立功能的程序代码。在源程序 中定义一次可以多次调用。
宏定义 定义格式: 宏名 MACRO [哑元参数列表] (宏定义体) ENDM MACRO 与ENDM是一对伪操作。 宏名的要求: 第一个符号必须是字母。 调用格式: 宏名 实参列表 定义:MULTIPLY MACRO OPR1,OPR2,RESULT PUSH DX PUSH AX MOV AX,OPR1 IMUL OPR2 MOV RESULT,AX POP AX POP DX ENDM 调用:MULTIPLY CX,VAR,XXYZ[BX]
宏展开 PUSH DX PUSH AX MOV AX,CX IMUL VAR MOV XYZ[BX],AX POP AX POP DX
子程序调用工作方式 Q: ret
宏与子程序的区别 A、宏指令是为了简化源程序的书写定义的程序段, 在汇编时汇编程序处理宏指令,将其展开到宏调用处。不会简化目标代码,不节省内存空间。 B、子程序汇编后产生的目标代码少,占用的空间少, 但执行时,每调用一次都要保存断点或现场;返回时恢复现场或断点从而增加的额外的开销,执行时间长、速度慢。
宏定义中的参数 1、宏定义可以无变元 例:SAVEREG MACRO PUSH AX PUSH BX PUSH DX PUSH SI PUSH DI ENDM 宏调用:SAVEREG
宏定义中的参数 2、宏定义中变元可以是操作码 例:FOO MACRO P1,P2,P3 MOV AX,P1 P2 P3 ENDM 宏调用:FOO WORD-VAR,INC,AX
宏定义中的参数 3、宏定义中变元可以是操作码的一部分,但在宏定义体中必须用&作为分隔符 例:LEAP MACRO COND,LAB J&COND LAB ENDM 宏调用:LEAP Z,THERE
宏定义中的参数 4、宏定义中变元使用%操作符的情况 格式:%expression 含义:汇编程序把跟在%之后的表达式的值转换成当前基数下的数,在展开期间,用这个数来取代哑元。 例:MSG MACRO COUNT,STRING MSG&COUNT DB STRING ENDM ERRMSG MACRO TEXT CNTR=CNTR+1 MSG %CNTR,TEXT ENDM 宏调用:CNTR=0 ERRMSG ‘SYNTAX ERROR’ . . . ERRMSG ‘INVALID OPERAND’
宏定义中的参数 在MASM6中,可以用:REQ指明某个变元是必须有的 例:DIF MACRO A,B DB B-A ENDM DIF1 MACRO A:REQ,B:REQ DB B-A ENDM DIF2 MACRO A:REQ,B DB B-A ENDM
宏定义中的参数 在MAST6中,可以用:=为变元提供缺省的参数值 例:DIF3 MACRO A:=<10>,B:=<12> DB B-A ENDM 宏调用:DIF3 DIF 3 5,8 DIF3 5
LOCAL伪指令 LOCAL伪指令:如果宏体中有分支,循环,必然有标号,两次以上调用这样的宏指令必然出现标号重复定义的错误,可以用LOCAL解决这一问题. 格式:LOCAL 标号名表
LOCAL伪指令例子 .486 CRLF MACRO MOV AH,OEH MOV AL,ODH INT 10H MOV AL,0AH INT 10H ENDM
LOCAL伪指令例子 DISP MACRO VAR,NN LOCAL LAST1,LAST2 MOV CH,NN/4 LAST1:MOV CL,4 LAST2:MOV AL,’0’ ROL VAR,1 ADC AL,0 MOV AH,0EH INT 10H DEC CL
LOCAL伪指令例子 JNZ LAST2 MOV AL,’ ‘ INT 10H DEC CH JNZ LAST1 CRLF ENDM
LOCAL伪指令例子 CODE SEGMENT USE16 ASSUME CS:CODE NUM DB 88H BEG:MOV EBX,12345678H DISP BH,8 DISP BX,16 DISP EBX,32 DISP NUM,8 MOV AH,4CH INT21H CODE ENDS END BEG
在宏定义中使用宏 宏定义中允许使用宏调用,其限制条件是:必须先定义后调用。 例:DIF MACRO X,Y MOV AX,X SUB AX,Y ENDM DIFSQR MACRO OPR1,OPR2,RESULT PUSH DX PUSH AX DIF OPR1,OPR2 IMUL AX MOV RESULT,AX POP AX POP DX ENDM 宏调用:DIFSQR VAR1,VAR2,VAR3
在宏定义中使用宏 宏定义中包含宏定义 例:DEFMAC MACRO MACNAM,OPERATOR MACNAM MACRO X,Y,Z PUSH MOV AX,X OPERATOR AX,Y MOV Z,AX POP AX ENDM ENDM 宏调用:DEFMAC ADDITION,ADD
列表伪指令 .XALL:指示清单中只列出产生目标码的宏展开(缺省);.LISTMACROALL(MASM6) .LALL:列出包括注释在内的所有宏展开;(但不列出;;的注释);.LISTMACRO(MASM6) .SALL:不列出任何展开信息;.NOLISTMACRO(MASM6)
宏库的建立与调用 宏库:将编程中常用的宏定义建立成一个独立的文件,这个只包含若干宏定义的文件可称为宏库。通常用扩展名MAC或INC来表示。 宏库的调用:INCLUDE C:\MACRO.MAC
PURGE 伪操作 格式:PRUGE 宏名[,宏名,…] 含义:删除一个不在使用的宏定义,使该宏定义为空,程序中如果出现了一个已被删除宏定义的宏调用,则汇编程序将不会出错,但它将忽略该宏调用,当然不会展开。
重复汇编 重复伪操作 格式:REPT 表达式 . . .(重复块) ENDM 含义:将重复块重复表达式这么多次 例:X=0 REPT 10 X=X+1 DB X ENDM
重复汇编 不定重复伪操作 格式:IRP DUMMY,<ARGUMENT LIST> . . .(重复块) ENDM 含义:把重复块中的代码重复若干次,每次重复把重复块中的哑元用自变量表中的一项来取代,下一次取代下一项,重复次数由自变量个数来确定。自变量表必须用尖括号来括起来,它可以是常数,符号和字符串等。 例:IRP X,<1,2,3,4,5,6,7,8,9,10> DB X ENDM
条件汇编 IF ;条件成立 … … [ELSE] ;否则 … … ENDIF ;结束条件汇编语句
条件汇编 IF的形式: IF操作数 ;若OPR≠0时 IFE操作数 ;若OPR=0时 IFDEF标号或变量;如果标号或变量已被定义 IFNDEF标号或变量;如果标号或变量未被定义 IFB〈变量〉 ;若变量为空时 IFNB〈变量〉 ;若变量不为空时 IFIDN〈OPR1〉,〈OPR2〉;若〈OPR1〉=〈OPR2〉 IFDIF〈OPR1〉,〈OPR2〉;若〈OPR1〉≠〈OPR2〉 IF1 ;若汇编程序在第1遍扫描时 IF2 ;若汇编程序在第2遍扫描时
条件汇编 例: SHIFT MACRO VAR,NN,LR IF LR EQ ‘L’ ROL VAR,NN ELSE ROR VAR,NN ENDIF ENDM
条件汇编 MOV EBX,12345678H PUSH EBX SHIFT EBX,8,’L’ POP EBX SHIFT EBX,8,’R’