为什么汇编语言代码经常需要与C / C ++一起使用?
在汇编语言代码混合的情况下,在C / C ++中无法做什么?
我有一些3D电脑游戏的源代码。有很多汇编代码在使用。
答案 0 :(得分:14)
想到的东西,没有特别的顺序:
特别说明。在嵌入式应用程序中,我需要在DMA传输填充内存缓冲区后使缓存无效。在SH-4 CPU上执行此操作的唯一方法是执行特殊指令,因此内联汇编(或独立汇编功能)是唯一的方法。
优化。曾几何时,编译器通常不知道可能做的每一个技巧。在某些情况下,用手工制作的版本替换内环是值得的。关于在小型嵌入式系统中可以找到的各种CPU(例如8051,PIC等),将内部循环推入装配是很有价值的。我要强调的是,对于具有流水线,多问题执行,广泛缓存等的现代处理器,手动编码甚至难以接近优化器的功能。
中断处理。在嵌入式应用程序中,通常需要捕获系统事件,例如中断和异常。通常情况下,中断执行的前几条指令具有特殊的职责,并且保证正确事情发生的唯一方法是在汇编中编写处理程序的外层。例如,在ColdFire(或68000的任何后代)上,只保证执行第一条指令。为了防止嵌套中断,该指令必须修改中断优先级以屏蔽当前中断的优先级。
操作系统内核的某些部分。例如,任务切换要求为当前任务和为新任务加载的状态保存执行状态(至少大多数寄存器,包括PC和堆栈指针)。摆弄CPU的执行状态远远超出了语言的功能集,但可以用少量的汇编代码包装,允许内核的其余部分用C或C ++编写。
编辑:我已经提到了有关优化的措辞。让我强调的是,对于具有大量用户群和具有良好优化的良好支持的编译器的目标,汇编编码器极不可能击败优化器的性能。
在尝试之前,先仔细分析以确定瓶颈所在的位置。有了这些信息,仔细检查假设和算法,因为所有的最佳优化通常是找到更好的方法来处理更大的图片。然后,如果所有其他方法都失败了,请在测试用例中隔离瓶颈,仔细对其进行基准测试,然后开始在程序集中进行调整。
答案 1 :(得分:3)
过去,编译器在优化特定体系结构时往往很差,而且过去的体系结构更简单。现在情况正好相反。目前,对于深度流水线化的分支预测处理器,人类编写比优化编译器更好的汇编非常困难。所以你不会看到太多。什么是短暂的,高度针对性的。
简而言之,您可能不需要这样做。如果您认为自己这样做,请对您的代码进行分析,以确保您已确定hotspot - 如果您只花费0.1%的执行时间,则不要因为速度慢而优化。看看你是否可以改进你的设计或算法。如果您在那里找不到任何改进,或者您需要更高级语言未公开的功能,请查看手动编码程序集。
答案 2 :(得分:3)
某些事情只能在汇编程序中完成,而不能在C / C ++中完成。
这些包括:
你也可以在汇编程序中比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)
值得一提的另一件事是:
答案 7 :(得分:-1)
汇编可能比任何编译器在某些情况下都可以生成的最佳。