ZHCADC4A September 2011 – March 2014
C6000 至少有 32 个通用 32 位寄存器。寄存器可以包含整数、浮点值或指针。通用寄存器分为两个寄存器文件,指定为 A 和 B。
B15 指定为栈指针 (SP)。栈指针必须始终在 2 字(8 字节)边界上保持对齐。SP 指向低于(小于)当前分配栈的第一个对齐地址(请参阅节 4.3)。
B14 指定为数据页指针 (DP)。它指向当前活动对象的数据段的开头。
ABI 不指定专用的帧指针 (FP) 寄存器。不过在某些情况下,TI 编译器使用 A15 作为帧指针。
GCC 支持词法嵌套函数作为语言扩展。该实现使用一个寄存器(即,静态链寄存器)为子函数提供父函数的激活上下文。寄存器的选择在很大程度上取决于工具链,除非以某种方式(例如由蹦床函数)调解调用。因此,ABI 指定 A2 作为静态链寄存器的推荐选择。调用约定通过将 A2 包含为函数链接所含的一个寄存器来支持此指定,要求在调用点和被调用者的入口点之间保留其值。
ABI 将 A10-A15 和 B10-B15 指定为被调用者保存 寄存器。也就是说,需要由被调用的函数保留上述寄存器,确保其在从函数返回时具有与调用时相同的值。请注意,该组包括 SP (B15) 和 DP (B14)。
此外,ILC 和 RILC 是被调用者保存的寄存器。这些是 C64+ 的 SPLOOP 机制使用的控制寄存器。
所有其他寄存器都是调用者保存 寄存器。也就是说,这些寄存器不会在调用中保留,因此如果调用后需要它们的值,调用者负责保存和恢复它们的内容。
地址模式寄存器 (AMR) 是用户可写的控制寄存器,可实现循环寻址。在函数调用边界处,AMR 的位 0-15 必须为 0,以便禁用循环寻址。
表 3-1 列出了寄存器及其在 ABI 中的作用。
寄存器 | 别名 | 由被调用者保留 | 在调用惯例中的作用 |
---|---|---|---|
A0 | 否 | ||
A1 | 否 | ||
A2 | 否 | 嵌套函数的静态链寄存器 | |
A3 | 否 | 通过引用返回结构体的地址 | |
A4 | 否 | 第一个实参;返回值 (LSW) | |
A5 | 否 | 第一个实参;返回值 (MSW) | |
A6 | 否 | 第三个实参 (LSW) | |
A7 | 否 | 第三个实参 (MSW) | |
A8 | 否 | 第五个实参 (LSW) | |
A9 | 否 | 第五个实参 (MSW) | |
A10 | 是 | 第七个实参 (LSW) | |
A11 | 是 | 第七个实参 (MSW) | |
A12 | 是 | 第九个实参 (LSW) | |
A13 | 是 | 第九个实参 (MSW) | |
A14 | 是 | ||
A15 | FP | 是 | 帧指针 |
A16-A31 | 否 | ||
B0 | 否 | 延迟绑定的动态重定位偏移实参;请参阅节 15.6 | |
B1 | 否 | 延迟绑定的动态重定位偏移实参;请参阅节 15.6 | |
B2 | 否 | ||
B3 | 否 | 返回地址 | |
B4 | 否 | 第二个实参 (LSW) | |
B5 | 否 | 第二个实参 (MSW) | |
B6 | 否 | 第四个实参 (LSW) | |
B7 | 否 | 第四个实参 (MSW) | |
B8 | 否 | 第六个实参 (LSW) | |
B9 | 否 | 第六个实参 (MSW) | |
B10 | 是 | 第八个实参 (LSW) | |
B11 | 是 | 第八个实参 (MSW) | |
B12 | 是 | 第十个实参 (LSW) | |
B13 | 是 | 第十个实参 (MSW) | |
B14 | DP | 是 | 数据页指针 |
B15 | SP | 是 | 栈指针 |
B16-B29 | 否 | ||
B30-B31 | 否! | 蹦床函数暂存寄存器;请参阅节 3.7 |