第十三章高级宏汇编语言
第十三章 高级宏汇编语言
第L节宏指令 131宏定义与宏结束指令1定义宏 80868088宏汇编提供宏定义伪指令 MACRO.ENDM来定义宏。其格 参数的宏定义 MNAME MACRO 宏体ENDM (2)带参数的宏定 MNAME MACRO [DUMPAR1, DUMPAR2] 宏体ENDM MNAME是宏指令名字(下称宏名),代表所定义的宏。宏名是以字 母 数字和下划线组成的 MACRO是宏定义伤指令,ENDM是宏结束伪指令。在 MACRO和 ENDM 组有独立功能的程序代码,称为宏体。带参数的宏 义中, DUMPAR1、 DUMPAR2、是形式参数(下称形参),也称 参数,多个形参之间用逗号分隔 编 参数的宏由宏体原样取代宏名;带参数的宏,则还要 由实在参数(下称实参)取代形参
第1节 宏指令 13.1.1宏定义与宏结束指令1.定义宏 8086.8088宏汇编提供宏定义伪指令MACRO.ENDM来定义宏。其格 式有两种: (1)不带参数的宏定义 MNAME MACRO … }宏体ENDM (2)带参数的宏定义 MNAME MACRO [DUMPAR1][,DUMPAR2]… … }宏体ENDM MNAME是宏指令名字(下称宏名),代表所定义的宏。宏名是以字 母开头,由字母、数字和下划线组成的字符串。 MACRO是宏定义伪指令,ENDM是宏结束伪指令。在MACRO和 ENDM之间是一组有独立功能的程序代码,称为宏体。带参数的宏定 义中,DUMPAR1、DUMPAR2、…是形式参数(下称形参),也称哑 参数,多个形参之间用逗号分隔。 经汇编后,不带参数的宏由宏体原样取代宏名;带参数的宏,则还要 由实在参数(下称实参)取代形参
2宏调用与宏展开 具有独立功能的程序段被定义为宏以后,就可以在源 程屏中调用了。在操作码段写上宏名,也就是使用宏指令, 称为左调用。“先定义,后使用”是宏指令调用的原则,调 用格式为 MNAME或 MNAME PAR1,PAR2, MNAME是之 定义过的宏名 对于带参数的宏调用,PAR1,PAR2,是实参。实参与 形参的意义和出现次序必须一致,但参数的个数不一定相等 竹实参多于形参时,多余的实参被忽略。当实参少于形参时, 则多余的形参被忽略 源程序被汇编时,每当在操作码段遇到宏调用,宏汇编 程序就用宏体取代宏名,对于带参数的宏,则同时用实参取 代宏体中对应形参的位置,生成宏体目标代码,这个过程称 为宏展开。应该注意,宏展开后,所得到的语句应该是有效 的,否则宏汇编程序将会提示出错
2.宏调用与宏展开 一个具有独立功能的程序段被定义为宏以后,就可以在源 程序中调用了。在操作码段写上宏名,也就是使用宏指令, 称为宏调用。“先定义,后使用”是宏指令调用的原则,调 用格式为MNAME或 MNAME PAR1,PAR2,…MNAME是之前 定义过的宏名。 对于带参数的宏调用,PAR1,PAR2,…是实参。实参与 形参的意义和出现次序必须一致,但参数的个数不一定相等。 当实参多于形参时,多余的实参被忽略。当实参少于形参时, 则多余的形参被忽略。 当源程序被汇编时,每当在操作码段遇到宏调用,宏汇编 程序就用宏体取代宏名,对于带参数的宏,则同时用实参取 代宏体中对应形参的位置,生成宏体目标代码,这个过程称 为宏展开。应该注意,宏展开后,所得到的语句应该是有效 的,否则宏汇编程序将会提示出错
例13,1字变量加法 DSEG SEGMENT VI DW 1234H V2 1111H V3 DW? DSEG ENDS SSEG SEGMENT STACK STK DB 20 DUP(0) SSEG ENDS CSEG SEGMENT ASSUME DS: DSEG, SS: SSEG, CS: CSEG DADD MACRO X,Y,z;宏定义 PUSH AX MOVAX, X ADDAX, Y MOV Z, AX POPAX ENDM
例13.1字变量加法 DSEG SEGMENT V1 DW 1234H V2 DW 1111H V3 DW ? DSEG ENDS SSEG SEGMENT STACK STK DB 20 DUP(0) SSEG ENDS CSEG SEGMENT ASSUME DS:DSEG,SS:SSEG,CS:CSEG DADD MACRO X,Y,Z;宏定义 PUSH AX MOVAX,X ADDAX,Y MOV Z,AX POPAX ENDM
START MOVAX, DSEG MO∨DS,AX MOV AX, SSEG MOV SS, AX MOV SP, LENGTH STK DADDⅥL,V2,V3;宏调用 MOV AH, 4CH INT 21H CSEG ENDS END START 宏展开: 三 PUSH AX MO∨AX,V1 ADD AX, V2 MOV V3, AX POP AX 从宏展开的结果可以看出,宏调用时的实参取代了宏定义时的形参。 程序清单中语句左侧的“+”号是汇编程序在清单文件中加的记号,以表 一示这是宏展开后的语句。请注意,这些“+”号实际上并不存在
START:MOVAX,DSEG MOV DS,AX MOV AX,SSEG MOV SS,AX MOV SP,LENGTH STK DADD V1,V2,V3 ;宏调用 MOV AH,4CH INT 21H CSEG ENDS END START 宏展开: + PUSH AX + MOV AX,V1 + ADD AX,V2 + MOV V3,AX + POP AX 从宏展开的结果可以看出,宏调用时的实参取代了宏定义时的形参。 程序清单中语句左侧的“+”号是汇编程序在清单文件中加的记号,以表 示这是宏展开后的语句。请注意,这些“+”号实际上并不存在