汇编编程比高级语言(如c)花费更长的时间,更难编程,这似乎是一种主流观点。因此,出于这些原因以及更好的可移植性,似乎建议或假设用高级语言编写更好。

最近我一直在用x86汇编语言写作,我开始意识到这些原因可能都不是真的,除了可移植性。也许这更多的是一个熟悉的问题,知道如何写好汇编。我还注意到在汇编中编程与在HLL中编程有很大的不同。也许一个好的、有经验的汇编程序员可以像一个有经验的C程序员用C写程序一样轻松、快速地编写程序。

也许是因为汇编编程与hll有很大的不同,因此需要不同的思维、方法和方式,这使得对不熟悉的人编写程序看起来非常尴尬,因此给汇编编程带来了不好的名声。

如果可移植性不是问题,那么C语言比NASM这样的优秀汇编器有什么优势呢?

编辑: 我只是想指出。当你用汇编语言写作时,你不必只写指令代码。您可以使用宏、过程和您自己的约定来进行各种抽象,使程序更模块化、更可维护、更易于阅读。这就是熟悉如何编写好的汇编的原因。


当前回答

Oh hai, I'm a dataflow system. This App I'm running, are full of varrrious components. It's a distributed app, and it resides in 3 computers, on a powerful x86 and two smaller ARMs. Most of the components are written in C++, but there is a critical one written in ASM for the x86. Also, most components have several variations: compiled for different processors, also some components have special GPU versions. Shame or not, I have a script component (a wrapper component calls a script), which prints report, but only once a year. It doesn't even hurt that it's just a script, a slow script.

作为一个智能数据流应用程序,我知道,我的架构只适合特定的任务,其中信号/数据通过图形流动,例如自动化,视频/图像处理,音频处理(所有合成器使用数据流),但幸运的是,这些应用领域是非常需要功率的,其中优化是必不可少的。

我很确定有一天会出现一些其他的架构,它们也是关于优化(以及其他让编程更容易等的东西),它们将能够覆盖更多或其他领域,而我,数据流不能。

因此,“C vs ASM”的话题并不是一个真正的困境。这就像是在争论数字合成器还是模拟合成器更好(就像我之前提到的,我一直在研究合成器)。我建议,做好听的音乐。或倾听。无论什么。C不是相对于ASM。无论如何,我从未见过一个C程序被ASM攻击,反之亦然。

对不起,我的英语不好,尽管我不是一个新技术,我不是广为人知,我是一个孩子。很有希望。来,看看我的资料!

其他回答

C语言优于一个好的宏汇编器的地方是C语言类型检查。循环结构。自动栈管理。(几乎)自动变量管理。动态内存技术在汇编是一个巨大的痛苦在屁股。与C或更好的foo.insert()列表相比,正确地执行链表是非常可怕的。还有调试——嗯,谁更容易调试谁也不存在争议。他们在那儿轻而易举就赢了。

我几乎一半的职业生涯都是用汇编程序编写的,这让我很容易用汇编程序思考。它帮助我了解C编译器在做什么,这再次帮助我编写C编译器可以有效处理的代码。用C编写的一个经过深思熟虑的例程可以在汇编程序中输出你想要的东西——而且它是可移植的!由于跨平台的原因,我已经不得不将一些旧的asm例程重写回C,这并不有趣。

不,我将坚持使用C,并处理与使用HLL获得的生产时间相比偶尔出现的轻微性能放缓。

早期的发现之一(你可以在布鲁克斯的《神秘的人月》中找到,这是20世纪60年代的经验)是,人们使用一种语言的效率或多或少与使用另一种语言的效率一样高,每天调试的代码行数也差不多。显然,这并不是普遍的事实,如果做得太过分,可能会崩溃,但对于Brooks时代的高级语言来说,这是普遍的事实。

因此,提高工作效率的最快方法是使用一行代码就能做更多工作的语言,这确实有效,至少对于像FORTRAN和COBOL这样复杂的语言,或者给出一个更现代的例子C。

C是一个宏汇编器!这是最好的一个!

它可以做几乎所有汇编程序可以做的事情,它是可移植的,在大多数极少数情况下,当它不能做一些事情时,你仍然可以使用嵌入式汇编代码。这就只留下了一小部分程序,你绝对需要用汇编来编写,而且只需要汇编。

更高层次的抽象和可移植性使大多数人更值得用c语言编写系统软件。尽管你现在可能不需要可移植性,但如果你在编写某个程序上投入了大量的时间和金钱,你可能不想把自己限制在将来可以使用它的地方。

我相信有很多原因,但我能想到的两个原因是

汇编代码肯定更难读(我肯定编写它也更耗时) 当您有一个庞大的开发团队在开发一个产品时,将代码划分为逻辑块并通过接口进行保护是很有帮助的。

与高级语言相比,ASM的易读性很差,而且实际上难以维护。

此外,ASM开发人员比其他更流行的语言(如C)要少得多。

此外,如果您使用高级语言,并且有新的ASM指令可用(例如SSE),您只需要更新您的编译器,您的旧代码就可以轻松使用新的指令。

如果下一个CPU有两倍多的寄存器呢?

这个问题的反义词是:编译器提供了什么功能?

我怀疑你能够/想要/应该比gcc -O3更好地优化你的ASM。