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