■栈式分配下的过程调用与返回 过程返回:回收分配的被调过程的AR,并将程 序控制转移回调用过程继续执行; 过程A调用过程B的过程返回序列: B的出口代码:1)~2) 1)B回收局部数据空间;恢复原先保存的机器状态 2)B恢复A的AR基址;取出返回地址将程序控制交 回到A。对应操作: mov bp, sp sp<bp pop bp ∥恢复调用者A的bp ret ∥B执行结束并返回 注:X86- Linux中的 lleave和ret组合亦能达到目的 至此,B的AR中除了参数/返回值区域,其余区域全部 回收(撤销)了。 2021/2/8 《编译原理与技术》一运行环境 16
2021/2/8 《编译原理与技术》-运行环境 16 栈式分配下的过程调用与返回 - 过程返回:回收分配的被调过程的AR,并将程 序控制转移回调用过程继续执行; -过程A 调用 过程B 的过程返回序列: B的出口代码:1)~ 2) 1)B回收局部数据空间;恢复原先保存的机器状态 2)B恢复A的AR基址;取出返回地址将程序控制交 回到A。对应操作: mov bp,sp spbp pop bp //恢复调用者A的bp ret // B执行结束并返回 注:X86-Linux中的leave 和ret组合亦能达到目的。 至此,B的AR中除了参数/返回值区域,其余区域全部 回收(撤销)了
■栈式分配下的过程调用与返回 过程A调用过程B的过程返回序列 A的“调用”善后代码:3)~4) 3)A取回返回值以及引用型参数(有的话) 4)A调整栈顶sp(主要根据参数个数以及可 能有的访问链和可能有的返回值)。对应操 作: add para size, sp Esp<sp+ para size 至此,B的AR区域全部回收(撤销)了 2021/2/8 《编译原理与技术》一运行环境 17
2021/2/8 《编译原理与技术》-运行环境 17 栈式分配下的过程调用与返回 -过程A 调用 过程B 的过程返回序列: A的“调用”善后代码:3)~ 4) 3)A取回返回值以及引用型参数(有的话) 4)A调整栈顶sp(主要根据参数个数以及可 能有的访问链和可能有的返回值)。对应操 作: add para_size, sp 即spsp + para_size 至此,B的AR区域全部回收(撤销)了
eg2栈式存储分配 有C程序如下 void goi int a; a=10; 1 void ho i int a; a=100; g0: 1 maino i int a=1000; h(: y 2021/2/8 《编译原理与技术》一运行环境 18
2021/2/8 《编译原理与技术》-运行环境 18 e.g.2 栈式存储分配 有C程序如下: void g() { int a ; a = 10 ; } void h() { int a ; a = 100; g(); } main() { int a = 1000; h(); }
eg2栈式存储分配 过程g被调用时,活动记录栈的(大致)内容 返回地址 old bp main程序的AR a:1000 返回地址 old bp 函数h的AR a:100 返回地址 bp old bp 函数g的AR 10 2021/2/8 《编译原理与技术》一运行环境 19
2021/2/8 《编译原理与技术》-运行环境 19 过程g被调用时,活动记录栈的(大致)内容 e.g.2 栈式存储分配 返回地址 old bp a : 1000 main程序的AR 返回地址 old bp a : 100 函数h的AR 返回地址 old bp a : 10 bp 函数g的AR sp
eg.3有参函数的活动记录 参数b file " arc void func( int a, int b text 参数 globl func d type func, @function 返回地址 func d =b 老bp pushl %ebp mov %esp, %ebp 局部变量c bp-4 subl $8, %esp mov 8(%ebp),%eax 局部变量d mov %eax, -4(%ebp) mov 12(%ebp),%eax mov %eax,-8(%ebp) leave 2021/2/8 《编译原理与技术》一运行环境
2021/2/8 《编译原理与技术》-运行环境 20 e.g.3 有参函数的活动记录 void func( int a , int b ) { int c , d; c = a; d = b; } bp bp+8 bp+12 bp-4 bp-8 参数 b 参数 a 返回地址 老bp 局部变量c 局部变量d .file "ar.c" .text .globl func .type func,@function func: pushl %ebp movl %esp, %ebp subl $8, %esp movl 8(%ebp), %eax movl %eax, -4(%ebp) movl 12(%ebp), %eax movl %eax, -8(%ebp) leave ret