使用c / c ++混合汇编程序代码

时间:2010-09-04 19:15:28

标签: c++ c assembly

为什么汇编语言代码经常需要与C / C ++一起使用?

在汇编语言代码混合的情况下,在C / C ++中无法做什么?

我有一些3D电脑游戏的源代码。有很多汇编代码在使用。

8 个答案:

答案 0 :(得分:14)

想到的东西,没有特别的顺序:

  • 特别说明。在嵌入式应用程序中,我需要在DMA传输填充内存缓冲区后使缓存无效。在SH-4 CPU上执行此操作的唯一方法是执行特殊指令,因此内联汇编(或独立汇编功能)是唯一的方法。

  • 优化。曾几何时,编译器通常不知道可能做的每一个技巧。在某些情况下,用手工制作的版本替换内环是值得的。关于在小型嵌入式系统中可以找到的各种CPU(例如8051,PIC等),将内部循环推入装配是很有价值的。我要强调的是,对于具有流水线,多问题执行,广泛缓存等的现代处理器,手动编码甚至难以接近优化器的功能。

  • 中断处理。在嵌入式应用程序中,通常需要捕获系统事件,例如中断和异常。通常情况下,中断执行的前几条指令具有特殊的职责,并且保证正确事情发生的唯一方法是在汇编中编写处理程序的外层。例如,在ColdFire(或68000的任何后代)上,只保证执行第一条指令。为了防止嵌套中断,该指令必须修改中断优先级以屏蔽当前中断的优先级。

  • 操作系统内核的某些部分。例如,任务切换要求为当前任务和为新任务加载的状态保存执行状态(至少大多数寄存器,包括PC和堆栈指针)。摆弄CPU的执行状态远远超出了语言的功能集,但可以用少量的汇编代码包装,允许内核的其余部分用C或C ++编写。

编辑:我已经提到了有关优化的措辞。让我强调的是,对于具有大量用户群和具有良好优化的良好支持的编译器的目标,汇编编码器极不可能击败优化器的性能。

在尝试之前,先仔细分析以确定瓶颈所在的位置。有了这些信息,仔细检查假设和算法,因为所有的最佳优化通常是找到更好的方法来处理更大的图片。然后,如果所有其他方法都失败了,请在测试用例中隔离瓶颈,仔细对其进行基准测试,然后开始在程序集中进行调整。

答案 1 :(得分:3)

过去,编译器在优化特定体系结构时往往很差,而且过去的体系结构更简单。现在情况正好相反。目前,对于深度流水线化的分支预测处理器,人类​​编写比优化编译器更好的汇编非常困难。所以你不会看到太多。什么是短暂的,高度针对性的。

简而言之,您可能不需要这样做。如果您认为自己这样做,请对您的代码进行分析,以确保您已确定hotspot - 如果您只花费0.1%的执行时间,则不要因为速度慢而优化。看看你是否可以改进你的设计或算法。如果您在那里找不到任何改进,或者您需要更高级语言未公开的功能,请查看手动编码程序集。

答案 2 :(得分:3)

某些事情只能在汇编程序中完成,而不能在C / C ++中完成。

这些包括:

  1. 生成软件中断(SWI或INT指令)
  2. 使用SWP等指令创建互斥锁
  3. 专家coporcessor指令(例如编程MMU和管理RAM缓存所需的指令)
  4. 访问携带和溢出标志。
  5. 你也可以在汇编程序中比C / C ++更好地优化代码(例如Android上的memcpy是用汇编程序编写的)

答案 3 :(得分:2)

可能有新的指令,您的编译器无法生成,或者编译器执行不好,或者您可能需要直接控制CPU。

答案 4 :(得分:2)

  

为什么常常使用汇编语言代码   需要与C / C ++一起使用吗?

竞争优势。就像,如果你正在为世界上(即将成为)#1游戏公司编写软件。

  

在C / C ++中无法做到的是什么   汇编语言代码时可能   是混合?

没有,除非需要一些绝对的性能水平,比如每秒X帧或每秒数十亿的多边形。

编辑:基于其他回复,似乎共识是嵌入式系统(iPhone,Android等)具有肯定需要使用汇编的硬件加速器。

  

我有一些3D的源代码   电脑游戏。有很多的   正在使用的汇编代码。

它们要么是在80年代到90年代写的,要么在游戏引擎中谨慎使用(可能是总源代码的1%-5%)。

编辑:到这个日期,编译器的自动矢量化质量仍然很差。因此,您可能会看到包含向量化内在函数的程序,并且因为它与实际程序集中的写入没有太大区别(大多数内在函数都只有一个映射到汇编指令),有些人可能只是决定在汇编中编写。

<强>更新

根据轶事证据,RollerCoaster Tycoon以99%的成绩编写 http://www.chrissawyergames.com/faq3.htm

答案 5 :(得分:1)

  

为什么常常使用汇编语言代码   需要与C / C ++一起使用?还需要C / C ++吗?

不是

  

在C / C ++中无法做到的是什么   汇编语言代码时可能   是混合?

访问CPU上的系统寄存器或IO端口。 访问BIOS功能。 使用不直接映射到编程语言的专用指令, 例如SIMD指示。 提供优于编译器生成的优化代码。

除非您正在编写操作系统或代码,否则通常不需要的两个第一点 在没有操作系统的情况下运行。

现代CPU非常复杂,您很难找到实际上可以编写汇编而不是编译器生成的人。许多编译器都带有可供您访问的库 更高级的功能,如SIMD指令,所以现在你通常不需要回头 为此装配。

答案 6 :(得分:1)

值得一提的另一件事是:

  • C&amp;当需要使用脚本语言实现二进制级别的互操作时,C ++不提供任何方便的方法来设置堆栈帧 - 或者为闭包实现某种支持。

答案 7 :(得分:-1)

汇编可能比任何编译器在某些情况下都可以生成的最佳。