汇编程序推送rdi,pop rdi函数调用

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)

Han*_*ant 7

它没有任何意义.这是未经优化的代码的常见工件.代码生成器发出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)