写个简单的程序查看下汇编代码就知道了。
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中。