MASM - 过程和宏之间的区别
MASM - Differences between procedures and macros
我想知道 MASM 中 macros
和 procedures
之间有什么区别?
如果我调用 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(或 void 在 C#)
我想知道 MASM 中 macros
和 procedures
之间有什么区别?
如果我调用 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(或 void 在 C#)