- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
(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
您可能关注的文档
最近下载
- 3.1公民身份从何而来课件.pptx VIP
- 基于LabVIEW的音频信号数据采集和频谱分析.pdf VIP
- 2024年AMC8数学竞赛(英文)学生用卷及答案解析.pdf VIP
- GB/T 20895.1-2025小艇 稳性和浮性的评定与分类 第1部分:艇体长度不小于6 m的非帆艇.pdf
- 国家医保局-2024年医保支付方式改革培训班-DRG.DIP2.0版培训.docx VIP
- 反诈防诈 大学生防诈骗知识题库.docx VIP
- 《中西方饮食文化比较》课件.ppt VIP
- 九年级下册《出师表》过关训练-2024年中考语文课内文言文要点梳理与练习(全国通用)原卷版.docx VIP
- 什么是有限元教程.ppt VIP
- 商用密码应用安全性测评机构能力要求_《商用密码应用安.pdf VIP
文档评论(0)