在C++中调用函数时push rdi和pop rdi的目的是什么?
VS2010,x64,调试,无优化
C++
int calc()
{
return 8 + 7;
}
拆卸:
int calc()
{
000000013F0B1020 push rdi
return 8 + 7;
000000013F0B1022 mov eax,0Fh
}
000000013F0B1027 pop rdi
000000013F0B1028 ret
最佳答案
没有目的。这是未优化代码的常见问题。代码生成器在预期必须执行加法运算时发出push edi
指令。 EDI寄存器必须在函数调用之间保留。但是随后,我们发现可以在编译时执行加法操作。
摆脱这样的无关代码需要"peephole optimization"。但是,该优化未在Debug版本中启用。要了解真实代码的外观,您必须打开优化器,最好通过构建Release版本来完成。实际上,它将完全消除该功能,您可以使用以下方法阻止它:
__declspec(noline) int calc()
{
return 8 + 7;
}
在Release版本中产生的内容:
return 8 + 7;
000007F7038E1000 mov eax,0Fh
000007F7038E1005 ret