用C语言编写的代码中核心代码常常只是整个程序代码的5%,但是却占用了整个程序约95%的执行时间。对些核心代码采用汇编语言编写,可以大大提高代码的执行效率,而C语言程序可以象调用C程序的一个函数那样去调用这个汇编函数。为了实现C语言和汇编语言的混合编程,需要注意一些规定的接口规范和标准。
(1)采用C语言和汇编语言混合编程时,TMS320C62X定义了一套严格的寄存器规则。这个寄存器规则表明了编译器如何使用这些寄存器以及在函数调用过程中如何保护这些寄存器。
调用函数保护了寄存器A0~A9和B0~B9,这就使得在编写汇编程序的时候可以任意的使用这几个寄存器而不需保护它们。但当使用到寄存器A10~A15或B10~B15的时候,则必须自行对它们进行保护。长型、双精度型或者是长双精度型的数据对象要放在一个奇/偶寄存器对(如A1:A0)里,奇数寄存器存放着数据的符号位、指数位和最高有效位,而偶数寄存器则存放着低有效位。
在默认情况下,A3用作返回结构指针寄存器,B3用作被调用函数返回地址寄存器,A15用作帧指针寄存器,B14用作数据页指针寄存器,B15用作堆栈指针寄存器。这些寄存器在被调用的汇编函数中用到时都要进行保护。
(2)调用函数将数传递到被调用函数中,前十个参数将被从左到右依次放入寄存器A4、B4、A6、B6、A8、B8、A10、B10、A12和B12,如果传递的参数是长型、双精度型或者是长双精度型,则将参数依次放入寄存器组A5:A4、B5:B4、A7:A6等,并将剩下的变量按相反的顺序放在堆栈里。注意,如果传递的参数是一个结构类型的参数,则传递的是该结构类型的地址。
(3)如果在C/C++调用函数中做了正确的函数返回声明,则被调用的汇编函数可以返回有效值。如果返回值是整型或32位的浮点型,则放在寄存器A4中返回;如果返回值是双精度或是长双精度型,则放在A5:A4中返回;如果返回值是一个结构类型,则将其结构的地址放在A3中返回。
(4)编译器为所有的外部对象指定一个链接时的名字。当写汇编语言代码时,必须用与这个名字相同的名字。对于只在汇编语言模块中用到的变量的标识符,不能从下划线开始。任何一个在汇编语言中声明的对象都要使其在C/C++中是可访问的,那么在汇编语言中必须用.def 或.global将其声明为外部变量。同样在汇编语言中要引用C/C++函数或对象时,必须用.ref 或.global将C/C++对象声明,这将产生一个在汇编语言函数中没有定义的由链接器辨识的外部引用。
还有一些细节也需要注意,如中断子程序必须把该子程序将要用到的所有寄存器进行入栈处理;除了全局变量的初始化外,汇编语言的模块不得因为任何目的而使用.cinit段;汇编代码的结束需用指令B.s2 B3将程序执行从被调用函数返回到C语言调用函数中。
阅读(1234) | 评论(0) | 转发(0) |