Kee*_*oek 1 x86 assembly cdecl
为什么在 x86 上没有伴随指令离开?那样,
pushl %ebp
movl %esp,%ebp
pushl $3
popl %eax
leave
ret
Run Code Online (Sandbox Code Playgroud)
可以变成:
enter #or something
pushl $3
popl %eax
leave
ret
Run Code Online (Sandbox Code Playgroud)
一般来说,这不是更快吗?
事实上,是一个enter指令。至于为什么它没有多少用处,“英特尔® 64 位和 IA-32 架构优化参考手册”提供了一个提示:
汇编/编译器编码规则 32。(MH 影响,M 通用性)使用
push/pop来管理函数调用/返回之间的堆栈空间和地址调整,而不是enter/leave。enter除了错误预测之外,使用具有非零立即数的指令可能会在流水线中遇到明显的延迟。