资料介绍
本文将讨论如何将汇编语言程序代码整合到C语言中,以最大化性能以及程序设计人员生产力,内容涵盖了编译器惯例(convention)、内嵌(inlining)、内嵌函数(intrinsic)、缓存器连结(register binding)和除错策略。
随着DSP处理器性能的提升以及编译器最佳化技术的进步,曾经红极一时、仅用汇编语言编写DSP应用程序的作法已逐渐被淘汰。今天,几乎每个DSP应用程序都使用C语言程序代码和汇编程序码混合的方式。对于一些性能需求极高的关键功能,DSP工程师会继续使用高度最佳化的汇编程序码;而一些次要的功能现在也使用C语言编写,使程序代码更容易维护和移植。对于C语言和汇编程序码的结合,每位DSP工程师都需要掌握特殊的工具和方法。
众所皆知,汇编语言编码具有更高的性能优势,而用C语言编码则较容易且速度也更快。为了解其中原因,以下我们进一步比较汇编语言编码与C语言编码的优缺点:
汇编语言编码的优点:
‧汇编语言编码可以充分利用处理器的独特指令以及各种专门的硬件资源。而C语言程序代码是通用型程序代码,必须支持各种硬件平台,因此很难支持特殊平台程序代码。
‧汇编程序设计人员通常对应用程序非常熟悉,可以作出编译器无法作出的假设。
‧汇编程序设计人员可以发挥人类的创造性;而再先进的编译器也只是一个自动化的程序。
汇编语言编码的缺点:
‧汇编程序设计人员必须解决耗时的机器级问题,如缓存器分配和指令排程。若使用C语言程序代码,这些问题可以由编译器解决。
‧使用汇编语言编码的程序设计人员必须了解DSP架构及其指令集的专业知识;而C语言编码只需要掌握相当普及的C语言知识。
‧若使用汇编语言,将应用程序从一个平台移植到另一个平台非常困难也相当耗时;而C语言应用程序的移植相对而言非常容易。
图1显示了如何利用专用硬件机制来获得高度最佳化的汇编程序码。左边的C语言编码利用模块算法设计出一个循环缓冲区P1;右边高度最佳化的汇编程序码中,等效的缓冲区是利用CEVA-TeakLite-III DSP核心的模块运算机制(Modulo Mechanism)设计产生的。只要缓冲区指标(本例中的r0)有更新,模块运算机制便会自动执行模块运算。这种运算与指针更新在同一个周期发生,因此汇编程序码比C语言程序代码更加高效,可为模块运算产生独立的指令。

图1:右边的CEVA-TeakLite-III汇编程序码可以建置成左边的C语言程序代码。
为DSP应用选择C/汇编程序码
混合使用的问题就在于该如何划分C语言程序代码和汇编程序码的界限,而答案取决于剖析器提供的性能分析结果。然而在使用剖析器之前,DSP工程师需要为应用程序定义清晰的对象,一些典型的对象包括循环数、程序代码大小和数据大小。一旦这些对象确定后,所有应用程序都应该先以C语言编写和制作,随后使用剖析器来分析性能。
在一些极端情况下,如控制应用,用C语言层级的编码就足够了;但大多数情况下,原始C语言层级应用程序版本不会遵从一个或多个对象,这也意味着需要使用一些汇编程序码来完成。在求助于汇编语言编码之前,C语言编码可提供许多方法来提高性能,但这些方法不属于本文讨论的范畴。假设所有C语言级的方法全用完了,并且准备使用汇编语言编码,这时强烈建议将原始C语言程序代码保存起来。这样不仅方便除错,而且一旦条件许可(比如转移到更强大的平台)还可以回复原始的C语言。
程序代码中的汇编语言部份应尽可能维持在最少,这样便能分析从剖析器得到的性能结果,并定义应用程序中的关键函数。关键函数会占用大部份执行时间,必须用汇编语言重写才能满足性能对象。当两到三个最关键的函数重写后,需要重新进行性能测量,若应用程序仍然不能满足对象需求,那么必须使用汇编语言定义并重写额外的关键函数,这个过程需要不断地重复直到满足性能对象需求为止。
汇编语言设计师的编译器考虑
在编写会与C语言程序代码结合的汇编程序码时,汇编程序设计人员必须了解编译器的惯例和假设。其中有个重要的编译器惯例是函数呼叫惯例,也称为函数参数传递惯例。这个惯例描述了编译器如何在一个函数呼叫另一个函数时传递参数。为了使汇编语言函数能被C语言函数成功呼叫;反之亦然;汇编语言函数必须截取参数,然后将参数发送到由函数呼叫惯例定义的硬件资源上,通常为缓存器或堆栈内存。
汇编程序设计人员还必须了解编译器的缓存器使用惯例。这些惯例将硬件缓存器分成被呼叫者保存(callee-saved;或呼叫者使用,caller-used);以及被呼叫者使用(callee-used;或呼叫者保存,caller-saved)缓存器。编译器假设被呼叫者保存缓存器在函数呼叫过程中保持不变的值,若汇编程序设计人员希望使用这种缓存器,他们必须先将缓存器的值备份,然后在返回到C语言程序代码之前恢复这些缓存器的内容;相反的,被呼叫者使用缓存器被认为在函式呼叫过程中不会保持一定的值。这意味着汇编程序设计人员使用这些缓存器之前无需进行备份,不过他们必须记住,当汇编语言函数呼叫C语言函数时,被呼叫者可以对这些缓存器进行覆写。
随着DSP处理器性能的提升以及编译器最佳化技术的进步,曾经红极一时、仅用汇编语言编写DSP应用程序的作法已逐渐被淘汰。今天,几乎每个DSP应用程序都使用C语言程序代码和汇编程序码混合的方式。对于一些性能需求极高的关键功能,DSP工程师会继续使用高度最佳化的汇编程序码;而一些次要的功能现在也使用C语言编写,使程序代码更容易维护和移植。对于C语言和汇编程序码的结合,每位DSP工程师都需要掌握特殊的工具和方法。
众所皆知,汇编语言编码具有更高的性能优势,而用C语言编码则较容易且速度也更快。为了解其中原因,以下我们进一步比较汇编语言编码与C语言编码的优缺点:
汇编语言编码的优点:
‧汇编语言编码可以充分利用处理器的独特指令以及各种专门的硬件资源。而C语言程序代码是通用型程序代码,必须支持各种硬件平台,因此很难支持特殊平台程序代码。
‧汇编程序设计人员通常对应用程序非常熟悉,可以作出编译器无法作出的假设。
‧汇编程序设计人员可以发挥人类的创造性;而再先进的编译器也只是一个自动化的程序。
汇编语言编码的缺点:
‧汇编程序设计人员必须解决耗时的机器级问题,如缓存器分配和指令排程。若使用C语言程序代码,这些问题可以由编译器解决。
‧使用汇编语言编码的程序设计人员必须了解DSP架构及其指令集的专业知识;而C语言编码只需要掌握相当普及的C语言知识。
‧若使用汇编语言,将应用程序从一个平台移植到另一个平台非常困难也相当耗时;而C语言应用程序的移植相对而言非常容易。
图1显示了如何利用专用硬件机制来获得高度最佳化的汇编程序码。左边的C语言编码利用模块算法设计出一个循环缓冲区P1;右边高度最佳化的汇编程序码中,等效的缓冲区是利用CEVA-TeakLite-III DSP核心的模块运算机制(Modulo Mechanism)设计产生的。只要缓冲区指标(本例中的r0)有更新,模块运算机制便会自动执行模块运算。这种运算与指针更新在同一个周期发生,因此汇编程序码比C语言程序代码更加高效,可为模块运算产生独立的指令。

图1:右边的CEVA-TeakLite-III汇编程序码可以建置成左边的C语言程序代码。
为DSP应用选择C/汇编程序码
混合使用的问题就在于该如何划分C语言程序代码和汇编程序码的界限,而答案取决于剖析器提供的性能分析结果。然而在使用剖析器之前,DSP工程师需要为应用程序定义清晰的对象,一些典型的对象包括循环数、程序代码大小和数据大小。一旦这些对象确定后,所有应用程序都应该先以C语言编写和制作,随后使用剖析器来分析性能。
在一些极端情况下,如控制应用,用C语言层级的编码就足够了;但大多数情况下,原始C语言层级应用程序版本不会遵从一个或多个对象,这也意味着需要使用一些汇编程序码来完成。在求助于汇编语言编码之前,C语言编码可提供许多方法来提高性能,但这些方法不属于本文讨论的范畴。假设所有C语言级的方法全用完了,并且准备使用汇编语言编码,这时强烈建议将原始C语言程序代码保存起来。这样不仅方便除错,而且一旦条件许可(比如转移到更强大的平台)还可以回复原始的C语言。
程序代码中的汇编语言部份应尽可能维持在最少,这样便能分析从剖析器得到的性能结果,并定义应用程序中的关键函数。关键函数会占用大部份执行时间,必须用汇编语言重写才能满足性能对象。当两到三个最关键的函数重写后,需要重新进行性能测量,若应用程序仍然不能满足对象需求,那么必须使用汇编语言定义并重写额外的关键函数,这个过程需要不断地重复直到满足性能对象需求为止。
汇编语言设计师的编译器考虑
在编写会与C语言程序代码结合的汇编程序码时,汇编程序设计人员必须了解编译器的惯例和假设。其中有个重要的编译器惯例是函数呼叫惯例,也称为函数参数传递惯例。这个惯例描述了编译器如何在一个函数呼叫另一个函数时传递参数。为了使汇编语言函数能被C语言函数成功呼叫;反之亦然;汇编语言函数必须截取参数,然后将参数发送到由函数呼叫惯例定义的硬件资源上,通常为缓存器或堆栈内存。
汇编程序设计人员还必须了解编译器的缓存器使用惯例。这些惯例将硬件缓存器分成被呼叫者保存(callee-saved;或呼叫者使用,caller-used);以及被呼叫者使用(callee-used;或呼叫者保存,caller-saved)缓存器。编译器假设被呼叫者保存缓存器在函数呼叫过程中保持不变的值,若汇编程序设计人员希望使用这种缓存器,他们必须先将缓存器的值备份,然后在返回到C语言程序代码之前恢复这些缓存器的内容;相反的,被呼叫者使用缓存器被认为在函式呼叫过程中不会保持一定的值。这意味着汇编程序设计人员使用这些缓存器之前无需进行备份,不过他们必须记住,当汇编语言函数呼叫C语言函数时,被呼叫者可以对这些缓存器进行覆写。
下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- 单片机C语言和汇编语言混合编程实例详解 227次下载
- 如何使用DSP汇编语言实现高精度的三角函数 7次下载
- TMS320C6000汇编语言攻击V7.6用户指南 9次下载
- TMS320C28X处理器汇编语言工具用户指南 30次下载
- 汇编语言程序设计自学教程 41次下载
- C语言和汇编语言混合编程方法和C语言中断处理方法 36次下载
- 汇编语言学习课件_汇编语言程序组织 0次下载
- 汇编语言例 33次下载
- Assemble汇编语言设计技术 0次下载
- Linux中的汇编语言 55次下载
- 汇编语言自学教程
- DSP汇编语言编程基础
- MSP430单片机C语言和汇编语言混合编程
- 实验二DSP汇编语言编程基础
- 汇编语言程序设计下载 0次下载
- 汇编语言结构与8086概述 3237次阅读
- 汇编语言的变量与编码是什么 1794次阅读
- 计算机的机器语言和汇编语言与高级语言的详细资料介绍 5892次阅读
- C和汇编代码结合 是实现DSP软件设计的最好方式 2951次阅读
- 单片机 | 基础汇编语言编程实例 1w次阅读
- 汇编和C语言相结合的51单片机编程技巧 5844次阅读
- 单片机汇编语言常见错误知识点分析 6641次阅读
- 单片机闪烁灯汇编语言源代码大全(四款闪烁灯的汇编语言源代码) 2.5w次阅读
- 单片机流水灯汇编语言源代码大全(六款流水灯汇编语言源代码) 5.5w次阅读
- 高级语言和汇编语言_机器语言的区别 3w次阅读
- 学习开发环境和编程语言:汇编语言和C语言的比较 9079次阅读
- C语言与汇编语言相互结合的嵌套汇编语言 3541次阅读
- 跑马灯实验用汇编语言和C51语言做出的不同效果 4097次阅读
- 单片机编程之汇编语言基础-常用指令和程序模式 1.5w次阅读
- 汇编语言的结构化设计及其在俄罗斯方块中的应用 3083次阅读
下载排行
本周
- 1电子电路原理第七版PDF电子教材免费下载
- 0.00 MB | 1489次下载 | 免费
- 2单片机典型实例介绍
- 18.19 MB | 91次下载 | 1 积分
- 3S7-200PLC编程实例详细资料
- 1.17 MB | 27次下载 | 1 积分
- 4笔记本电脑主板的元件识别和讲解说明
- 4.28 MB | 18次下载 | 4 积分
- 5开关电源原理及各功能电路详解
- 0.38 MB | 9次下载 | 免费
- 6基于AT89C2051/4051单片机编程器的实验
- 0.11 MB | 4次下载 | 免费
- 7基于单片机和 SG3525的程控开关电源设计
- 0.23 MB | 3次下载 | 免费
- 8基于单片机的红外风扇遥控
- 0.23 MB | 3次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234313次下载 | 免费
- 2PADS 9.0 2009最新版 -下载
- 0.00 MB | 66304次下载 | 免费
- 3protel99下载protel99软件下载(中文版)
- 0.00 MB | 51209次下载 | 免费
- 4LabView 8.0 专业版下载 (3CD完整版)
- 0.00 MB | 51043次下载 | 免费
- 5555集成电路应用800例(新编版)
- 0.00 MB | 33562次下载 | 免费
- 6接口电路图大全
- 未知 | 30319次下载 | 免费
- 7Multisim 10下载Multisim 10 中文版
- 0.00 MB | 28588次下载 | 免费
- 8开关电源设计实例指南
- 未知 | 21539次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935053次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537791次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420026次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234313次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233045次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191183次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183277次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138039次下载 | 免费
电子发烧友App






创作
发文章
发帖
提问
发资料
发视频
上传资料赚积分
评论