ZHCUAQ1F july 2015 – april 2023
一个函数(父级函数)在调用另一个函数(子级函数)时会执行以下任务。
一个函数(父级函数)在调用另一个函数(子级函数)时会执行以下任务:
如果将参数传递给函数,则最多将前十个参数放置在寄存器 A4、B4、A6、B6、A8、B8、A10、B10、A12 和 B12 中。如果传递 long、long long、double 或 long double,它们将被放置在寄存器对 A5:A4、B5:B4、A7:A6 中,依此类推。
C6600 __x128_t 类型对象与 64 位或 128 位边界对齐。(请参阅节 8.6.2中的注释。)但是,对于 C6600,如果传递了多个 __x128_t 参数,则下一个 __x128_t 参数将在第一个可用四通道中传递,其中可用四通道列表的顺序如下:A7:A6:A5:A4、B7:B6:B5:B4、A11:A10:A9:A8、B11:B10:B9:B8。如果没有更多可用的四通道,则 __x128_t 进入堆栈。即使较早的 __x128_t 参数已放置在堆栈上,后续的 32 位、40 位或 64 位参数也可以采用第一个可用的寄存器或寄存器对。
所有其余的参数都放在堆栈上(也就是说,假设 C6600 没有传递 __x128_t,堆栈指针指向下一个空闲位置;SP + 偏移指向第十一个参数,依此类推)。放置在堆栈上的参数必须与适合其大小的值对齐。未在原型中声明且大小小于 int 大小的参数作为 int 传递。如果没有声明原型,则 float 类型参数将作为 double 型传递。
结构体参数作为结构体的地址传递。由被调用函数来创建本地副本。
对于使用省略号声明的函数,表示该函数是用不同数量的参数调用的,相关惯例略有修改。最后一个显式声明的参数在堆栈上传递,因此其栈地址可以作为访问未声明参数的引用。
图 8-10显示了寄存器参数惯例。