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只是栈在过程中所起作用示意图
最新评论