分享

F2812中C语言调用汇编函数

 lixinxinjn 2012-12-16

F2812中C语言调用汇编函数

标签: 

转载

C 汇编

F2812C语言调用汇编函数

参考资料:

(1) SPRU514 ---- TMS320F28x Optimizing C/C++ Compiler User’s Guide.pdf;

(2) spru430d ---- TMS320C28x DSP CPU and Instruction Set Reference Guide;

(3) spru513c ---- TMS320C28x Assembly Language Tools User's Guide.

 

一、编写C语言能调用的.asm文件

以delay.asm为例:

1、将文件保存为.asm文件;

2、在文件中编写如下代码:

;*********************************************************************/

;* 鲍正华 */

;* 2010.07.09 */

;*********************************************************************/

 ;//###########################################################################

; @FunctionName:        Delay_asm

;

; @Brief:    延时1s

;

; @Param:  unsigned long cnt 传给 ACC

;

; @Return: 无

;//###########################################################################

        .def _Delay_asm

       .global  _Delay_asm

 

            .sect".delayasmpage"

 

_Delay_asm:

        SUB    ACC,#1       ;1 clk

        BF     _Delay_asm,GEQ  ;4/4 clk,  Loop if ACC >= 0

        LRETR    ;4 clk

 

 

;There is a 9/10 cycle overhead and each loop

;takes five cycles. The LoopCount is given by

;the following formula:

 DELAY_CPU_CYCLES = 9 + 5*LoopCount

; LoopCount = (DELAY_CPU_CYCLES - 9) / 5

; The macro DELAY_US(A) performs this calculation for you

 

 ;***********************************************************************/

       No     more

;***********************************************************************/

3、在步骤2中:

.def _Delay_asm用来定义函数名;

.global  _Delay_asm将函数名全局化,以便在C文件中能够调用;

.sect".delayasmpage"将函数定位到定义的段中,也可以是.text,可以灵活运用;

_Delay_asm:为函数标号,注意一定在前面加上下划线_否则C文件不能调用;

LRETR是函数返回,采用了RPC时必须用该指令。

4、在C文件中对函数原型进行声明:

extern void Delay_asm(unsigned long cnt);

5、在C 文件中以C语言形式调用汇编函数:

//延时1s

Delay_asm(18000000L);

6、上边的参数unsigned long cnt传递给了累加器ACC

 

 二、C语言调用汇编函数时的参数传递

参考(1) SPRU514 ---- TMS320F28x Optimizing C/C++ Compiler User’s Guide.pdf中的page168~169中的内容。

要点:

1、如果汇编语言中修改了XAR1XAR2XAR3的值,必须对它们进行保护:

                   ;保存XAR1、XAR2、XAR3,以防程序修改, 若程序没有修改可以不用压栈保护

                   PUSH XAR1         ;1 clk

                   PUSH XAR2         ;1 clk

                   PUSH XAR3         ;1 clk

                   .

                   .

                   .

                   ;恢复XAR1、XAR2、XAR3

                   POP XAR3  ;1 clk

                   POP XAR2  ;1 clk

                   POP XAR1  ;1 clk

216位参数从左至右依次传递给:ALAHXAR4XAR5

3、指针参数依次传递给:XAR4XAR5,其它指针参数放到stack中;

432位的参数传递给累加器ACC(AH/AL),其它32位参数放到stack中。

例子:

1)汇编代码:

;//###########################################################################

; @FunctionName:        _Xintf_memcpy_asm

;

; @Brief:    copy指定xintf

;

; @Param:  dest_addr, src_addr, length

;

; @Return: 无

;//###########################################################################

         .def _Xintf_memcpy_asm      ;函数定义

         .global  _Xintf_memcpy_asm         ;函数全局声明,以便C能够调用

 

         .sect".xintfmemcpyasmpage"         ;以下为代码段

 

_Xintf_memcpy_asm:   ;标号必须从第1列开始,而汇编语言助记符不能从第1列开始

                   ;保存XAR1、XAR2、XAR3,以防程序修改, 若程序没有修改可以不用压栈保护

                   ;PUSH XAR1        ;1 clk

                   ;PUSH XAR2        ;1 clk

                   ;PUSH XAR3        ;1 clk

 

;copy指定区域(从XAR4指定区域copy到XAR5指定区域)

$1:

                   MOV AR6, *XAR5++     ;4 clk

                   MOV *XAR4++, AR6     ;1 clk

                   SUB ACC, #1       ;1 clk

                   BF $1, GT   ;4/4 clk, 大于则跳转

 

                   ;恢复XAR1、XAR2、XAR3

                   ;POP XAR3 ;1 clk

                   ;POP XAR2 ;1 clk

                   ;POP XAR1 ;1 clk

 

         LRETR       ;4 clk, 程序返回

2C文件中对函数原型的声明:

extern void Xintf_memcpy_asm(unsigned int* dest_addr, unsigned int* src_addr, unsigned long length);

3C文件中以函数原型形式对汇编函数进行调用:

Xintf_memcpy_asm((unsigned int*)ZONE6ADDRESS, (unsigned int*)ZONE2ADDRESS, 102400L);   

4)这里参数传递过程是:ZONE6ADDRESS 传递给XAR4, ZONE2ADDRESS 传递给XAR5, 102400L 传递给ACC

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多