调用/返回代码序列的要求 数据方面 能够把参数正确地传递给被调用者 能够把返回值传递给调用者 控制方面 能够正确转到被调用过程的代码开始位置 能够正确转回调用者的调用位置(的下一条指 令 啁用代码序列和活动记录的布局相关
调用/返回代码序列的要求 • 数据方面 – 能够把参数正确地传递给被调用者 – 能够把返回值传递给调用者 • 控制方面 – 能够正确转到被调用过程的代码开始位置 – 能够正确转回调用者的调用位置(的下一条指 令) • 调用代码序列和活动记录的布局相关
活动记录的布局原则 ·调用者和被调用者之间 实在参数 传递的值放在被调用者 活动记录的开始位置 返回值 ·固定长度的项放在中j 位置 控制链 控制链、访问链、机器 状态字段 访问链 早期不知道大小的项在 活动记录尾部 保存的机器状态 栈顶指针( top sp)通常 指向固定长度字段的末 局部数据 端 临时变量
活动记录的布局原则 • 调用者和被调用者之间 传递的值放在被调用者 活动记录的开始位置 • 固定长度的项放在中间 位置 – 控制链、访问链、机器 状态字段 • 早期不知道大小的项在 活动记录尾部 • 栈顶指针(top_sp)通常 指向固定长度字段的末 端
调用代码序列的例子 Calling sequence 啁用者计算实在参数的值 将返回地址和原 .top sp存放到被调用者的活动记录 中。调用者增加tp_sp的值(越过了局部数据、临 时变量、被调用者的参数、机器状态字段) 被调用者保存寄存器值和其他状态字段 被调用者初始化局部数据、开始运行。 Return sequence 被调用者将返回值放到和参数相邻的位置 恢复 top sp和寄存器,跳转到返回地址
调用代码序列的例子 • Calling sequence – 调用者计算实在参数的值 – 将返回地址和原top_sp存放到被调用者的活动记录 中。调用者增加top_sp的值(越过了局部数据、临 时变量、被调用者的参数、机器状态字段) – 被调用者保存寄存器值和其他状态字段 – 被调用者初始化局部数据、开始运行。 • Return sequence – 被调用者将返回值放到和参数相邻的位置 – 恢复top_sp和寄存器,跳转到返回地址
调用者/被调用者的话动记录 参数和返回值 控制链 调用者的 链接和被保存的状态 活动记录 临时变量和局部数据 调用者 的职责 参数和返回值 控制链 被调用者的 链接和被保存的状态 活动记录 top_sp 被调用者 临时变量和局部数据 的职责 图7-7调用者和被调用者之间的任务划分
调用者/被调用者的活动记录
栈中的变长教据 如果数据对象的 生命期局限于过 控制链和被保存的状态 程活动的生命期 指向a的指针 P的活动记录 就可以分配在远 指向b的指针 指向c的指针 行时刻栈中。 变长数组也可 数组a 以放在栈中 数组b P的数组 top指向实际的 数组c 栈顶 ° top sp用于寻找tm2 控制链和被保存的状态 被P调用的过程 q的活动记录 顶层记录的定长 字段 q的数组 top 图7-8访问动态分配的数组
栈中的变长数据 • 如果数据对象的 生命期局限于过 程活动的生命期, 就可以分配在运 行时刻栈中。 – 变长数组也可 以放在栈中 • top指向实际的 栈顶 • top_sp用于寻找 顶层记录的定长 字段