本帖最后由 Croper 于 2019-3-9 14:16 编辑
部分反汇编的结果:#include <stdio.h>
int a(int n)
{
int p;
if(n==2)
{
return n;
}
else
{
a(n-1);
p=n*n;
//这是最后一次使用eax寄存器的位置
//01101814 mov eax,dword ptr [n] //把n的值放入eax寄存器,此时eax=5
//01101817 imul eax,dword ptr [n] //eax寄存器的乘上n的值,此时eax=25
//0110181B mov dword ptr [p],eax //把eax寄存器的值放入p,此时p=25,eax=25;
}
}
int main(int argc, char const *argv[])
{
/* code */
printf("%d\n",a(5) );
//01101988 push 5
//0110198A call a (01101217h) //这是调用函数a,返回后eax=25
//0110198F add esp,4
//01101992 push eax //把eax当做a()的返回值推入栈,此时eax=25
//01101993 push offset string "%d\n" (01107B30h)
//01101998 call _printf (0110104Bh) //调用printf,此时输出的值当然是25
//0110199D add esp,8
return 0;
}
|