MASM-过程和宏之间的差异

问题描述 投票:0回答:1

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

如果执行完全相同的操作,则调用macro而不是procedure时,程序将执行什么操作或汇编程序将如何汇编代码?

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

谢谢。

assembly masm masm32
1个回答
0
投票

宏只是文本替换。因此,每当您“调用”宏时,该调用将在编译时被宏的全部内容替换。当您调用一个过程时,通常只有该过程的一个实例,因此您将跳转到程序中的其他位置。

请考虑以下示例:

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

© www.soinside.com 2019 - 2024. All rights reserved.