C语言和汇编语言混合编程.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

C/C++语言和汇编语言混合编程开发

为了充分利用DSP芯片的硬件资源,更好发挥C/C++语言和汇编语言进行软

件开发的各自优点,可以将两者有机的结合起来,兼顾两者优点,避免其弊端。

因此,在很多情况下,采用混合编程方法能更好地达到设计要求,完成设计任务。

C/C++语言和汇编语言混合编程的具体方法有以下几种:

(1)独立编写C/C++程序和汇编程序,分开编译或汇编形成各自的目标模块,再

用链接器将C/C++模块和汇编模块链接起来,这是一种灵活性较大的方法。但用户

必须自己维护各汇编模块的入口和出口代码,自己计算传递参数在堆栈中的偏移

量,工作量稍大,但能做到对程序的绝对控制,也能满足软件设计结构化的要求。

这是主要讲述的方法。

(2)在C/C++程序中使用汇编程序中定义的变量和常量。

(3)在C/C++程序中直接内嵌汇编语句。这种方法可以在C/C++程序中实现C/C++

语言无法实现的硬件控制功能,如修改中断控制寄存器、中断标志寄存器等。

(4)在C/C++源程序中使用内部函数直接调用汇编语言语句。

后3种方法由于在C/C++语言中直接嵌入了汇编语言的成分,容易造成程序混

乱,C/C++环境被破坏,甚至导致程序崩溃,而编程者又很难对不良结果进行预期

和有效控制。而如果采用第一种方法,只要遵循有关C/C++语言函数调用规则和寄

存器规则,就能预见到程序运行的结果,保证程序正确。下面分别讲述函数调用

规则和寄存器规则。

1.函数调用规则

C/C++编译器对函数调用强加了一组严格的原则。除了特殊的运行时间支持库

函数外,任何调用函数和被C/C++函数调用的函数都必须遵守这些原则。不遵守

这些原则可能破坏C/C++环境并导致程序失败。

图1说明了典型的函数调用。在这个例子中,参数被传递到堆栈中调用者的参

数块,函数再使用这些参数调用被调用函数。注意,第一个参数是在A累加器中传

递的。这个例子还说明了汇编器对被调用函数的局部帧的分配。局部帧包括局部

变量块和局部参数块两部分,其中局部参数块是局部帧中用来传递参数到其他函

数的部分。如果被调用函数没有局部变量并且不再调用其他函数或需要调用的函

数没有参数,则不分配局部帧。对于混合编程而言,由于被调用函数是手工编写

的汇编程序,则局部帧由编程者自己完成分配,也不需要在堆栈中进行,而编译

器分配局部帧。

(1)函数如何调用

函数(调用者)在调用被调用函数时执行以下任务。

①调用者将第一个(最左边)的参数值放进累加器A。调用者将剩下的参数按相反

的顺序传进参数块,剩下的最左边的参数在最低的地址。

②若函数返回一个结构,则调用者为该结构分配空间,然后用累加器A传递返回空

间的地址给调用的函数。

③调用者调用函数。

(2)被调用函数如何响应。

被调用函数执行以下任务:

注意:如果被调用函数是C/C++函数,则下面步骤都是由汇编器自动完成。如果是

混合编程,则如下步骤都是由编程者在被调用的汇编函数中完成的。

①若被调用函数修改AR1,AR2或AR7,则将他们压入堆栈。

②被调用函数通过从SP减去一个常数,为局部变量块和局部参数块分配存储器。

该常数按以下公式计算,即:

局部变量块的大小+局部参数块的大小+padding

padding值是为了保证SP对准偶数边界而可能要求补充的一个字。之所以SP要对准

偶数边界,是因为5000系列DSP指令可一次读写存储器的32位,例如DLD,DADD等。

这样,编译器必须保证所有32b的目标都驻留在偶数边界。

对于混合编程而言可以在汇编函数中,按本步骤的方法在堆栈中分配局部帧,

但本方法相对比较麻烦,尤其该汇编函数还要调用其他函数时,所以,一般而言

编程者通常用其他方法分配局部帧,比如用bss伪指令定义局部变量供函数使用。

③被调用函数为调用函数执行代码。

④若函数返回一个值,则被调用函数将该值放在累加器A中;若函数返回一个结构,

则被调用函数将该结构复制到累加器A指到的存储器块;若调用者不返回函数值,

则A被置0。

⑤被调用函数给SP上加上第二步计算的常数,释放为局部变量和局部参数分配的

存储空间。对混合编程而言,如果编程者没有在堆栈中分配局部帧,则本步骤省

略。

⑥被调用函数恢复所有保存的寄存器。

⑦被调用函数执行返回。

2.寄存器规则

(1)必须保存任何被函数修正的专用寄存器。专用寄存器包括:

①AR1,AR6,AR7

②堆栈指针(SP)

若对SP正常使用,不需要明显的保存。换句话说,只要任何压入堆栈的东西在函

数返回

文档评论(0)

152****6979 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档