ZHCADC5A June 2013 – June 2020
对于 MSP430 和 MSP430X,为了提高效率,编译器会对采用两个 64 位实参(“long long int”和“double”算术)的某些编译器辅助函数使用特殊的调用约定。
在这种特殊情况下,编译器允许两个四倍字寄存器用于实参传递:R8::R11 和 R12::R15。这是 R8 到 R11 用作实参寄存器的唯一情况。第一个实参在 R8::R11 中传递,第二个实参在 R12::R15 中传递。像往常一样,返回值位于 R12::R15 中。
有关使用修改版约定的辅助函数,请参阅节 6.3。
MSP430 和 MSP430X 示例:
C 源代码
long long a1, a2;
long long func(void)
{
return a1 / a2;
}
以小代码、小数据模型编译:
func:
PUSH.W R10; R10 is caller-saved!
PUSH.W R9 ; R9 is caller-saved!
PUSH.W R8 ; R8 is caller-saved!
MOV.W &a1+0,R8
MOV.W &a1+2,R9
MOV.W &a1+4,R10
MOV.W &a1+6,R11
MOV.W &a2+0,R12
MOV.W &a2+2,R13
MOV.W &a2+4,R14
MOV.W &a2+6,R15
CALL #__mspabi_divlli
BR #__mspabi_func_epilog_3