CCS下的C和汇编的混合编程


CCS是一个完整的DSP集成开发环境。CCS最初由GODSP公司为C6000系列设计,后来TI公司受够了GODSP公司,并将CCS扩展到其他系列,成为一个多平台的集成开发环境。CCS支持C语言、汇编语言、.H文件、.cmd文件。

汇编和C的相互调用可以分为以下几种情况:

  1. 汇编中访问C中的变量和函数

C函数调用汇编子程序时,汇编程序中所有变量名和子函数名前加下划线“_”,例如使用_sum作为汇编语言程序子函数名。同理如果汇编中定义了变量,必须加前缀下划线C函数才能使用该变量。前缀下划线只在C编译时使用,在C函数中使用汇编函数和变量时不需要加前缀下划线。

C语言和汇编使用统一变量时,在汇编程序中必须使用.global.def.ref定义成全局变量。

在汇编中调用C语言的函数时,如果没有参数传递,直接使用_funcname,如果有参数传递,则使用寄存器来传递相应的参数,如下表(以dspc5509为例)

参数类型

寄存器安排顺序

16位数据指针

AR0 AR1 AR2 AR3 AR4

23位数据指针

XAR0 XAR1 XAR2 XAR3 XAR4

16位数据

T0 T1 AR0 AR1 AR2 AR3 AR4

32位或40位数据

AC0 AC1 AC2

如函数为:

intfn(int i1,long l2,int *p3)其参数传递使用寄存器T0AC0AR0传递,函数返回值通过T0传递。


2C程序中访问汇编中的变量

如果需要在C程序中访问汇编中的变量,则汇编程序中的变量名必须以下划线为首字符,并用.global声明为全局变量,如果需要访问汇编中的过程,则过程名必须以下划线为首字符,并且要根据C程序编译时使用的模式是stack-basedmodel还是register argumentmodel类正确的编写该过程,使之能正确的取得调用参数。


  1. 以下为本人试验的例子

以下为本人代码验证,main.cC语言函数,cas.asm为汇编代码。

Main.c

#include<stdio.h>

externint addfunc(int *p);//C语言调用汇编中的过程用extern声明为外部函数

int globla=10;//C中定义的全局变量在汇编中使用用.global声明为全局变量

int subfunc(int a,int b)//汇编中会调用该函数需在汇编中用.global声明为全局函数

{

int i=a-b;

return i;

}

void main()

{

int sum;

int loca=15;

sum=addfunc(&loca);

globla=subfunc(3,1);

printf("sum=%d\nglobla=%d",sum,globla);

}

汇编部分代码

Cas.asm

.global_addfunc;注意此处开头应空一格不然出现synaxerror

.global _subfunc;汇编调用C语言中定义的函数

.global_globla

_addfunc:;汇编中定义的过程若要被C调用必须加下划线

MOV *AR0,AR1

ADD*(#_globla),AR1,AR1

MOV AR1,T0

MOV #10h,T1

CALL_subfunc;此处使用寄存器T0T1subfunc传递参数,并且通过T0返回结果

RET

CCS中新建项目,添加库文件及.cmd文件运行结果为

sum=9

globla=2


你可能感兴趣的:(CCS下的C和汇编的混合编程)