TI中文支持网
TI专业的中文技术问题搜集分享网站

c6748中,编译器对函数返回地址的保存问题

ccs版本为8.20,在《TMS320C6000 Optimizing Compiler v8.2.x – User's Guide》的8.4.2中有这样一段描述:

2. If the called function calls any other functions, the return address must be saved on the stack.
Otherwise, it is left in the return register (B3) and is overwritten by the next function call.

我理解为,当发生函数调用时,要先把B3寄存器入栈,保存当前函数的返回地址,B3用来继续保存被调用函数的返回地址。

但是我在实际观察时发现,有的时候,在发生函数调用之前,编译器不会将B3入栈,而是将B3保存到除child寄存器(A10~A15,B10~B15)的其他寄存器中,如A0,A9,A31等。

我的问题是,编译器的这种行为,是否有文档支持,我没有找到相关文档支持的佐证。如果有的话,使用寄存器保存B3的使用规则是什么,是否会在文档中一并给出。或者是需要配置编译器的选项,才能保证所有的函数调用都将B3入栈。

谢谢。

 

 

 

 

Shine:

您举的例子有没有在程序中save B3? 默认return address是保存到B3,如果被调用的函数再调用其他函数的话,需要手动把B3寄存器里的return address存到stack里,否则会被后面再调用的其他函数的return address覆盖掉。

杨旭:

回复 Shine:

我写的是C代码,上图的汇编代码这是ccs编译器生成的,没有使用栈区保存B3,而是A30,函数返回也是返回A30中的地址。和编译器手册中的描述不一致。

杨旭:

回复 Shine:

我写的是C代码,上图的汇编代码这是ccs编译器生成的,没有使用栈区保存B3,而是A30,函数返回也是返回A30中的地址。和编译器手册中的描述不一致。

Tony Tang:

回复 杨旭:

比较一下加优化选项,与不加优化选项产生的这部分汇编代码是否有区别。

杨旭:

回复 Tony Tang:

优化等级配置如上所示,Optimize for code size项的所有等级都试了,结果一致。速度优化没试,感觉开速度优化的话编译器会更加倾向使用寄存器来保存B3。

我的疑问是,为什么编译器对c代码的处理和手册中描述的不一致,是否还有一份更加详细的手册,详细描述B3寄存的在各个优化等级和各个编译配置下的详细保存规则?下图为《TMS320C6000 Optimizing Compiler v8.2.x User's Guide》的说法

Tony Tang:

回复 杨旭:

继续在你的贴子上按他的要求提供测试例程。

或者也可以换一个版本的编译器试试结果是否有区别。

赞(0)
未经允许不得转载:TI中文支持网 » c6748中,编译器对函数返回地址的保存问题
分享到: 更多 (0)