编译原理与技术[003]
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3
运行时内存划分
代码段 静态数据区 栈(stack)
大小可以静态确定 全局/局部静态变量 活动记录栈
堆(heap)
动态分配的数据
2020/12/4
《编译原理与技术》-运行环境
4
活动记录
活动记录-AR (Activation Record) 是一连续存储区域,用于管理与存放和程序 单元执行相关的重要信息。
2020/12/4
《编译原理与技术》-运行环境
10
e.g.1 FORTRAN静态存储分配
CALL sub
SUBROUTINE sub
CALL sub END
DATA I/10 WRITE(*.*) I
第一次调用前 机器状态
I = 100
I ( 10 )
END 第一次调用sub,输出10
第一次调用后 机器状态
2020/12/4
《编译原理与技术》-运行环境
6Hale Waihona Puke Baidu
活动记录的内容
返回值(return value) 实在参数(actual parameter) 控制链(control link)
可选的访问链(optional access/static link)
机器状态(saved machine status) 局部数据(local data) 临时区(temporaries)
编译原理与技术
运行环境
2020/12/4
《编译原理与技术》-运行环境
1
运行环境
存储组织与分配
程序单元、运行时内存划分与活动记录 静态/动态存储分配 动态栈式的过程调用/返回 非局部名字的访问
参数传递
参数传递的方式及其实现
2020/12/4
《编译原理与技术》-运行环境
2
存储组织与分配
mov bp,sp spbp
pop bp
//恢复调用者A的bp
ret
// B执行结束并返回
注:X86-Linux中的leave 和ret组合亦能达到目的。
至此,B的AR中除了参数/返回值区域,其余区域全部 回收(撤销)了。
I ( 100 )
第二次调用sub,输出100
第二次调用后 机器状态
I ( 100 )
2020/12/4
《编译原理与技术》-运行环境
11
动态存储分配
栈式分配 - AR在过程被调用(激活)时才在栈 (stack)上分配;而在被调用过程(返回) 终止时从栈上撤销。 - 过程中(非静态)局部变量的存储绑定在 过程执行时有效;过程终止时失效。 - 支持过程递归调用。每次递归调用时,局 部变量绑定到不同的存储。
2020/12/4
《编译原理与技术》-运行环境
12
动态存储分配
栈式分配下的AR内容布局
高地址
返回值 实在参数
可选的访问链
参数/返回值区域放在AR 高端-靠近调用者过程的 活动记录,既便于双方存 取,又适应参数可变情况
返回地址
bp
调用者 bp
长度固定的区 域放在AR中间
可选机器状态
低地址
局部数据
栈顶sp 临时区
程序单元 -FORTRAN的子例程(subroutine) -PASCAL的过程/函数(procedure/function) -C的函数
程序单元的激活(调用)与终止(返回) 程序单元的执行需要:
代码段+活动记录(程序单元运行所需的额 外信息,如参数,局部数据,返回地址等)
2020/12/4
《编译原理与技术》-运行环境
长度可变的区 域放在AR低端
2020/12/4
《编译原理与技术》-运行环境
13
栈式分配下的过程调用与返回
- 过程调用:分配被调过程的AR并填入相关信息, 然后程序控制转移到被调过程入口;
-过程A 调用 过程B 的过程调用序列:
A的“调用”准备操作:1)~ 3)
1)A 计算实在参数并放入(对应栈操作-push) B的活动记录中;(亦可考虑返回值存放空间)
2)A将可选的访问链放入(push)B的活动记录;
3)A将返回地址放入B的活动记录并跳转到过程B 的代码入口,开始B的执行;(一般通过A中的 代码指令-“call B” 来完成这一步)
4)
2020/12/4
《编译原理与技术》-运行环境
14
栈式分配下的过程调用与返回 -过程A 调用 过程B 的过程调用序列: B的入口代码:4)~ 6) 4)在B自己的AR中保存A的活动记录的基址
AR中的内容 - 临时区域。用以保存临时计算结果
- 局部数据区。源程序中程序单元声明的局 部变量对应在此区域。
- 机器状态保存区。存有机器的寄存器,程 序指令计数器 ip(返回地址)等。
2020/12/4
《编译原理与技术》-运行环境
5
活动记录
AR中的内容 - 访问链(静态链)。当前程序单元可以访 问的(静态程序中)外围程序单元的活动记 录链。 - 控制链(动态链)。程序单元的活动记录 按它们的生成(或调用)次序串成链。 - 实在参数 - 返回值
d1、d2谁正谁负?
bp
机器状态
偏移d2 局部数据
临时区
地址: bp+d2
2020/12/4
《编译原理与技术》-运行环境
9
静态存储分配
- 全局变量的存储绑定、AR均在编译时确定 且在整个程序执行中保持。
- 不支持: 1)动态数据结构 2)过程递归调用
- 实现静态分配的语言: (早期)FORTRAN
2020/12/4
《编译原理与技术》-运行环境
15
栈式分配下的过程调用与返回
- 过程返回:回收分配的被调过程的AR,并将程 序控制转移回调用过程继续执行;
-过程A 调用 过程B 的过程返回序列:
B的出口代码:1)~ 2)
1)B回收局部数据空间;恢复原先保存的机器状态 2)B恢复A的AR基址;取出返回地址将程序控制交 回到A。对应操作:
2020/12/4
《编译原理与技术》-运行环境
7
活动记录内容的存取
AR的基地址bp
返回值 实在参数 控制链 (old bp)
可选的访问链
机器状态 局部数据 临时区
2020/12/4
《编译原理与技术》-运行环境
8
活动记录内容的存取
返回值
地址:
实在参数
bp+d1
偏 移
控制链(old bp)
d1
可选的访问链
(即当前bp,对应操作 push bp)并且将这 个位置作为B自己AR的基址(对应操作)
mov sp,bp 即 bpsp) 5)保存可选的机器状态(寄存器) 6)为局部数据分配空间,(对应操作) sub local_size,sp,即sp sp – local_size 7)“开始”B的执行。(至此,B的AR建好)