函数调用规则
定点C编译器也规定了一组严格的函数调用规则。除了特殊的运行支持函数外,任何调用C函数或被C函数所调用的函数都必须遵循这些规则,否则就会破坏C环境,造成不可预测的后果。
(一)参数传递
将参数传递给一个C函数时,必须遵循下列规则:
(1)函数调用前,将多数压入运行堆栈。。
(2)以逆序传递参数。也就是说。第一个参数(最左边)最后压栈,而最后一个参数(最右边)最先压栈。
(3)若参数是浮点数或长整型数,则低位字先压栈,高位字后压栈。
(4)传递结构时,采用多字方式。
(二)局部帧的产生
函数被调用时,编译器在运行栈中建立一个帧以存储信息。当前函数帧称为局部帧。C环境利用局部帧来保护调用者的有关信息、传递参数和生成局部变量。每调用一个函数,就建立一个新的帧。
上面已经介绍,寄存器AR1为SP,AR0为FP,SP指向栈顶,FP指向局部帧。编译器在建立局部帧时完成如下工作:
(1)从TMS320C2X/C5X的内部堆栈中弹出返回地址,并压人C运行堆栈。
(2)将旧的FP的内容压人C运行堆栈,并将FP设置为当前的SP。
(3)增加SP。增加的值等于需要保存的局部变量的字的个数加1,其中,额外的一个字位于帧的开始,用于存储临时变量。
(4)若函数使用AR6和AN7作为寄存器变量,则将它们的内容压人堆栈,然后装人相应局部变量的地址。
下面是完成上述工作的TMS320C2X的汇编程序,其中SIZE是局部帧的长度。
例2.1 调用函数时的初始处理
POPD * + ;将返回地址压人C堆栈
SAR AR0, * + ;保护旧FP
SAR AR1, *
LARK AR0, SIZE
LAR ARO, * 0 + ;FP= 旧的SP,SP=SP+ SIZE
SAR AR6,* + ;保护AR6
SAR AR7, * + ;保护AR7