C语言和汇编语言混合编程(C55xDS).ppt_第1页
C语言和汇编语言混合编程(C55xDS).ppt_第2页
C语言和汇编语言混合编程(C55xDS).ppt_第3页
C语言和汇编语言混合编程(C55xDS).ppt_第4页
C语言和汇编语言混合编程(C55xDS).ppt_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章C语言和汇编语言混合编程,混合编程中参数传递和寄存器使用,在很多DSP应用中都使用C语言和汇编语言进行混合编程。C语言具有可读性高、便于维护和可移植性好等优点,然而汇编语言具有实时运行效率高和代码效率高的优点。使用汇编语言可以更充分地利用DSP的硬件资源,例如乘累加单元、单指令重复、块重复和块移动等。,6.1混合编程中参数传递和寄存器使用,某些程序使用汇编语言编写时,实时运行效率是C语言的几十倍或更多,运算量越大,汇编语言编写的程序实时运行效率越明显。用C函数调用汇编子程序和C函数一样有参数传递和返回问题,下面介绍用C函数调用C55x汇编子程序的方法。,6.1.1C语言和汇编语言之间名称转换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只有中等中断优先级,所以先执行FIQ中断(CPSR7=0),当中断结束后再执行IRQ中断(CPSR6=0),程序:voiddisable_IRQ(void)/禁止中断程序inttmp;/定义临时变量,后面使用_asm/内嵌汇编程序的关键词MRStmp,CPSR/把状态寄存器加载给tmpORRtmp,tmp,#80/将IRQ控制位置1MSRCPSR_c,tmp/加载程序状态寄存器,EXPORTMessage声明全局标号MessageDCBHELLO$定义5个有效字符,$为结束符externchar*Message;intMessageLength()intLength=0;char*pMessage;/定义字符指针变量pMessage=Message;/指针指向Message内存块的首地址while(*pMessage!=$)/$为字符串的结束符Length+;pMessage+;return(Length);/返回字符串的长度,#includeexternvoidstrcopy(char*d,constchar*s);/声明,调用的汇编子程序intmain(void)constchar*srcstr=Firstource;/定义字符串常量chardststr=Secondstring-destination;/定义字符串变量printf(Beforecopying:n);printf(src=%s,dst=%sn,srcstr,dststr);/显示字符串的内容strcopy(dststr,srcstr);/调用汇编子程序R0=dststr,R1=srcstrprintf(Aftercopying:n);printf(src=%s,dst=%sn,srcstr,dststr);/显示复制后的结果return(0);,AREAExample,CODE,READONLY声明代码段ExampleEXPORTstrcopy声明strcopy,以便外部函数调用strcopyR0为目标字符串的地址,R1为源字符串的地址LDRBR2,R1,#1读取字节数据,源地址加1STRBR2,R0,#1保存读取的1字节数据,目标地址加1CMPR2,#0判断字符是否复制完毕BNEstrcopy没有复制完,继续循环复制MOVPC,LR,intsum(inta,intb,intc,intd,inte)return(a+b+c+d+e);/返回5个变量的和,AREAExample,CODE,READONLYIMPORTsum声明外部标号sum,即C函数sum()EXPORTCALLSUMUMSTMFDSP!,LRLR寄存器入栈MOVR0,#1设置sum函数入口参数,R0为参数aMOVR1,#2R1为参数bMOVR2,#3R2为参数cMOVR3,#5参数e=5,保存到堆栈中STRR3,SP,#-4!MOVR3,#4R3为参数d,d=4BLsum调用C程序中的sum函数,结果放在R0中ADDSP,SP,#4调整堆栈指针LDMFDSP,PC程序返回END,6.1.2变量定义及编译模式1.变量定义当C函数和汇编子程序使用同一变量时,在汇编子程序中,这些变量名必须使用.global、.def或.ref定义成全局变量。,2.编译模式使用C编译器,在进入汇编程序时,C55x的CPL(编译模式位)自动被置1,相对寻址模式使用堆栈指针SP。如果在汇编程序中需要使用相对直接寻址模式访问数据存储器,则必须改成数据页DP直接寻址模式,这可以通过清CPL位实现。在返回C调用程序前,CPL位必须重新置1。,6.1.3参数传递及返回值1.参数传递从C函数传递参数到汇编子程序,必须严格遵守C调用转换规则。传递一个参数,C编译器安排它一个特定的数据类型,并把它放到相应数据类型的寄存器里,C55x的C编译器使用以下三种典型的数据类型:数据指针:int*或long*;16位数据:char、short或int;32位数据:long、float、double或函数入口。,如果参数指向数据内存,则它们作为数据指针;如果参数能放到一个16位的寄存器里,则它作为16位数据,例如数据类型为int和char,否则作为32位数据。参数也可以是结构体,一个结构体是两个字(32位),或少于两个字,将作为32位参数,并使用32位寄存器传递;超过两个字的结构体,使用参考点传递参数,C编译器将使用指针来传递结构体的地址,这个指针作为一数据参数。,在子程序调用中,函数中的参数按一定顺序安排到寄存器中,参数存放寄存器和其数据类型相对应,表6-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位数据

温馨提示

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

评论

0/150

提交评论