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

use*_*312 6 c c++ assembly

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

什么不能在C/C++中完成,这在汇编语言代码混合时是可能的?

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

RBe*_*eig 14

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

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

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

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

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

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

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


rwo*_*ong 3

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

竞争优势。例如,如果您正在为(即将成为)世界第一的游戏公司编写软件。

有什么是 C/C++ 做不到的,而汇编语言代码混合时却可以做到的?

没有什么,除非需要某种绝对的性能水平,例如每秒 X 帧或每秒 Y 十亿个多边形。

编辑:根据其他回复,似乎一致认为嵌入式系统(iPhone、Android 等)具有肯定需要使用汇编的硬件加速器。

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

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

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

更新:

据传闻,《RollerCoaster Tycoon》99% 是用汇编语言编写的。
http://www.chrissawyergames.com/faq3.htm