在不需要清理时避免 "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
,我不负责被调用者清理。此外,我没有什么可清洁的。我想避免序言的 push
和 mov
,以及结尾的 leave
。
如何避免 push
、mov
和 leave
?
您可以使用一对选项禁用 prologue/epilogue:
OPTION PROLOGUE:NONE
OPTION EPILOGUE:NONE
如果您想恢复部分代码的默认设置:
OPTION PROLOGUE:PrologueDef
OPTION EPILOGUE:EpilogueDef
我有一个用 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
?
您可以使用一对选项禁用 prologue/epilogue:
OPTION PROLOGUE:NONE
OPTION EPILOGUE:NONE
如果您想恢复部分代码的默认设置:
OPTION PROLOGUE:PrologueDef
OPTION EPILOGUE:EpilogueDef