堆栈区域
堆栈布局分为八个区域,编号为 1 到 8 ,从图的底部到图的顶部。
为了方便起见,堆栈布局已划分为 8 个区域,编号为 1 到 8 ,从图的底部 (高地址) 到图的顶部 (低地址)。 当调用 捕获器 函数时,发送方的堆栈指针指向区域 3 的顶部,这也是 捕获器 函数在进入其序言时使用的相同 SP 值。 以下是堆栈区域的描述,从图的底部 (区域 1) 开始,向上移动到顶部 (区域 8):
- 区域 1: 发件人的局部变量区域
区域 1 是 sender 函数的局部变量区域,包含此函数所需的所有局部变量和临时空间。
- 区域 2: 发送方的输出参数区域区域 2 是 sender 函数的输出参数区域。 此区域至少有 8 个字大小,必须是双字对齐的。 调用者 ( sender 函数) 不使用前八个词,因为它们的相应值直接放在自变量寄存器 (GPR3:GPR10) 中。 保留存储器,以便如果被调用者 ( 捕获器 函数) 采用其任何参数的地址,那么可以将 GPR3:GPR10 中传递的值存储在其地址位置 (分别为PW1:PW8) 中。 如果 sender 函数正在将 8 个以上的自变量传递给 捕获器 函数,那么它必须为多余的参数预留空间。 超出的参数必须存储为寄存器映像,超过从 sender 函数的 SP 值偏移 56 处开始的八个保留字。注: 此区域也可能由语言处理器使用,并且在对其他功能的调用中易失。
- 区域 3: 发送方的链接区域
区域 3 是 sender 函数的链接区域。 此区域由六个单词组成,并且在调用 捕获器 函数时与 sender 函数的 SP 偏移 0。 此区域中的某些字段由 捕获器 函数用作其序言代码的一部分,这些字段在 "运行时堆栈" 图中进行了标记,并在下面进行了说明。
第一个字是 后链, sender 函数在修改 SP 之前保存其调用者的 SP 值的位置。 第二个字 (位于偏移量 4 处) 是 捕获器 函数可以保存 CR 的位置 (如果它修改了任何非易失性 CR 字段)。 第三个字 (偏移量 8) 是 捕获器 函数可以保存 LR (如果 捕获器 函数进行任何调用) 的位置。
第四个词保留给编译器,第五个词由绑定程序生成的指令使用。 链接区域 (偏移 20) 中的最后一个字是由全局链接 (glink) 接口例程保存 TOC 区域寄存器的位置。 当执行模块外调用时 (例如,调用共享库函数时) ,会发生此情况。
- 区域 4: 捕获器的浮点寄存器保存区域
区域 4 是被调用者 ( 捕获器 函数) 的浮点寄存器保存区域,并且是双对齐的。 它表示保存被调用程序 ( 捕获器 函数) 使用的所有非易失性 FPR 所需的空间。 FPR 保存在链接区域 (位于较低地址) 的正上方,从 sender 函数的 SP 负位移。 此区域的大小从 0 到最大 144 字节不等,具体取决于要保存的 FPR 数 (最大数量为 18 个 FPRs * 8 个字节)。
- 区域 5: 捕获器的通用寄存器保存区域
区域 5 是 捕获器 函数的通用寄存器保存区域,并且至少与字对齐。 它表示被调用程序 ( 捕获器 函数) 保存所有非易失性 GPRs 所需的空间。 GPRs 保存在 FPR 保存区域 (位于较低地址) 的正上方,位于与 sender 函数的 SP 的负位移处。 此区域的大小从零到最大 76 字节不等,具体取决于要保存的 GPRs 数 (最大数目为 19 GPRs * 4 字节)。
注意:- 无堆栈叶过程不进行调用,并且不需要局部变量区域,但它可能使用非易失性 GPRs 和 FPRs。
- 保存区域由 FPR 保存区域 (4) 和 GPR 保存区域 (5) 组成,两者的最大组合大小为 220 字节。 当前正在执行的函数的堆栈层位于比 SP 中的值小 220 字节处。 SP 中的值与堆栈层之间的区域是无堆栈叶函数可以在不获取其自己的堆栈的情况下使用的最大保存区域。 函数可以将此区域用作临时空间,此空间在对其他函数的调用之间易变。 执行元素 (例如,中断处理程序和绑定程序插入的代码) 不能被编译的代码视为调用,不能使用此区域。
系统定义的堆栈层包含最大可能的保存区域。 保存区域大小的公式为:18*8 (for FPRs) + 19*4 (for GPRs) = 220 - 区域 6: Catcher 的局部变量区域
区域 6 是 捕获器 函数的局部变量区域,包含此函数所需的局部变量和临时空间。 捕获器 函数使用自己的 SP (指向区域 8 的顶部) 作为基本寄存器来寻址此区域。
- 区域 7: 捕获器的输出参数区域区域 7 是 捕获器 函数的输出参数区域,大小至少为 8 个词,必须双字对齐。 调用者 ( 捕捉器 函数) 不使用前八个词,因为它们的相应值直接放在自变量寄存器中 (GPR3:GPR10)。 将保留该存储器,以便如果 捕获器 函数的被调用者获取其任何参数的地址,那么可以将 GPR3:GPR10 中传递的值存储在其地址位置中。 如果 捕获器 函数将超过 8 个自变量传递给其被调用者 (分别为PW1:PW8) ,那么必须为多余的参数预留空间。 超出的参数必须存储为寄存器映像,超出从 捕获器 函数的 SP 值偏移 56 处开始的八个保留字。注: 此区域也可以由语言处理器使用,并且在对其他函数的调用之间具有易失性。
- 区域 8 :Catcher 的链接区域
区域 8 是 捕获者 函数的链接区域,并且包含与 发送方 函数的链接区域 (区域 3) 中的字段相同的字段。