【发布时间】:2015-10-16 08:22:33
【问题描述】:
我有一个用 MASM/ML 组装的 X86 ASM 例程。该例程是__cdecl,在 Visual Studio 中使用。
该例程不使用局部变量,但它确实获取与ebp 相关的参数。以下是该过程的声明方式:
.CODE
ALIGN 8
OPTION LANGUAGE:C
...
MSC_ASM_GenerateBlock PROC arg1:DWORD,arg2:DWORD,arg3:DWORD
Load_Arguments:
mov buffer, arg1
mov bsize, arg2
mov safety, arg3
...
MSC_ASM_GenerateBlock ENDP
MASM 正在生成标准序言(dumpbin 反汇编,标签归于/Zi):
_MSC_ASM_GenerateBlock:
00000000: push ebp
00000001: mov ebp,esp
Load_Arguments:
00000003: mov edi,dword ptr [ebp+8]
00000006: mov edx,dword ptr [ebp+0Ch]
00000009: mov ecx,dword ptr [ebp+10h]
...
它正在生成一个标准的尾声(dumpbin 反汇编,标签归于/Zi):
...
MSC_ASM_GenerateBlock_Success:
0000005B: mov eax,1
MSC_ASM_GenerateBlock_Ret:
00000060: leave
00000061: ret
因为它的__cdecl,我不负责被调用者清理。此外,我没有什么要清理的。我想避免序言的push 和mov,以及尾声的leave。
如何避免push、mov 和leave?
【问题讨论】:
标签: visual-studio assembly masm