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

Posted

技术标签:

【中文标题】在不需要清理时避免“push ebp, mov esp, ebp”序言【英文标题】:Avoid "push ebp, mov esp, ebp" prologue when no cleanup is required 【发布时间】: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

【问题讨论】:

【参考方案1】:

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

OPTION PROLOGUE:NONE 
OPTION EPILOGUE:NONE 

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

OPTION PROLOGUE:PrologueDef 
OPTION EPILOGUE:EpilogueDef 

【讨论】:

完美,非常感谢。实际上,我自己是在The MASM Forums 遇到的。太糟糕了,微软认为在OPTION (MASM) 上记录它不够重要(除了列出它)。

以上是关于在不需要清理时避免“push ebp, mov esp, ebp”序言的主要内容,如果未能解决你的问题,请参考以下文章

使用CleanMyMac清理时需要注意哪些

如何在不加载空页面的情况下清理 UIWebView 的内容?

为啥清理 useEffect 挂钩将 RTKQ 的结果视为 isLoading 以及如何避免该问题?

在不通过网络浏览器进行清理的情况下查看访问日志是不是危险?

WordPress - 如何在不丢失换行符的情况下清理文本区域中的多行文本?

MySQL分区表简介