函数返回值不用变量接收的话去哪了

写个简单的程序查看下汇编代码就知道了。

int GetValue(int a, int b)
{
    return a + b;
}

int main()
{   
    int a = 10;
    int b = 20;
    int c = GetValue(a, b);
    std::cout << c << std::endl;
    return 0;
}

先看下GetValue的汇编

int GetValue(int a, int b)
{
00007FF66ACC1760  mov         dword ptr [rsp+10h],edx  
00007FF66ACC1764  mov         dword ptr [rsp+8],ecx  
00007FF66ACC1768  push        rbp  
00007FF66ACC1769  push        rdi  
00007FF66ACC176A  sub         rsp,0E8h  
00007FF66ACC1771  lea         rbp,[rsp+20h]  
00007FF66ACC1776  lea         rcx,[__C9DFA0B3_ConsoleApplication1@cpp (07FF66ACD1066h)]  
00007FF66ACC177D  call        __CheckForDebuggerJustMyCode (07FF66ACC1352h)  
    return a + b;
00007FF66ACC1782  mov         eax,dword ptr [b]  
00007FF66ACC1788  mov         ecx,dword ptr [a]  
00007FF66ACC178E  add         ecx,eax  
00007FF66ACC1790  mov         eax,ecx  
}
00007FF66ACC1792  lea         rsp,[rbp+0C8h]  
00007FF66ACC1799  pop         rdi  
00007FF66ACC179A  pop         rbp  
00007FF66ACC179B  ret  

可以看到最后将计算的结果放到了eax寄存器。

不用c去接收GetValue的返回值的时候,汇编如下

int main()
{   
00007FF66ACC1830  push        rbp  
00007FF66ACC1832  push        rdi  
00007FF66ACC1833  sub         rsp,128h  
00007FF66ACC183A  lea         rbp,[rsp+20h]  
00007FF66ACC183F  lea         rcx,[__C9DFA0B3_ConsoleApplication1@cpp (07FF66ACD1066h)]  
00007FF66ACC1846  call        __CheckForDebuggerJustMyCode (07FF66ACC1352h)  
    int a = 10;
00007FF66ACC184B  mov         dword ptr [a],0Ah  
    int b = 20;
00007FF66ACC1852  mov         dword ptr [b],14h  
    GetValue(a, b);
00007FF66ACC1859  mov         edx,dword ptr [b]  
00007FF66ACC185C  mov         ecx,dword ptr [a]  
00007FF66ACC185F  call        GetValue (07FF66ACC13B1h)  
    return 0;
00007FF66ACC1864  xor         eax,eax  
}
00007FF66ACC1866  lea         rsp,[rbp+108h]  
00007FF66ACC186D  pop         rdi  
00007FF66ACC186E  pop         rbp  
00007FF66ACC186F  ret  

其实就不会管eax的值,可能在哪次用到eax寄存器的时候就会将它覆盖掉了,再看下使用c去接收的情况

int main()
{   
00007FF740D61910  push        rbp  
00007FF740D61912  push        rdi  
00007FF740D61913  sub         rsp,148h  
00007FF740D6191A  lea         rbp,[rsp+20h]  
00007FF740D6191F  lea         rcx,[__C9DFA0B3_ConsoleApplication1@cpp (07FF740D72066h)]  
00007FF740D61926  call        __CheckForDebuggerJustMyCode (07FF740D61370h)  
    int a = 10;
00007FF740D6192B  mov         dword ptr [a],0Ah  
    int b = 20;
00007FF740D61932  mov         dword ptr [b],14h  
    int c = GetValue(a, b);
00007FF740D61939  mov         edx,dword ptr [b]  
00007FF740D6193C  mov         ecx,dword ptr [a]  
00007FF740D6193F  call        GetValue (07FF740D61271h)  
00007FF740D61944  mov         dword ptr [c],eax  
    std::cout << c << std::endl;
00007FF740D61947  mov         edx,dword ptr [c]  
00007FF740D6194A  mov         rcx,qword ptr [__imp_std::cout (07FF740D70170h)]  
00007FF740D61951  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF740D70158h)]  
00007FF740D61957  lea         rdx,[std::endl<char,std::char_traits<char> > (07FF740D61037h)]  
00007FF740D6195E  mov         rcx,rax  
00007FF740D61961  call        qword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (07FF740D70150h)]  
    return 0;
00007FF740D61967  xor         eax,eax  
}
00007FF740D61969  lea         rsp,[rbp+128h]  
00007FF740D61970  pop         rdi  
00007FF740D61971  pop         rbp  
00007FF740D61972  ret  

可以看到mov ptr [c], eax,从eax取出来放到了变量c中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值