第13章宏处理.ppt
《第13章宏处理.ppt》由会员分享,可在线阅读,更多相关《第13章宏处理.ppt(77页珍藏版)》请在三一文库上搜索。
1、第13章 宏处理,13.1 不带参数的宏定义 13.2 带参数的宏定义 13.3 LOCAL伪指令 13.4 宏库的建立与注销 13.5 重复类伪指令 REPT、IRP及IRPC 13.6 条件伪指令,13.1 不带参数的宏定义,宏定义一定要放在所有的段定义之前。例13.1就是一个名称为INIT1的宏定义,此宏定义中的多条指令是EXE格式程序的初始化部分,即为各段寄存器赋初值。 例13.1 不带参数的宏定义。,INIT1 MACRO ;宏定义 ASSUME CS:CSEG,DS:DSEG,SS:STACK,ES:DSEG ; PUSH DS ; SUB AX,AX ; PUSH AX ; 宏体
2、 MOV AX,DSEG ; MOV DS,AX ; MOV ES,AX ; ENDM ;宏结束,伪指令MACRO的功能是在汇编过程中告诉汇编程序:此行以下一直到ENDM为止的所有指令都是宏定义,而宏的名称是INIT1;也可以使用其他任何有效的汇编语言的名称作为宏定义名。ENDM代表一个宏定义的结束,在MACRO和ENDM之间的7行指令,就构成了宏定义的主体,称为宏体。 在宏定义中所用到的名称,CSEG、DSEG和STACK都必须在程序的某个地方定义过才可以(即一定存在和有意义)。当汇编过程中遇到INIT1时,汇编程序会先将它当作是一条普通指令来处理,当然这是行不通的;所以,它接着会检查这是否
3、是一条宏定义指令。,因为在程序中已经定义了一个名为INIT1的宏定义,所以汇编程序会以宏体中的指令取代此宏指令,而置于程序内,这个过程称为宏扩展。虽然,例13.1的INIT1在程序中只用到一次,但是对于大多数的宏都会被重复使用很多次,而且每一次汇编程序都会为其作同样的宏扩展。,例13.1的程序清单如下: ; filename:L131.ASM ; INIT1 MACRO ;宏定义 ASSUME CS:CSEG,DS:DSEG,SS:STACK,ES:DSEG PUSH DS SUB AX,AX PUSH AX,MOV AX,DSEG MOV DS,AX MOV ES,AX ENDM ;宏定义结
4、束 ; STACK SEGMENT PARA STACK STACK DW 32 DUP(?) STACK ENDS ; ,DSEG SEGMENT PARA Data MESSGE DB Test of macro-instruction,13 DSEG ENDS ; CSEG SEGMENT PARA Code BEGIN PROC FAR INIT1 ;宏指令(宏调用),MOV AH,40H MOV BX,01 MOV CX,26 LEA DX,MESSGE INT 21H RET BEGIN ENDP CSEG ENDS END BEGIN,图13-1是例13.1的汇编语言源程序汇编后
5、的列表文件(L131.LST),其中在指令的左边标有“1”的指令,就是由宏指令展开出来的部分。同时,宏展开不会列出ASSUME伪指令,因为它不会产生目的机器指令码。例13.1是一个采用高级DOS功能调用,显示字符串的程序。,;Filename:L131.ASM ; INIT1 MACRO ASSUME CS:CSEG,DS:DSEG,SS:STACK,ES:DSEG PUSH DS SUB AX,AX PUSH AX MOV AX,DSEG MOV DS,AX MOV ES,AX ENDM,; 0000STACK SEGMENT PARA STACK STACK 0000 0020 DW 32
6、 DUP(?) ? 0040 STACK ENDS ; 0000 DSEG SEGMENT PARA Data 0000 54 65 73 74 20 20 6F MESSGE DB Test of macro-instruction,13,66 20 20 6D 61 63 72 6F 2D 69 6E 73 74 72 75 63 74 69 6F 6E 0D 001C DSEG ENDS ; 0000 CSEG SEGMENT PARA Code 0000 BEGIN PROC FAR,INIT1 0000 1E 1 PUSH DS 0001 2B C0 1 SUB AX,AX 0003
7、 50 1 PUSH AX 0004 B8 - R 1 MOV AX,DSEG 0007 8E D8 1 MOV DS,AX 0009 8E C0 1 MOV ES,AX 000B B4 40 MOV AH,40H 00D BB 0001 MOV BX,01,0010 B9 001A MOV CX,26 0013 8D 16 0000 R LEA DX,MESSGE 0017 CD 21 INT 21H 0019 CB RET 001A BEGIN ENDP CSEG ENDS END BEGIN,图13-1 宏指令的使用与宏扩展,13.2 带参数的宏定义,在例13.1的宏定义里用到了一些固定
8、的段名:CSEG、DSEG和STACK。为了使宏定义更具有弹性,可以接受任何的段名,就必须将这些段名定义成宏的形式参数。例如:,INIT2 MACRO CSNAME,DSNAME,SSNAME ;宏定义中的形式参数 ASSUME CS:CSNAME,DS:DSNAME,SS:SSNAME,ES:DSNAME PUSH DS SUB AX,AX PUSH AX MOV AX,DSNAME MOV DS,AX MOV ES,AX ENDM,宏定义指令中的形式参数的功能是:在宏展开时,告诉汇编程序用宏指令的实际参数代替宏体内的形式参数。INIT2中的三个形式参数CSNAME、DSNAME和SSNAM
9、E,都是使用在ASSUME伪指令中的,而DSNAME还用在后面的MOV指令中。形式参数的命名原则应符合汇编语言的命名规则。,当用到宏指令INIT2时,你必须依照宏定义指令中所指定的顺序,将三个段的实际名称作为宏定义的实际参数。例如: 宏定义: INIT2 MACRO CSNAME,DSNAME,SSNAME (形式参数) 宏指令: INIT2 CSEG, DSEG, STACK (实际参数),例13.2 带有形式参数的宏定义使用方法。 程序清单如下: ; filename:L132.ASM ; INIT2 MACRO CSNAME,DSNAME,SSNAME ;宏定义,ASSUME CS:CS
10、NAME,DS:DSNAME,SS:SSNAME,ES:DSNAME PUSH DS SUB AX,AX PUSH AX MOV AX,DSNAME MOV DS,AX MOV ES,AX ENDM,; STACK SEGMENT PARA STACK STACK DW 32 DUP(?) STACK ENDS ; DSEG SEGMENT PARA Data MESSGE DB Test of macro, $ DSEG ENDS ; CSEG SEGMENT PARA Code,BEGIN PROC FAR INIT2 CSEG,DSEG,STACK MOV AH,09 LEA DX,ME
11、SSGE INT 21H RET BEGIN ENDP CSEG ENDS END BEGIN,图13-2是例13.2的列表文件。 ; INIT2 MACRO CSNAME,DSNAME,SSNAME ASSUME CS:CSNAME,DS:DSNAME,SS:SSNAME,ES:DSNAME PUSH DS SUB AX,AX PUSH AX MOV AX,DSEG MOV DS,AX MOV ES,AX,ENDM ; 0000 STACK SEGMENT PARA STACK STACK 0000 0020? DW 32 DUP(?) 0040 STACK ENDS ; 0000 DSEG
12、 SEGMENT PARA Data 0000 54 65 73 74 20 20 6F MESSGE DB Test of macro, $,66 20 20 6D 61 63 72 6F 24 0010 DSEG ENDS ; 0000 CSEG SEGMENT PARA Code 0000 BEGIN PROC FAR INIT2 CSEG,DSEG,STACK,0000 1E 1 PUSH DS 0001 2B C0 1 SUB AX,AX 0003 50 1 PUSH AX 0004 B8 - R 1 MOV AX,DSEG 0007 8E D8 1 MOV DS,AX 0009 8
13、E C0 1 MOV ES,AX 000B B4 09 MOV AH,09,000D 8D 16 0000 R LEA DX,MESSGE 0011 CD 21 INT 21H 0013 CB RET 0014 BEGIN ENDP 0014 CSEG ENDS END BEGIN,图13-2 宏定义参数的使用方法,下面通过一些例子说明形式参数的使用。 (1) 形式参数作为宏体中指令语句的操作数,将AX寄存器内容左移X位的宏定义。 SHIFT MACRO X MOV CL,X SAL AX,CL ENDM 若要左移5位,可用宏指令SHIFT 5实现,宏展开后将以下两条指令插入即可。 1 MOV
14、 CL,5 1 SAL AX,CL,(2) 形式参数作为宏体中汇编语言指令语句的操作码。设有以下宏: X MACRO X1,X2,X3,X4 MOV AX,X1 X2 AX,X3 MOV CL,4 X4 AX,CL ENDM,若有宏指令: X 1111H,MOV,BX,SHR,则宏展开为: 1 MOV AX,1111H 1 MOV AX,BX 1 MOV CL,4 1 SHR AX,CL,(3) 形式参数作为宏体中指令语句的操作码的一部分。设有以下宏: M MACRO X,Y,Z,W MOV AX,X C&Z AX,Y J&W L ENDM,若有宏指令: M CX,BX,MP,NE,则宏展开为
15、: 1 MOV AX,CX 1 CMP AX,BX 1 JNE L,(4) 连接符(&)。连接符(&)可以告诉汇编程序,将两段文字或符号连接在一起。如下列名为MOEVE的宏,可以用作MOVSB或MOVSW: MOEVE MACRO TAG REP MOVS&TAG ENDM,13.3 LOCAL伪指令,宏定义体内还允许使用标号,但如果程序中要多次使用该宏指令(调用该宏定义)时,展开后会出现标号的重复定义,而引起出错。为此,宏汇编中提供了 LOCAL伪指令,定义局部标号伪指令以解决重复问题。为了区别程序中的标号和宏定义体中的标号,把宏定义体中的标号称为局部标号。,在汇编时,汇编程序对LOCAL伪
16、指令中的标号建立唯一的标号,在每一次宏展开时都有不同的名称,格式为:?0000 ?FFFF。LOCAL伪指令在宏定义中的位置,必须是紧跟在MACRO之后,它的一般格式如下: LOCAL 局部标号1,局部标号2,,例13.3示范了LOCAL的用法,这个程序的目的是以连续的减法来达到除法的效果。其算法是将除数从被除数中减去,并将商数加1,直到被除数小于除数为止。为了实现这个目的,宏定义里要用到两个标号:COMP和OUT。COMP和OUT必须用LOCAL伪指令来指明。,例13.3 LOCAL的用法。 程序清单如下: ; filename:L133.ASM ; DIVIDE MACRO DIVIDEN
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 13 处理
链接地址:https://www.31doc.com/p-2576742.html