| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
#include <stdio.h> 
int a(int n) 
{ 
    int p; 
    if(n==2) 
        { 
            return n; 
        } 
    else 
    { 
 
        a(n-1); 
        p=n*n; 
    } 
} 
int main(int argc, char const *argv[]) 
{ 
    /* code */ 
    printf("%d\n",a(5) ); 
    return 0; 
} 
这个返回值是多少呢?
 本帖最后由 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;
 
 - }
 
  复制代码 
 
 
 |   
 
 
 
 |