ZHCADC4A September 2011 – March 2014
函数的前 10 个实参在寄存器中传递。实参按声明的顺序分配给以下序列中的寄存器(在四倍字寄存器中传递的实参除外):
A4、B4、A6、B6、A8、B8、A10、B10、A12、B12 |
大小在 32 位到 64 位之间的实参在寄存器对中传递,其中使用先前列表中的偶数寄存器传递其最低有效部分,而使用相应的奇数寄存器传递其最高有效部分。例如,在以下示例中,“a”在 A4 中传递,而“b”在 B5:B4 中传递:
func1(int a, double b);
float complex 类型的实参在寄存器对中传递。顺序取决于字节序。在小端字节序模式下,实部在偶数寄存器中传递,虚部在奇数寄存器中传递。对于大端字节序模式,此顺序相反。
double complex 类型的实参在四倍字寄存器中传递,并使用以下列表中的第一个可用四倍字:A7:A6:A5:A4、B7:B6:B5:B4、A11:A10:A9:A8、B11:B10:B9:B8。在小端字节序模式下,实部在编号较小的对(例如 A5:A4)中传递,而虚部在编号较大的对 (A7:A6) 中传递。对于大端字节序模式,此顺序相反。四倍字寄存器实参绕过的任何寄存器都可用于后续实参。例如,在以下函数中,“w”在 A4 中传递,“x”在 B4 中传递,“y”在 A11:A10:A9:A8 中传递,而“z”回填到 A6 中:
func2(int w, int x, double complex y, int z);
所有其余的实参都以递增的地址(从 SP+4 开始)放置在堆栈上。每个实参都放置在下一个与其类型正确对齐的可用地址处。因此,如果第一个堆栈实参需要 64 位对齐,则其地址将为 SP+8。
在 C++ 中,this 指针作为隐式第一个实参传递给 A4 中的非静态成员函数。
大小为 64 位或更小的结构体和联合体在寄存器或堆栈上通过值传递,如下表所述。大于 64 位的结构体和联合体通过引用传递,如节 3.5所述。
任何未在寄存器中传递的实参都会以递增的地址(从 SP+4 开始)放置在堆栈上。每个实参都放置在下一个可用地址处,并根据其类型正确对齐,但需考虑以下其他因素:
请注意,SP+4 不是 8 字节对齐,因此如果第一个实参需要 8 字节对齐,它将存储在存储器的 SP+8 处。
对于可变实参的 C 函数(即,用省略号声明,表明它是使用不同数量的实参调用的函数),最后一个显式声明的实参和所有剩余的实参都在栈上传递,以便其栈地址可以作为访问未声明实参的参考。
根据 C 语言,小于整数值的可变实参函数的未声明标量实参被提升为整数值并作为整数值传递。