我有一个与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
?
答案 0 :(得分:3)
您可以使用一对OPTION来禁用序言/结语:
OPTION PROLOGUE:NONE
OPTION EPILOGUE:NONE
如果你想恢复部分代码的默认值:
OPTION PROLOGUE:PrologueDef
OPTION EPILOGUE:EpilogueDef