我们把例7.14的宏定义部分建成宏库MACRO . MAC,如下程序所示;而把例7.14的程序编码部分,加上INCLUDE语句构成新程序,如g7_5所示。其中INCLUDE语句在程序的最前面。需要指出的是,该语句可以不放在程序的最前面,但它必须放在所有的宏调用之前。g7_6为该程序的LST清单,可见汇编程序已将宏库中的宏定义都包含在此程序中了,并且完成了宏展开任务。
;宏定义库--macro.mac
;--------------------------------------------------------------
initz macro ;宏定义开始
mov ax,@data ;初始化段寄存器
mov ds,ax ;
mov es,ax
endm ;宏定义结束
;
prompt macro messge ;宏定义开始
; 本宏定义功能是显示某一条信息
;;产生用于返回DOS的代码
mov ah,09h ;ah中的功能号9表示要显示一串字符
lea dx,messge ;dx存放要显示的字符串首地址
int 21h ;调用DOS
endm ;宏定义结束
;
finish macro ;宏定义开始
mov ax,4c00h ;ah中的功能号4ch表示要返回DOS,al中的00表示无错
int 21h
endm ;宏定义结束
;----------------------------------------------------------------
;使用宏定义--g7_5
;----------------------------------------------------------------
include macro.mac
;----------------------------------------------------------------
.model small
.386
.stack 200h ;定义堆栈段
.data ;定义数据段
messg1 db 'Customer name?',13,10,'$'
messg2 db 'Customer address?',13,10,'$'
;-----------------------------------------------------------------
.code ;定义代码段
begin proc far
initz
prompt messg1
prompt messg2
finish
begin endp
;------------------------------------------------------------
end begin
;使用宏定义--g7_6
;--------------------------------------------------------------
include macro.mac
C ; 宏定义库--macro.mac
C ;------------------------------------------------------------
C initz macro ; 宏定义开始
C mov ax,@data ; 初始化段寄存器
C mov ds,ax ;
C mov es,ax
C endm ; 宏定义结束
C ;
C prompt macro messge ; 宏定义开始
C ; 本宏定义功能是显示某一条信息
C ;;产生用于返回DOS的代码
C mov ah,09h ; ah中的功能号9表示要显示一串字符
C lea dx,messge ; dx存放要显示的字符串首地址
C int 21h ; 调用DOS
C endm ; 宏定义结束
C ;
C finish macro ; 宏定义开始
C mov ax,4c00h ; ah中的功能号4ch表示要返回DOS,al中的00表示无错
C int 21h
C endm ; 宏定义结束
C ;----------------------------------------------------------
. model small
.386
0200 .stack 200h ;定义堆栈段
0000 .data ;定义数据段
0000 43 75 73 74 6F 6D 65 messg1 db 'Customer name?',13,10,'$'
72 20 6E 61 6D 65 3F
0D 0A 24
0011 43 75 73 74 6F 6D 65 messg2 db 'Customer address?',13,10,'$'
72 20 61 64 64 72 65
73 73 3F 0D 0A 24
;--------------------------------------------------------------
0000 .code ;定义代码段
0000 begin proc far
initz
0000 B8 ---- R 1 mov ax,@data ;初始化段寄存器
0003 8E D8 1 mov ds,ax ;
0005 8E C0 1 mov es,ax
prompt messg1
0007 B4 09 1 mov ah,09h ; ah中的功能号9表示要显示一串字符
0009 8D 16 0000 R 1 lea dx,messg1 ; dx存放要显示的字符串首地址
000D CD 21 1 int 21h ; 调用DOS
prompt messg2
000F B4 09 1 mov ah,09h ; ah中的功能号9表示要显示一串字符
0011 8D 16 0011 R 1 lea dx,messg2 ; dx存放要显示的字符串首地址
0015 CD 21 1 int 21h ; 调用DOS
finish
0017 B8 4C00 1 mov ax,4c00h ; ah中的功能号4ch表示要返回DOS,al中的00表示无错
001A CD 21 1 int 21h
001C begin endp
;-----------------------------------------------------------------
001C end begin