网站 规划方案,做网站买过域名之后,企石仿做网站,汕头论坛贴吧上面的函数search没有返回值,因为a不等于1,但是输出的时候会输出6.这恰巧是x的值,如果我们希望a不等于1时返回x,那么这种结果反而是正确的.有时候这种错误的代码可能产生正确的结果反而会加大debug难度
int search(int n)
{
00007FF66DB723E0 mov dword ptr [rsp8],e…
上面的函数search没有返回值,因为a不等于1,但是输出的时候会输出6.这恰巧是x的值,如果我们希望a不等于1时返回x,那么这种结果反而是正确的.有时候这种错误的代码可能产生正确的结果反而会加大debug难度
int search(int n)
{
00007FF66DB723E0 mov dword ptr [rsp8],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 search26h (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 在ax;这句话,它把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寄存器的值
总结:汇编总是认为你有返回值存在某个寄存器上,这些寄存器并不是返回值独享的,可能被之前操作使用,有可能没被用过,但是无论如此,寄存器从二进制的角度来看总是有值的