在C++中调用函数时,推送rdi和弹出rdi的目的是什么?VS2010、x64、debug、无优化
C++
int calc()
{
return 8 + 7;
}
拆卸:
int calc()
{
000000013F0B1020 push rdi
return 8 + 7;
000000013F0B1022 mov eax,0Fh
}
000000013F0B1027 pop rdi
000000013F0B1028 ret
发布于 2013-02-04 06:21:14
这是没有目的的。这是未优化代码的常见工件。代码生成器在预期必须执行加法时发出push edi
指令。必须在函数调用之间保留EDI寄存器。但是后来,发现加法可以在编译时执行。
去掉像这样的无关代码需要"peephole optimization"。但是在Debug版本中没有启用这种优化。要了解真正的代码是什么样子,您必须打开优化器,最好的方法是构建发布版本。实际上,它将完全消除该函数,您可以使用以下命令来阻止它:
__declspec(noline) int calc()
{
return 8 + 7;
}
它在发布版本中产生:
return 8 + 7;
000007F7038E1000 mov eax,0Fh
000007F7038E1005 ret
https://stackoverflow.com/questions/14677574
复制相似问题