在不需要清理时避免 "push ebp, mov esp, ebp" 序言

Avoid "push ebp, mov esp, ebp" prologue when no cleanup is required

我有一个用 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

您可以使用一对选项禁用 prologue/epilogue:

OPTION PROLOGUE:NONE 
OPTION EPILOGUE:NONE 

如果您想恢复部分代码的默认设置:

OPTION PROLOGUE:PrologueDef 
OPTION EPILOGUE:EpilogueDef