![]() | 第11章 更高级的技术 | -315- | |||||||||||||||||||
能。"宏"的概念比较抽象,在汇编语言中所谓"宏"指得就是由一组指令构成的具有某种功能的程序块。 如果从定义上理解,"宏"好象就是子程序,实际并非如此,"宏"与子程序有着很大的不同之处。在具体讨论这个问题之前,我们先来研究下面给出的这个程序: |
|||||||||||||||||||||
BESTWISH.ASM code main msg main code |
MACRO mov int ENDM segment assume org proc mov 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 |