1、第六章 高级汇编语言技术,讲授要点,宏指令的基本用法。重复汇编。条件汇编。,第六章 高级汇编语言技术,宏汇编的定义和调用,1,2002.9,Init macro csname, dsnameassume cs:csname,ds:dsnamemov ax , dsnamemov ds , axendm,形式参数表,2002.9,6.2 宏汇编的定义和调用,调用:,宏汇编的定义和调用,1,例: d1 segmentmes1 db good , $d1 endsc1 segmentbegin proc far assume cs:c1,ds:d1mov ax , d1mov ds , axmov
2、ah , 9lea dx , mes1int 21hmov ah , 4chint 21hbegin endpc1 endsend begin,Init macro csname, dsnameassume cs:csname,ds:dsnamemov ax , dsnamemov ds , axendm,c1 segmentbegin proc far init c1, d1mov ah , 9lea dx , mes1int 21hmov ah , 4chint 21hbegin endpc1 endsend begin,d1 segmentmes1 db good , $d1 ends,
3、例 7。1 :用宏指令定义两个字操作数相乘,得到一16位的第三个操作数作为结果,Mu macro opr1,opr2,resultPush dxPush axMov ax,opr1Imul opr2Mov result , axPop axPop dxendm, Mu cx , var , xyzbx . Mu 240 , bx ,save ,Push dxPush axMov ax, cxImul varMov xyzbx , axPop axPop dx.Push dxPush axMov ax, 240Imul bxMov save , axPop axPop dx,展开后,2002.9
4、,6.1 宏汇编的定义和调用,宏的调用形式:无变元,2002.9,6.1 宏汇编的定义和调用,宏的调用形式:变元是操作码,P2是操作码,2002.9,6.1 宏汇编的定义和调用,宏的调用形式:变元是操作码的一部分,需用&分隔,NZ, HERE,JNZ HERE,2002.9,6.1 宏汇编的定义和调用,宏的调用形式:宏定义中含有标号,LOCAL是伪操作。只能位于宏定义体内,且是第一语句。汇编程序对其局部标号表中的每个局部标号建立唯一的符号(?0000?FFFF) 以代替在展开中存在的每个局部标号,宏展开:Cmp x0 , 0Jge ?0000Neg x0 ?0000:.Cmp bx , 0Jg
5、e ?0001Neg bx ?0001:,. ABSOL x0 ABSOL bx .,2002.9,6.1 宏汇编的定义和调用,宏定义中可含有嵌套,但宏必须先定义再使用,调用: DEFMAC SUBTRACT , SUB 展开:SUBTRACT MACRO X,Y,ZPUSH AXMOV AX , XSUB AX , YMOV Z ,AXPOP AXENDM,宏定义体内包含宏定义,DIF MACRO X ,YMOV AX , XSUB AX , YENDMDIFSQR MACRO OPR1 ,OPR2 , RESULTPUSH DXPUSH AXDIF OPR1 ,OPR2IMUL AXMOV
6、 RESULT , AXPOP AXPOP DXENDM,宏定义,宏定义中包含宏调用,宏调用: DIFSQR VAR1 ,VAR2 , VAR3宏展开:PUSH DXPUSH AXMOV AX ,VAR1SUB AX , VAR2IMUL AXMOV VAR3 , AXPOP AXPOP DX,2002.9,6.1 宏汇编的定义和调用,变元传值:%后必须是汇编变量,宏定义: MSG MACRO COUNT , STRING MSG&COUNT DB STRINGENDMERRMSG MACRO TEXTCNTR=CNTR+1MSG %CNTR , TEXTENDM 宏调用:. CNTR=0 E
7、RRMSG SYNTAX . ERRMSG INVALID,跟表达式,宏展开:MSG1 DB SYNTAX .MSG2 DB INVALID .,宏定义包含宏调用,例:定义宏指令,使其完成交换两字节单元内容的功能。,VXY MACRO X , YPUSH AXMOV AL , XXCHG AL, YMOV X , ALPOP AXENDM,例:定义宏指令,将16进制数码(09,AF,af)的ASCII码值(30H39H,41H46H,61H66H)转换为对应的一位16进制数。 al中已存放待转换的ASCII码值,转换、结束后,AL中为转换后结果。,asctohex MACRO local as
8、ctoh1,asctoh2cmp al , 9jbe asctoh1 ;在09,则减30h cmp al , ajb asctoh2 ;在AF,则减(7h +30h)sub al , 20h ;在af,则减(20h+7h+30h) Asctoh2:sub al , 7Asctoh1:sub al , 30hENDM,2002.9,6.2 重复汇编,2002.9,6.2 重复汇编, 确定次数的重复汇编,2002.9,6.2 重复汇编, 不确定次数的重复汇编,2002.9,6.2 重复汇编, 不确定次数的重复汇编,2002.9,6.3 条件汇编,2002.9,6.3 条件汇编,7.2.2 与宏有关
9、的伪指令,1. LOCAL伪指令LOCAL用来指定宏内局部符号。形式如下:LOCAL 符号名,符号名作用:在宏展开时,MASM将源文件中的所有局部符号统一按出现次序替换为唯一的标识符(?0000 ?FFFF),以避免符号的重复定义。2. EXITM 伪指令用来立即终止宏展开,通常与条件汇编结合使用。MASM忽略EXITM与ENDM之间的所有语句。3. 实例,补充:与宏指令有关的伪指令和伪操作符,7.2.3 宏操作符,1. 在宏调用时,当实在参数包含空格或逗号等间隔符时,必须使用“作为参数的定界符。 2. 开始的宏注释,在宏展开时被忽略。,补充:与宏指令有关的伪指令和伪操作符,4. ! 对于包含在之间的文本串,MASM将出现在!之后的特殊字符(、%、“、和逗号)作为普通字符处理。若将!作为普通字符,则使用!。!不适用于包含在引号中的字符串。 5. ;在宏定义中,以;开始的宏注释,在宏展开时被忽略。,本章小结,宏指令只要在程序中定义一次,就可以多次调用。在汇编时,每个宏调用被相应的宏体所取代。MASM在宏展开时对参数进行文本替换。MASM提供了REPEAT类型的重复块。与宏指令不同的是,重复块未将定义和调用分离。若希望产生可调用的重复块,则应将其放在宏定义内。使用条件汇编,可以在不同操作环境下生成不同的目标代码。然而,太多或太复杂的条件汇编语句,会降低程序的可读性。,第五章 作业,