我想知道MASM中macros
和procedures
之间有什么区别?
如果执行完全相同的操作,则调用macro
而不是procedure
时,程序将执行什么操作或汇编程序将如何汇编代码?
如果否,我可能想了解为什么macros
存在?
谢谢。
宏只是文本替换。因此,每当您“调用”宏时,该调用将在编译时被宏的全部内容替换。当您调用一个过程时,通常只有该过程的一个实例,因此您将跳转到程序中的其他位置。
请考虑以下示例:
.586
.model flat, stdcall
option casemap :none
.code
; Multiply the argument by 3/2
Mul3_2 MACRO reg
lea reg,[reg + reg*2]
shr reg,1
ENDM
; Multiply the argument by 3/2 and return in eax
Mul3_2Proc PROC arg:DWORD
mov eax,[arg]
lea eax,[eax + eax*2]
shr eax,1
ret
Mul3_2Proc ENDP
main PROC
Mul3_2 eax
Mul3_2 ebx
invoke Mul3_2Proc,eax ; Equivalent to push eax / call Mul3_2Proc
invoke Mul3_2Proc,ebx
main ENDP
END main
如果让MASM的预处理器扩展宏,则会得到此:
.586
.model flat, stdcall
option casemap :none
.code
; Multiply the argument by 3/2 and return in eax
Mul3_2Proc PROC arg:DWORD
mov eax,[arg]
lea eax,[eax + eax*2]
shr eax,1
ret
Mul3_2Proc ENDP
main PROC
lea eax,[eax + eax*2]
shr eax,1
lea ebx,[ebx + ebx*2]
shr ebx,1
invoke Mul3_2Proc,eax ; Equivalent to push eax / call Mul3_2Proc
invoke Mul3_2Proc,ebx
main ENDP
END main
如您所见,在我们使用Mul3_2
宏的两个位置,该宏的内容已插入,而reg
被我们作为宏参数传递的内容替换。宏本身已不再存在于我们的代码中,因为它已达到其目的。
另一方面,我们调用Mul3_2Proc
过程的两次出现均保持不变。在运行时,将从每个位置到call
的位置都有一个跳转(Mul3_2Proc
),当完成时,该位置又会ret
返回到调用站点。