ZHCADC4A September 2011 – March 2014
除前文特别指明的以外,辅助函数遵循标准调用约定。然而,典型的实现只需要可用寄存器的一小部分。如果调用者所使用的寄存器通常需要在调用过程中保留(即调用者保存寄存器),但已知辅助函数不会使用该寄存器,则调用者可以不保存该寄存器。因此,ABI 会按函数更改这些寄存器的命名,以便调用者无需不必要地保留未使用的寄存器。
请注意,从编译器的角度来看,使用此信息是可选项,仅提供优化的机会。从库实现者的角度来看,ABI 要求辅助函数的替代实现必须符合附加限制。
具有特殊寄存器约定的辅助函数不能通过 PLT 条目调用(请参阅节 6.5)。因此,它们的定义必须标记 STV_INTERNAL 或 STV_HIDDEN,防止它们可从共享库导入。
表 8-9 列出了那些具有修改后寄存器保存约定的辅助函数。如果此表中列出了某个函数,则给定的寄存器是调用该函数时唯一修改的寄存器。如果函数未列出,则它遵循标准规则。
函数 | 修改的寄存器 |
---|---|
_ _C6000_divi | A0、A1、A2、A4、A6、B0、B1、B2、B4、B5、B30、B31 |
_ _C6000_divu | A0、A1、A2、A4、A6、B0、B1、B2、B4、B30、B31 |
_ _C6000_remi | A1、A2、A4、A5、A6、B0、B1、B2、B4、B30、B31 |
_ _C6000_remu | A1、A4、A5、A7、B0、B1、B2、B4、B30、B31 |
_ _C6000_divremi | A1、A2、A4、A5、A6、B0、B1、B2、B4、B30、B31 |
_ _C6000_divremu | A0、A1、A2、A4、A6、B0、B1、B2、B4、B30、B31 |
_ _C6000_strasgi_64plus | A31、A30、B31、B30、ILC、RILC、B30、B31 |
_ _C6000_push_rts | A15、A3、B3、B30、B31 |
_ _C6000_pop_rts | B10、B11、B12、B13、B14、B30、B31 |
_ _C6000_call_stub | A3-A5、A8、A9、A16-A31、B8、B9、B16-B31、ILC、RILC |
B30 和 B31 视为会被任何调用修改,即使被调用者不使用它们也不例外。这样一来,它们就可以用作蹦床函数的暂存寄存器。请参阅节 3.7。