c语言和汇编语言混合编程理工

c语言和汇编语言混合编程理工

ID:25766498

大小:512.00 KB

页数:8页

时间:2018-11-22

c语言和汇编语言混合编程理工_第1页
c语言和汇编语言混合编程理工_第2页
c语言和汇编语言混合编程理工_第3页
c语言和汇编语言混合编程理工_第4页
c语言和汇编语言混合编程理工_第5页
资源描述:

《c语言和汇编语言混合编程理工》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、C语言和汇编语言混合编程第6章C语言和汇编语言混合编程6.1C语言和汇编语言混合编程中参数传递和寄存器使用在很多DSP应用中使用C语言和汇编语言进行混合编程。C语言具有可读性高、便于维护和可移植性好等优点,然而汇编语言具有实时运行效率高和代码效率高的优点。使用汇编语言可以更充分地利用DSP的硬件资源,例如乘累加单元、单指令重复、块重复和块移动等等。某些程序使用汇编语言编写实时运行效率是C语言的几十倍或更多,运算量越大,汇编语言编写的程序实时运行效率越明显。C函数调用汇编子程序和C函数一样有参数传递和返回,以下我们给出C函数如何调用C55x汇编子程

2、序。6.1.1名称转换C函数调用汇编子程序时,汇编程序所有变量名和子函数名加前缀下划线“_”,例如使用_sum作为汇编语言程序子函数名。如果汇编程序中定义了变量,必须加前缀下划线C函数才能使用该变量。前缀“_”只在C编译时使用,当我们用C函数调用汇编子函数和变量时,不需要加前缀“_”。以下是C程序调用汇编子函数例子。C程序:externintsum(int*);//参考一个汇编函数intx[4]={0x1223,0x345,0x2345,0x3444};//定义全局变量并初始化ints;//定义全局变量voidmain(){s=sum(x);//

3、while(1);//}汇编程序:.global_sum;_sum;rptzac0,#3;add*ar0+,ac0;movac0,t0;ret;2.变量定义-83-C语言和汇编语言混合编程当C和汇编子程序使用同一变量时,在汇编程序中必须使用.global,.def或.ref定义成全局变量。3.编译模式使用C编译器,C55x的CPL(编译模式位)自动被置1,在进入汇编程序时,相对寻址模式使用堆栈指针SP。如果在汇编程序中我们需要使用相对直接寻址模式访问数据存储器,必须改成数据页DP直接寻址模式,可以通过清CPL位实现,在返回C调用程序前,CPL位必

4、须重新置1。4.参数传递从C函数传递参数到汇编子程序,必须严格遵守C调用转换规则。传递一个参数,C编译器安排它一个特定的数据类型,并把它放到相应数据类型的寄存器里,C55x的C编译器使用以下三种典型的数据类型:n数据指针:int*或long*n16位数据:char、short或intn32位数据:long、float、double或函数入口如果参数指向数据内存,它们作为数据指针;如果参数能放到一个16位的寄存器里,它作为16位数据,例如数据类型为int和char,否则作为32位数据;参数也可以是结构体,一个结构体是两个字(32位)或少于两个字将作

5、为32位参数,并使用32位寄存器传递,超过两个字的结构体,使用参考点传递参数,C编译器将使用指针来传递结构体的地址,这个指针作为一数据参数。在子程序调用中,函数中的参数顺序地安排到寄存器中,参数存放寄存器和其数据类型相对应,表6-1是参数类型和寄存器安排顺序表。表6-1参数类型和寄存器安排顺序表参数类型寄存器安排顺序16位数据指针AR0,AR1,AR2,AR3,AR423位数据指针XAR0,XAR1,XAR2,XAR3,XAR416位数据T0,T1,AR0,AR1,AR2,AR3,AR432位数据AC0,AC1,AC2从表6-1中看到辅助寄存器既

6、可作为数据指针又可以作为16位数据寄存器,例如T0和T1保存了16位数据参数,并且AR0已经保存了一个数据指针参数,那么第三个16位参数数据将放到AR1。5.参数返回值从被调用的子程序返回值,当返回一个16位数据使用T0;当返回一个32位数据使用AC0;当返回一个数据指针使用XAR0-83-C语言和汇编语言混合编程;当返回一个结构体,这个结构体在当前的堆栈里。以下是几个参数传递和返回值使用寄存器的例子:例1:返回值存放于T0,参数传递16位数据i使用T0,16位数据指针*k使用AR0,32位数据p使用AC0;intfunc(inti,int*k,

7、longp)T0T0AR0AC0例2:返回值存放于AC0,参数传递16位数据i使用T0,16位数据指针*k使用AR0,16位数据p使用T1,16位数据n使用AR1;longfunc(inti,int*k,intp,intn)AC0T0AR0T1AR1例3:返回值存放于AC0,参数传递16位数据i使用T0,16位数据指针*k使用AR0,32位数据p使用AC0,16位数据n使用T1。longfunc(inti,int*k,longp,intn)AC0T0AR0AC0T16.寄存器的使用和保存当使用一个函数调用,调用函数和被调用函数之间寄存器安排和保存

8、被严格定义。被调用函数需使用这些寄存器:T2,T3,AR5,AR6,AR7,AC3时,在使用之前必须先将其内容保存之后再使用,可以使用压

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。