C语言和汇编语言混合编程(C55xDS).ppt

上传人:max****ui 文档编号:14147667 上传时间:2020-07-08 格式:PPT 页数:22 大小:756.36KB
收藏 版权申诉 举报 下载
C语言和汇编语言混合编程(C55xDS).ppt_第1页
第1页 / 共22页
C语言和汇编语言混合编程(C55xDS).ppt_第2页
第2页 / 共22页
C语言和汇编语言混合编程(C55xDS).ppt_第3页
第3页 / 共22页
资源描述:

《C语言和汇编语言混合编程(C55xDS).ppt》由会员分享,可在线阅读,更多相关《C语言和汇编语言混合编程(C55xDS).ppt(22页珍藏版)》请在装配图网上搜索。

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

2、间名称转换C函数调用汇编子程序时,汇编程序所有变量名和子函数名需加前缀下划线“ _ ”,例如使用_sum作为汇编语言程序子函数名。如果汇编程序中定义了变量,必须加前缀下划线,C函数才能使用该变量。前缀“ _ ”只在C编译时使用,当我们用C函数调用汇编子程序和变量时,不需要加前缀“ _ ”。以下是C函数调用汇编子程序的例子。,FIQ的中断向量地址在0 x0000001C,而IRQ的在0 x00000018。 当允许IRQ中断时,CPSR7=0即CPSR的I位置为0.当允许FIQ中断时,CPSR6=0即CPSR的F位为0。 如果2个中断同时发生时,由于FIQ拥有最高中断优先级,而IRQ只有中等中断

3、优先级,所以先执行FIQ中断(CPSR7=0),当中断结束后再执行IRQ中断(CPSR6=0),程序:void disable_IRQ(void) /禁止中断程序 int tmp; /定义临时变量,后面使用 _asm /内嵌汇编程序的关键词 MRS tmp, CPSR /把状态寄存器加载给tmp ORR tmp, tmp, #80 /将IRQ控制位置1 MSR CPSR_c, tmp /加载程序状态寄存器 ,EXPORT Message 声明全局标号 Message DCB HELLO$ 定义5个有效字符,$为结束符 extern char* Message; int MessageLengt

4、h() int Length = 0; char *pMessage; /定义字符指针变量 pMessage = Message; /指针指向Message 内存块的首地址 while(*pMessage != $) /$为字符串的结束符 Length+; pMessage+; return(Length); /返回字符串的长度 ,#include extern void strcopy(char *d, const char *s); /声明,调用的汇编子程序 int main(void) const char *srcstr = First ource; /定义字符串常量 char dst

5、str = Second string-destination; /定义字符串变量 printf(Before copying: n); printf(src=%s, dst=%sn, srcstr, dststr); /显示字符串的内容 strcopy(dststr, srcstr); /调用汇编子程序R0=dststr, R1=srcstr printf(After copying: n); printf(src=%s, dst=%sn, srcstr, dststr); /显示复制后的结果 return(0); ,AREA Example, CODE, READONLY 声明代码段Exa

6、mple EXPORT strcopy 声明strcopy,以便外部函数调用 strcopy R0为目标字符串的地址, R1为源字符串的地址 LDRB R2, R1, #1 读取字节数据,源地址加1 STRB R2, R0, #1 保存读取的1字节数据,目标地址加1 CMP R2, #0 判断字符是否复制完毕 BNE strcopy 没有复制完,继续循环复制 MOV PC, LR,int sum(int a, int b, int c, int d, int e) return(a+b+c+d+e); /返回5个变量的和 ,AREA Example, CODE, READONLY IMPORT

7、 sum 声明外部标号sum,即C函数sum() EXPORT CALLSUM UM STMFD SP!, LR LR寄存器入栈 MOV R0, #1 设置sum函数入口参数,R0为参数a MOV R1, #2 R1为参数b MOV R2, #3 R2为参数c MOV R3, #5 参数 e=5,保存到堆栈中 STR R3, SP, #-4! MOV R3, #4 R3为参数d, d=4 BL sum 调用C程序中的sum函数,结果放在R0中 ADD SP, SP, #4 调整堆栈指针 LDMFD SP, PC 程序返回 END,6.1.2 变量定义及编译模式1. 变量定义当C函数和汇编子程序

8、使用同一变量时,在汇编子程序中,这些变量名必须使用.global、.def或.ref定义成全局变量。,2. 编译模式使用C编译器,在进入汇编程序时,C55x的CPL(编译模式位)自动被置1,相对寻址模式使用堆栈指针SP。如果在汇编程序中需要使用相对直接寻址模式访问数据存储器,则必须改成数据页DP直接寻址模式,这可以通过清CPL位实现。在返回C调用程序前,CPL位必须重新置1。,6.1.3 参数传递及返回值1. 参数传递从C函数传递参数到汇编子程序,必须严格遵守C调用转换规则。传递一个参数,C编译器安排它一个特定的数据类型,并把它放到相应数据类型的寄存器里,C55x的C编译器使用以下三种典型的数

9、据类型:数据指针:int *或long *;16位数据:char、short或 int;32位数据:long、float、double或函数入口。,如果参数指向数据内存,则它们作为数据指针;如果参数能放到一个16位的寄存器里,则它作为16位数据,例如数据类型为int和char,否则作为32位数据。参数也可以是结构体,一个结构体是两个字(32位),或少于两个字,将作为32位参数,并使用32位寄存器传递;超过两个字的结构体,使用参考点传递参数,C编译器将使用指针来传递结构体的地址,这个指针作为一数据参数。,在子程序调用中,函数中的参数按一定顺序安排到寄存器中,参数存放寄存器和其数据类型相对应,表6

10、-1所示为参数类型和寄存器安排顺序表。,表6-1 参数类型和寄存器安排顺序表,由表6-1可见,辅助寄存器既可作为数据指针又可以作为16位数据寄存器,例如T0和T1保存了16位数据参数,并且AR0已经保存了一个数据指针参数,那么第三个16位参数数据将放到AR1。,2. 参数返回值对于被调用的子程序的返回值,不同类型的参数使用的寄存器也有所不同。例如:当返回一个16位数据时使用T0;当返回一个32位数据时使用AC0;当返回一个数据指针时使用XAR0;当返回一个结构体时,这个结构体保存在当前的堆栈里。,3. 应用实例以下是几个参数传递和返回值使用寄存器的例子。【例6-1】 返回值存放于T0,参数传递时,16位数据i使用T0,16位数据指针*k使用AR0,32位数据p使用AC0。函数定义及使用寄存器关系表示如下:,【例6-2】 返回值存放于AC0,参数传递时,16位数据i使用T0,16位数据指针*k使用AR0,16位数据p使用T1,16位数据n使用AR1。函数定义及使用寄存器关系表示如下:,【例6-3】 返回值存放于AC0,参数传递时,16位数据i使用T0,16位数据指针*k使用AR0,32位数据p使用AC0,16位数据n使用T1。函数定义及使用寄存器关系表示如下:,

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!