第13章宏处理

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第13章 宏处理
因为在程序中已经定义了一个名为INIT1的宏定义, 所以汇编程序会以宏体中的指令取代此宏指令,而置 于程序内 ,这个过 程称为宏 扩展 。虽 然,例13.1的 INIT1在程序中只用到一次,但是对于大多数的宏都会 被重复使用很多次,而且每一次汇编程序都会为其作 同样的宏扩展。
第13章 宏处理
第13章 宏处理
; —————————————————————
0000STACK SEGMENT PARA STACK ‘STACK’
0000 0020[ DW 32 DUP(?)
????
]
0040
STACK ENDS
; —————————————————————
0000 DSEG SEGMENT PARA ‘Data’
;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
第13章 宏处理
图13-1是例13.1的汇编语言源程序汇编后的列表 文件(L131.LST),其中在指令的左边标有“1”的指令, 就是由宏指令展开出来的部分。同时,宏展开不会列 出ASSUME伪指令,因为它不会产生目的机器指令码。 例13.1是一个采用高级DOS功能调用,显示字符串的 程序。
第13章 宏处理
第13章 宏处理
0000 1E 0001 2B C0 0003 50 0004 B8 ---- R 0007 8E D8 0009 8E C0 000B B4 40 00D BB 0001
INIT1
1
PUSH DS
1
SUB AX,AX
1
PUSH AX
1
MOV AX,DSEG
1
MOV DS,AX
0000 54 65 73 74 20 20 6F MESSGE DB ‘Test of macroinstruction’,13
第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
MOV DS,AX
MOV ES,AX
ENDM
;宏定义结束
; —————————————————————
STACK SEGMENT PARA STACK ‘STACK’
DW 32 DUP(?)
STACK ENDS
; —————————————————————
第13章 宏处理
DSEG SEGMENT PARA ‘Data’
伪指令MACRO的功能是在汇编过程中告诉汇编程 序:此行以下一直到ENDM为止的所有指令都是宏定义, 而宏的名称是INIT1;也可以使用其他任何有效的汇编 语言的名称作为宏定义名。ENDM代表一个宏定义的结 束,在MACRO和ENDM之间的7行指令,就构成了宏定 义的主体,称为宏体。
在宏定义中所用到的名称,CSEG、DSEG和 STACK都必须在程序的某个地方定义过才可以(即一定 存在和有意义)。当汇编过程中遇到INIT1时,汇编程序 会先将它当作是一条普通指令来处理,当然这是行不通 的;所以,它接着会检查这是否是一条宏定义指令。
MESSGE DB ‘Test of macro-instruction’,13
DSEG ENDS
Байду номын сангаас
; —————————————————————
CSEG SEGMENT PARA ‘Code’
BEGIN PROC FAR
INIT1
;宏指令(宏调用)
第13章 宏处理
MOV AH,40H MOV BX,01 MOV CX,26 LEA DX,MESSGE INT 21H RET BEGIN ENDP CSEG ENDS END BEGIN
例13.1 不带参数的宏定义。
第13章 宏处理
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
;宏结束
第13章 宏处理
第13章 宏处理
第13章 宏处理
13.1 不带参数的宏定义 13.2 带参数的宏定义 13.3 LOCAL伪指令 13.4 宏库的建立与注销 13.5 重复类伪指令 REPT、IRP及IRPC 13.6 条件伪指令
第13章 宏处理
13.1 不带参数的宏定义
宏定义一定要放在所有的段定义之前。例13.1 就是一个名称为INIT1的宏定义,此宏定义中的多条 指令是EXE格式程序的初始化部分,即为各段寄存器 赋初值。
1
MOV ES,AX
MOV AH,40H
MOV BX,01
第13章 宏处理
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.1的程序清单如下:
; filename:L131.ASM
; —————————————————————
INIT1 MACRO
;宏定义
ASSUME CS:CSEG,DS:DSEG,SS:STACK,ES:DSEG
PUSH DS
SUB AX,AX
PUSH AX
第13章 宏处理
MOV AX,DSEG
ASSUME CS:CSNAME,DS:DSNAME,SS:SSNAME,ES:DSNAME
第13章 宏处理
13.2 带参数的宏定义
在例13.1的宏定义里用到了一些固定的段名:CSEG、 DSEG和STACK。为了使宏定义更具有弹性,可以接 受任何的段名,就必须将这些段名定义成宏的形式参 数。例如:
第13章 宏处理
INIT2 MACRO CSNAME,DSNAME,SSNAME ;宏定义中的形式参数
相关文档
最新文档