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