你为什么要使用汇编语言进行编程?

89

我有一个问题想问所有热衷于低级黑客技术的人。我在一篇博客中看到了这句话。我认为源并不重要(如果你真的在意,它是Haack),因为这似乎是一个常见的说法。

例如,许多现代三维游戏都使用C++和汇编语言编写其高性能核心引擎。

至于汇编代码-是因为您不希望编译器发出额外的指令或使用过多的字节,还是因为您在使用更好的算法,这些算法无法用C语言表达(或无法表达而不被编译器干扰)?

我完全理解了解低级别的东西的重要性。我只是想了解为什么在了解了它之后要在汇编中编程。


1
已经有类似的问题了,我想... - Mehrdad Afshari
8
嗯,严格来说这是一个不同的问题。那些问题都是关于为什么要学习汇编语言,而这个问题是为什么要用它来编程,我认为这是不同的……? - cgp
4
你为什么使用汇编语言进行编程?--让我们来看一些不可能的答案:1)为了使我的代码可维护,2)灵活性,3)确保可移植性,4)可测试性,5)可读性... - ivan_ivanovich_ivanoff
9
工作保障 - San Jacinto
3
因为这很有趣.. :) - RainingComputers
显示剩余4条评论
30个回答

2
在现代游戏开发中,似乎没有提到,所以我想补充一下:我认为至少有一些汇编代码的编写并不是针对 CPU 的,而是针对 GPU,以 着色器程序 的形式。
这可能是出于各种原因需要的,有时仅仅是因为使用的高级着色语言无法表达所需的确切操作次数,以适应某些大小限制、速度或任何组合。我猜这和通常的汇编语言编程一样。

2
几乎每个中大型游戏引擎或库现在都有一些手工优化的汇编版本可用于矩阵操作,例如4x4矩阵连接。当使用大型矩阵时,编译器无法避免地会错过一些巧妙的优化(如重复使用寄存器,在最大效率的方式下展开循环,利用机器特定指令等)。这些矩阵操作函数几乎总是性能分析的“热点”。
我也经常看到手写汇编用于自定义调度——像FastDelegate这样的东西,但是它与编译器和机器有关。
最后,如果你有中断服务例程,汇编可以改变一切——有些操作你只想在中断期间发生,而且你希望你的中断处理程序“快速进入和快速退出”……如果它是以汇编语言编写的,你几乎可以确切地知道在ISR中将要发生什么,这鼓励你保持简洁的代码(这也是一个很好的实践)。

2

我只与一名开发者谈过他在汇编语言方面的使用。

他正在为一个便携式mp3播放器的控制固件工作。

使用汇编语言有两个目的:

  1. 速度:需要最小化延迟。
  2. 成本:通过最小化代码,运行所需的硬件可以稍微低功率。当生产数百万台时,这可能会累加。

1
我曾经接手一个DSP项目,前一位程序员主要使用汇编语言编写了大部分代码,除了音调检测逻辑是用C语言编写的,而且还使用了浮点数(在定点DSP上!)。音调检测逻辑运行速度约为实时速度的1/20。
最终,我几乎从零开始重写了所有内容。几乎所有内容都是用C语言编写的,除了一些小的中断处理程序和与低级频率检测相关的几十行代码,这些代码的运行速度比旧代码快100倍以上。
我认为需要牢记的一件重要事情是,在许多情况下,与大型例程相比,小型例程有更大的加速机会,特别是如果手写汇编可以将所有内容都放入寄存器中,而编译器则无法完全管理。如果循环足够大以至于无法将所有内容都保留在寄存器中,那么改进的机会就会少得多。

1
不再是速度,而是控制。速度有时会来自于控制,但这是使用汇编语言的唯一原因。其他所有原因都归结为控制(例如SSE和其他手动优化、设备驱动程序和设备相关代码等)。

1

我继续编写的唯一汇编代码是为了具有有限资源的嵌入式硬件。正如leander所提到的,汇编仍然非常适用于中断处理程序,其中代码需要快速且易于理解。

对我来说,第二个原因是保持我的汇编知识功能性。能够检查和理解CPU执行我的命令所采取的步骤感觉很好。


1

如果我能够比GCC和Visual C++ 2008(也称为Visual C++ 9.0)表现更优秀,那么人们会对如何做到这一点感兴趣。

这就是为什么目前我只是阅读汇编代码,并在必要时写入__asm int 3的原因。

希望这有所帮助...


1

我已经有几年没有写汇编代码了,但我曾经写汇编代码的两个原因是:

  • 它很有挑战性!几年前的某段时间里,我会用 x86 汇编语言 写所有的东西(那时候是 DOS 和 Windows 3.1 的时代)。这基本上教会了我许多低级操作、硬件 I/O 等知识。
  • 对于某些事情来说,它可以保持代码尺寸较小(再次提到 DOS 和 Windows 3.1 以及写 TSRs 时)

我一直在考虑重新开始写汇编代码,但这只是为了迎接挑战和享受过程的乐趣。我没有其他理由去这样做 :-)


0

在安卓手机上解释Java应用程序的字节码的Dalvik虚拟机使用汇编语言作为调度程序。这个电影(大约31分钟,但是值得观看整部电影!)解释了:

“仍然有一些情况,人比编译器做得更好。”


0
我目前还没有学过,但我已经决定至少尝试一下,并在不久的将来努力学习(希望很快)。了解更多底层知识和编程高级语言背后的工作原理肯定是件好事。不幸的是,全职开发/咨询工作和育儿使得时间非常紧张。但我一定会在适当的时候尝试学习。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接