目录 上一页 下一页 附录A

第11章 更高级的技术 -315-

能。"宏"的概念比较抽象,在汇编语言中所谓"宏"指得就是由一组指令构成的具有某种功能的程序块。
  如果从定义上理解,"宏"好象就是子程序,实际并非如此,"宏"与子程序有着很大的不同之处。在具体讨论这个问题之前,我们先来研究下面给出的这个程序:
BESTWISH.ASM
print




code


main



msg
main
code


MACRO
mov
int
ENDM

segment
assume
org
proc
mov
print
ret
db 'Best wish
endp
ends
end


ah,09
21h



cs:code,ds:code
100h
near
dx,offset msg


to you',0dh,0ah,24h


main

;定义一个"宏"
;选择DOS的09H功能
;输出DX寄存器指向的字符串
;"宏"定义结束





;DX寄存器指向字符串MSG
;利用"宏"输出字符串
;结束进程




  注意在指令"MOV"与"RET"之间多出了一个"PRINT",这个"PRINT"是什么含义呢?本来将字符串的首地址送入DX寄存器之后应该调用21H中断的09H功能,中断调用的指令又跑到哪儿去了呢?
  实际上"PRINT"的作用就是调用21H中断的09功能,这个"PRINT"并非是什么伪指令之类的东西,它就包含在源程序之中。请看源程序最前面的四行:
print



MACRO
mov
int
ENDM
ah,09
21h

  "PRINT"实际上是"MOV AH,09"与"INT 21H"这两条指令的"替身",这五个字母就相当于两条指令。这种代替关系就是通过"宏"产生的。源程序中有两个大写的伪指令--"MACRO"与"ENDM",这两个伪指令之间包含着一些代码,这组代码就是所谓的"具有一定功能的程序块"。比如我们给出的这个例子所具有的功能就是调用21H中断的09功能。象这样由伪指令"MACRO"与"ENDM"包含的程序段就是一个"宏"。
  每个"宏"都要有一个名字,名字要写在"MACRO"伪指令前面。示例程序中定义的宏名字就是"PRINT"。如果需要在程序中使用某个宏之中的程序段,只要在程序需要的地方直接引用宏名即可。这就是为什么示例程序的MAIN过程里会有一个"PRINT"的原因了。
  每个被调用的"宏"再编译的时候都要"展开",即用"宏"里面包含的程序段代替源程序中使用的宏名。比如给出的示例程序编译成COM文件之后与没有使用宏的程序完全一样:

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 附录A