序言和附文
序言和附文用于函数,包括设置函数入口上的寄存器和恢复函数出口上的寄存器。
可以将序言和附文用于函数,包括在函数入口上设置寄存器和在函数出口上恢复寄存器。
未指定表示函数序言和表的预先确定的代码序列。 但是,必须在特定条件下执行某些操作。 下图显示了堆栈帧布局。

典型函数的执行堆栈为:
- Prolog 操作
- 功能主体
- 附日志操作
"Prolog 操作" 和 "Epilog 操作" 表显示了 prolog 和 Epilog 所需的条件和操作。
| 如果: | 过去: |
|---|---|
| 使用任何非易失性 FPRs (FPR14:FPR31) | 将它们保存在 FPR 保存区域 (上图中的区域 4) 中。 |
| 使用任何非易失性 GPRS (GPR13:GPR31) | 将它们保存在 GPR 保存区域 (上图中的区域 5) 中。 |
| LR 用于非叶过程 | 在调用者函数 SP 的偏移量 8 处保存 LR。 |
| 使用任何非易失性条件寄存器 (CR) 字段。 | 将 CR 保存在来自调用者函数 SP 的偏移量 4 处。 |
| 需要新的堆栈帧 | 获取堆栈帧,并按填充的帧大小 (如果需要) 将 SP 减小到 16 的倍数,以获取新的 SP 并将调用者的 SP 从新的 SP 中保存在偏移量 0 处。 |
| 如果: | 过去: |
|---|---|
| 已保存任何非易失性 FPR | 复原已使用的 FPR。 |
| 已保存任何非易失性 GPRs | 复原已保存的 GPRs。 |
| 由于调用了非叶过程,因此变更了 LR | 恢复 LR。 |
| CR 已变更 | 复原 CR。 |
| 已获取新堆栈 | 将旧 SP 恢复为其在输入时具有的值 (调用者的 SP)。 返回到调用者。 |
虽然 PowerPC® 体系结构提供了针对 GPRs 的负载和存储多个指令,但它不鼓励使用这些指令,因为在某些机器上实现这些指令可能不是最佳的。 事实上,在未来的一些实现上使用 load 和 store 多个指令可能比单字 load 或 store 的等效系列要慢得多。 但是,将许多 FPR 或 GPRs 与单个加载或存储指令一起保存在函数序言或附文中会导致代码大小增加。 因此,系统环境必须提供可从函数 prolog 和表日志调用的例程,这些例程将执行 FPRs 和 GPRs 的保存和复原。 提供了这些例程的接口,它们的源代码以及一些 prolog 和 Epilog 代码序列。
如堆栈帧布局中所示, GPR 保存区域不是来自调用者 SP 或被调用者 SP 的固定位置。 FPR 保存区域从固定位置开始,直接位于进入该被调用者的 SP (较低地址) 上方,但 GPR 保存区域的位置取决于保存的 FPR 数。 因此,很难编写使用 SP 的固定位移的通用 GPR 节省函数。
如果例程需要同时保存 GPRs 和 FPR ,请使用 GPR12 作为用于保存和复原 GPRs 的指针。 (GPR12 是易失性寄存器,但不包含输入参数。) 这将生成多寄存器保存和复原例程的定义,每个例程保存或复原 m FPR 和 n GPRs。 这是通过对包含多个入口点 (每个寄存器号一个) 的特别提供的例程执行 bla (分支和链接绝对) 指令来实现的,从最低非易失性寄存器开始。
- 没有用于保存和恢复大于 29 的 GPR 和 FPR 号的入口点。 与调用保存和恢复功能相比,在序言中保存少量寄存器的效率更高。
- 如果在以下代码段中未保存或复原 LR ,那么语言处理器必须根据需要执行保存和复原。
语言处理器必须使用专有方法在函数调用中保存非易失性寄存器的值。
系统环境必须提供三组保存和复原例程。 这些例程是:
- 一对例程,用于在未保存和复原 FPR 时保存和复原 GPRs。
- 一对例程,用于在保存和复原 FPR 时保存和复原 GPRs。
- 用于保存和复原 FPR 的一对例程。