eg.1 FORTRAN静态存储分配 CALL Sub SUBROUTINE sub CALL sub DATA 10 第一次调用前 END WRITE( )I 机器状态 =100 (10) END 第一次调用后 第一次调用sub,输出10 「机器状态 l(100) 第二次调用sub,输出100 第二次调用后 机器状态 (100) 2021/2/8 《编译原理与技术》一运行环境 11
2021/2/8 《编译原理与技术》-运行环境 11 CALL sub SUBROUTINE sub CALL sub DATA I/10 END WRITE(*.*) I I = 100 END 第一次调用sub,输出10 第二次调用sub,输出100 e.g.1 FORTRAN静态存储分配 机器状态 I ( 10 ) 机器状态 I ( 100 ) 第一次调用前 第一次调用后 机器状态 I ( 100 ) 第二次调用后
动态存储分配 栈式分配 AR在过程被调用(激活)时才在栈 ( stack)上分配;而在被调用过程(返回) 终止时从栈上撤销 过程中(非静态)局部变量的存储绑定在 过程执行时有效;过程终止时失效 支持过程递归调用。每次递归调用时,局 部变量绑定到不同的存储。 2021/2/8 《编译原理与技术》一运行环境 12
2021/2/8 《编译原理与技术》-运行环境 12 动态存储分配 栈式分配 - AR在过程被调用(激活)时才在栈 (stack)上分配;而在被调用过程(返回) 终止时从栈上撤销。 - 过程中(非静态)局部变量的存储绑定在 过程执行时有效;过程终止时失效。 - 支持过程递归调用。每次递归调用时,局 部变量绑定到不同的存储
动态存储分配 栈式分配下的AR内容布局 返回值 高地址 参数返回值区域放在AR 实在参数 高端一靠近调用者过程的 活动记录,既便于双方存 可选的访问链 取,又适应参数可变情况 返回地址 br 长度固定的区 调用者bp 域放在AR中间 可选机器状态 低地址 局部数据 长度可变的区 栈顶sp临时区 域放在AR低端 2021/2/8 《编译原理与技术》一运行环境 13
2021/2/8 《编译原理与技术》-运行环境 13 动态存储分配 栈式分配下的AR内容布局 返回值 实在参数 可选的访问链 返回地址 调用者 bp 可选机器状态 局部数据 临时区 bp 高地址 低地址 长度固定的区 域放在AR中间 长度可变的区 域放在AR低端 参数/返回值区域放在AR 高端-靠近调用者过程的 活动记录,既便于双方存 取,又适应参数可变情况 栈顶sp
栈式分配下的过程调用与返回 过程调用:分配被调过程的AR并填入相关信息, 然后程序控制转移到被调过程入口; 过程A调用过程B的过程调用序列: A的“调用”准备操作:1)~3) 1)A计算实在参数并放入(对应栈操作一push) B的活动记录中;(亦可考虑返回值存放空间) 2)A将可选的访问链放入(push)B的活动记录; 3)A将返回地址放入B的活动记录并跳转到过程B 的代码入口,开始B的执行;(一般通过A中的 代码指令-“calB”来完成这一步) 4) 2021/2/8 《编译原理与技术》一运行环境 14
2021/2/8 《编译原理与技术》-运行环境 14 栈式分配下的过程调用与返回 - 过程调用:分配被调过程的AR并填入相关信息, 然后程序控制转移到被调过程入口; -过程A 调用 过程B 的过程调用序列: A的“调用”准备操作:1)~ 3) 1)A 计算实在参数并放入(对应栈操作-push) B的活动记录中;(亦可考虑返回值存放空间) 2)A将可选的访问链放入(push)B的活动记录; 3)A将返回地址放入B的活动记录并跳转到过程B 的代码入口,开始B的执行;(一般通过A中的 代码指令-“call B” 来完成这一步) 4)
栈式分配下的过程调用与返回 过程A调用过程B的过程调用序列: B的入口代码:4)~6) 4)在B自己的AR中保存A的活动记录的基址 (即当前bp,对应操作 push bp)并且将这 个位置作为B自己AR的基址(对应操作) mov sp,bp即bp<sp) 5)保存可选的机器状态(寄存器) 6)为局部数据分配空间,(对应操作) sub local size,sp,即sp∈sp- local size 7)“开始”B的执行。(至此,B的AR建好 2021/2/8 《编译原理与技术》一运行环境 15
2021/2/8 《编译原理与技术》-运行环境 15 栈式分配下的过程调用与返回 -过程A 调用 过程B 的过程调用序列: B的入口代码:4)~ 6) 4)在B自己的AR中保存A的活动记录的基址 (即当前bp,对应操作 push bp)并且将这 个位置作为B自己AR的基址(对应操作) mov sp,bp 即 bpsp) 5)保存可选的机器状态(寄存器) 6)为局部数据分配空间,(对应操作) sub local_size,sp,即sp sp – local_size 7)“开始”B的执行。(至此,B的AR建好)