MASM - 过程和宏之间的区别

MASM - Differences between procedures and macros

我想知道 MASM 中 macrosprocedures 之间有什么区别?

如果我调用 macro 而不是 procedure,程序将执行的操作或 assembler 将如何 assemble 我的代码是否有区别做完全相同的事情?

如果不是,我可能想了解为什么 macros 存在?

谢谢。

宏只是文本替换。所以任何时候你 "call" 一个宏,那个调用将在编译时被宏的全部内容替换。当您调用一个过程时,该过程通常只有一个实例,因此您将跳转到程序中的不同位置。

考虑以下示例:

.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返回调用站点。

如我所见,宏returns一个值

所以你可以这样写:

  mov ax, myMacro( ...arguments... )

类似于 Function 对比 Sub in VB.NET(或 voidC#)