第6章TMS320C54DSP的C程序设计(未完)导论.ppt

  1. 1、本文档共54页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
(5)调用C函数时,注意C函数只保护了几个特定的寄存器,而其他是可以自由使用的。 (6)长整型和浮点数在存储器中存放的顺序是低位字在高地址,高位字在低地址。 (7)如果函数有返回值,返回值存放在累加器A中。 (8)汇编语言模块不能改变由C模块产生的.cinit段,如果改变其内容将会引起不可预测的后果。 (9)编译器在所有标识符(函数名、变量名等)前加下划线“_”。 (10)任何在汇编程序中定义的对象或函数,如果需要在C程序中访问或调用,则必须用汇编指令.global定义。 (11)编辑模式CPL指示采用何种指针寻址,如果CPL=1,则采用堆栈指针SP寻址;如果CPL=0,则选择页指针DP进行寻址。 [例1]在C语言中调用汇编语言函数 C程序: ????????????Extern?int?asmfunc?(?);?/*声明外部的汇编子程序*/ ????????????/*注意函数名前不要加下划线*/ ????????????int?gvar;?/*定义全局变量*/ ????????????main(?) ????????????{ ????????????int?i=3; ????????????gvar=asmfunc(i);?/*进行函数调用*/ ????????????} 汇编程序: ????????????_asmfunc:? ;函数名前一定要有下划线 ????????????ADD? *(_ gvar),A? ;加法结果存在A中 ????????????STL? A,*( _ gvar)? ;将A中的结果存到gvar ????????????RETD? ;子程序返回 返回本节 [例2] 用C/C++编写的主程序调用汇编语言编写的32位乘法运算子程序。 虽然用C/C++语言表达32 b乘法运算较为方便和明了,但由于C/C++语言无法很好利用DSP汇编语言为实现各种乘法运算而提供的指令,而使得C/C++程序效率低下。所以这里用汇编语言完成32 b乘法运算,再用C/C++程序调用它。 算法简介 由于16 b定点DSP中没有32 b乘法指令,所以一定要用几种16 b乘法指令结合一定算法来进行32 b乘法运算。一个32 b数在存储器中是分开存储的。高16位存放在低地址,它在进行乘法运算是可以看作一个16 b有符号数;低16位存放在相邻的低地址,他进行乘法运算时可以看作一个16 b无符号数。于是算式如下: x1 x0 y1 y0 × x0×y0 x1×y0 y1×x0 y1×x1 w0 w1 w2 w3 U×U S×U S×U S×S U U U S 其中:S代表符号数;U代表无符号数。 由上算式可见,在32 b乘法运算中,实际上包含了3种乘法运算:U*U,S*U和S*S 。一般的乘法运算指令都是两个带符号数相乘,即S*S。所以在编程时,还要用到以下两条乘法指令: #include stdio.h #includestdlib.h int main( ) {extern int *MPY32(long X32, long Y32) ;声明外部的32b乘法运算汇编子程序,该函数返回指针值 int w[4] int *p int i p=MPY32(00 ;进行函数调用 ;该指针指向数据存储器中,存放相乘结果单元的首地址 for(i=0;i4;i++) { w[i]=*p++ ;将乘法结果存到数组中 printf(“%x\n”,W[i]) ;以十六进制方式输出该数组值 } } 举例:C语言主程序 在主程序中进行MPY32函数调用时,函数传递情形如图2所示。函数MPY32的第一参数存放在A累加器中,第二个参数在堆栈中,高16位在堆栈中的低地址,低16位在堆栈中的高地址。由于MPY32是汇编语言函数,所以编译器不为其分配局部帧,局部帧的分配在汇编程序中进行。 汇编语言函数: .mmregs .bss x1,1 ;为局部帧分配内存空间 .bss x0,1 .bss y1,1 .bss y0,1 .bss w3,1 .bss w2,1 .bss w1,1 .bss w0,1 .text .global _MPY32 ;声明函数名为全局变量 STM #X1,AR2 ;令AR2指向第一个参数存放单元 STM #Y1,AR3 ;令AR3指向第二个参数存放单元 S

文档评论(0)

bbnnmm885599 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档