CCS是一个完整的DSP集成开发环境。CCS最初由GODSP公司为C6000系列设计,后来TI公司受够了GODSP公司,并将CCS扩展到其他系列,成为一个多平台的集成开发环境。CCS支持C语言、汇编语言、.H文件、.cmd文件。
汇编和C的相互调用可以分为以下几种情况:
汇编中访问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)其参数传递使用寄存器T0,AC0,AR0传递,函数返回值通过T0传递。
(2)C程序中访问汇编中的变量
如果需要在C程序中访问汇编中的变量,则汇编程序中的变量名必须以下划线为首字符,并用.global声明为全局变量,如果需要访问汇编中的过程,则过程名必须以下划线为首字符,并且要根据C程序编译时使用的模式是stack-basedmodel还是register argumentmodel类正确的编写该过程,使之能正确的取得调用参数。
以下为本人试验的例子
以下为本人代码验证,main.c为C语言函数,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;此处使用寄存器T0,T1给subfunc传递参数,并且通过T0返回结果
RET
在CCS中新建项目,添加库文件及.cmd文件运行结果为
sum=9
globla=2