函数调用:4.1.3 函数调用时发生了什么

作者: 王清编著 出处:电子工业出版社博文视点

4.1.3 时发生了什么


我们下面就来探究下高级语言中和递归等性质是怎样通过系统栈巧妙实现请看如下代码:

func_B( arg_B1, arg_B2)
{
var_B1, var_B2;
var_B1=arg_B1+arg_B2;
var_B2=arg_B1-arg_B2;
var_B1*var_B2;
}

func_A( arg_A1, arg_A2)
{
var_A;
var_A = func_B(arg_A1,arg_A2) + arg_A1 ;
var_A;
}

( argc, char **argv, char **envp)
{
var_;
var_=func_A(4,3);
var_;
}





这段代码经过编译器编译后各个对应机器指令在代码区中可能是这样分布如图4.1.2所示


根据操作系统区别、编译器和编译选项区别文件区别代码在内存代码区中分布可能相邻也可能相离甚远;可能先后有序也可能无序;但它们都在同个PE文件代码所映射个“节”里我们可以简单地把它们在内存代码区中分布位置理解成是散乱无关


当CPU在执行func_A时候会从代码区中对应机器指令区域跳转到func_A对应机器指令区域在那里取指并执行;当func_A执行完闭需要返回时候又会跳回到对应指令区域紧接着func_A后面指令继续执行代码在这个过程中CPU取指轨迹如图4.1.3所示



498)this.style.width=498;" border=0> 
图4.1.4 系统栈在变化



如图4.1.4所示过程中伴随系统栈中操作如下


func_A时候首先在自己栈帧中压入返回地址然后为func_A创建新栈帧并压入系统栈


在func_Afunc_B时候同样先在自己栈帧中压入返回地址然后为func_B创建新栈帧并压入系统栈


在func_B返回时func_B栈帧被弹出系统栈func_A栈帧中返回地址被“露”在栈顶此时处理器按照这个返回地址重新跳到func_A代码区中执行


在func_A返回时func_A栈帧被弹出系统栈栈帧中返回地址被“露”在栈顶此时处理器按照这个返回地址跳到代码区中执行


题外话:在实际运行中并不是第个被被装入内存前还有些其他操作图4.1.4只是栈在过程中所起作用示意图



  • 篇文章: 4.1.4 寄存器和栈帧

  • 篇文章: 4.1.2 栈和系统栈
  • Tags:  js调用函数 调用读函数readdat matlab函数调用 函数调用

    延伸阅读

    最新评论

    发表评论