Ond*_*lka 2 c++ 64-bit assembly x86-64
在C++中调用函数时,推rdi和pop rdi的目的是什么?VS2010,x64,调试,没有优化
C++
int calc()
{
return 8 + 7;
}
Run Code Online (Sandbox Code Playgroud)
拆卸:
int calc()
{
000000013F0B1020 push rdi
return 8 + 7;
000000013F0B1022 mov eax,0Fh
}
000000013F0B1027 pop rdi
000000013F0B1028 ret
Run Code Online (Sandbox Code Playgroud)
它没有任何意义.这是未经优化的代码的常见工件.代码生成器发出push edi指令以预期必须执行添加.必须在函数调用之间保留EDI寄存器.但后来,发现可以在编译时执行添加.
摆脱这样的无关代码需要"窥视孔优化".但是在Debug构建中未启用该优化.要知道真正的代码是什么样的,你必须打开优化器,最好通过构建Release构建来完成.它实际上将完全消除该功能,您可以通过以下方式阻止它:
__declspec(noline) int calc()
{
return 8 + 7;
}
Run Code Online (Sandbox Code Playgroud)
在Release版本中生成:
return 8 + 7;
000007F7038E1000 mov eax,0Fh
000007F7038E1005 ret
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3119 次 |
| 最近记录: |