避免"推动ebp,mov esp,ebp"不需要清理的序言

时间:2015-10-16 08:22:34

标签: visual-studio assembly masm

我有一个与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,我不负责被叫清理。另外,我没有什么可以清理的。我想避开序言的pushmov以及结语的leave

如何避免pushmovleave

1 个答案:

答案 0 :(得分:3)

您可以使用一对OPTION来禁用序言/结语:

OPTION PROLOGUE:NONE 
OPTION EPILOGUE:NONE 

如果你想恢复部分代码的默认值:

OPTION PROLOGUE:PrologueDef 
OPTION EPILOGUE:EpilogueDef