c++没有返回值的返回值

c++没有返回值的返回值_第1张图片

上面的函数search没有返回值,因为a不等于1,但是输出的时候会输出6.这恰巧是x的值,如果我们希望a不等于1时返回x,那么这种结果反而是正确的.有时候这种错误的代码可能产生正确的结果反而会加大debug难度

int search(int n)
{
00007FF66DB723E0  mov         dword ptr [rsp+8],ecx  
00007FF66DB723E4  sub         rsp,18h  
	int x = 6;
00007FF66DB723E8  mov         dword ptr [x],6  
	int a = 0;
00007FF66DB723F0  mov         dword ptr [rsp],0  
	a = x;
00007FF66DB723F7  mov         eax,dword ptr [x]  
00007FF66DB723FB  mov         dword ptr [rsp],eax  
	if (a == 1)
00007FF66DB723FE  cmp         dword ptr [rsp],1  
00007FF66DB72402  jne         search+26h (07FF66DB72406h)  
		return 0;	
00007FF66DB72404  xor         eax,eax  
}
00007FF66DB72406  add         rsp,18h  
00007FF66DB7240A  ret  
--- 无源文件 -----------------------------------------------------------------------
00007FF66DB7240B  int         3  
00007FF66DB7240C  int         3  
00007FF66DB7240D  int         3  
00007FF66DB7240E  int         3  
00007FF66DB7240F  int         3  
--- D:\code\test\源.cpp ---------------------------------------------------------
 
int main()
{	
00007FF66DB72410  sub         rsp,38h  
	int ret = search(0);
00007FF66DB72414  xor         ecx,ecx  
00007FF66DB72416  call        search (07FF66DB723E0h)  
00007FF66DB7241B  mov         dword ptr [ret],eax  

上面是它的反汇编代码,我们可以看到

	a = x;
00007FF66DB723F7  mov         eax,dword ptr [x]  
00007FF66DB723FB  mov         dword ptr [rsp],eax    

在a=x;这句话,它把x放到寄出去eax,然后再把寄出去eax放到a.
这本没有问题,
但是

	int ret = search(0);
00007FF66DB72414  xor         ecx,ecx  
00007FF66DB72416  call        search (07FF66DB723E0h)  
00007FF66DB7241B  mov         dword ptr [ret],eax  

上面代码的意思是先调用search函数,然后把eax寄存器的值赋予ret.在汇编中,它会约定好返回值存在eax寄存器
但是如果你没有返回值对eax寄存器的值进行更新,那么他就会得到之前存在eax寄存器的值

总结:汇编总是认为你有返回值存在某个寄存器上,这些寄存器并不是返回值独享的,可能被之前操作使用,有可能没被用过,但是无论如此,寄存器从二进制的角度来看总是有值的

你可能感兴趣的:(c++,java,开发语言)