在不需要清理时避免“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
,我不负责被调用者清理。此外,我没有什么要清理的。我想避免序言的push
和mov
,以及尾声的leave
。
如何避免push
、mov
和leave
?
【问题讨论】:
【参考方案1】:您可以使用一对 OPTION 禁用序言/尾声:
OPTION PROLOGUE:NONE
OPTION EPILOGUE:NONE
如果你想恢复部分代码的默认值:
OPTION PROLOGUE:PrologueDef
OPTION EPILOGUE:EpilogueDef
【讨论】:
完美,非常感谢。实际上,我自己是在The MASM Forums 遇到的。太糟糕了,微软认为在OPTION (MASM) 上记录它不够重要(除了列出它)。以上是关于在不需要清理时避免“push ebp, mov esp, ebp”序言的主要内容,如果未能解决你的问题,请参考以下文章
如何在不加载空页面的情况下清理 UIWebView 的内容?
为啥清理 useEffect 挂钩将 RTKQ 的结果视为 isLoading 以及如何避免该问题?