【问题标题】:Avoid "push ebp, mov esp, ebp" prologue when no cleanup is required在不需要清理时避免“push ebp, mov esp, ebp”序言
【发布时间】: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,我不负责被调用者清理。此外,我没有什么要清理的。我想避免序言的pushmov,以及尾声的leave

如何避免pushmovleave

【问题讨论】:

    标签: visual-studio assembly masm


    【解决方案1】:

    您可以使用一对 OPTION 禁用序言/尾声:

    OPTION PROLOGUE:NONE 
    OPTION EPILOGUE:NONE 
    

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

    OPTION PROLOGUE:PrologueDef 
    OPTION EPILOGUE:EpilogueDef 
    

    【讨论】:

    • 完美,非常感谢。实际上,我自己是在The MASM Forums 遇到的。太糟糕了,微软认为在OPTION (MASM) 上记录它不够重要(除了列出它)。
    猜你喜欢
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 2011-07-25
    • 2013-11-13
    • 2012-04-03
    相关资源
    最近更新 更多