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

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

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

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

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


当前回答

其他人说的大多都是这样。

在C语言发明之前的美好时光里,当唯一的高级语言是像COBOL和FORTRAN这样的东西时,有很多事情不借助汇编程序是不可能完成的。这是获得全面灵活性的唯一方法,能够访问所有设备等等。但是后来C语言被发明了,在C语言中,几乎所有在汇编中可能实现的事情都可以实现。从那以后,我很少写汇编。

也就是说,我认为这是一个非常有用的练习,新程序员学习编写汇编程序。不是因为他们会经常使用它,而是因为这样你就能理解计算机内部到底发生了什么。我见过很多编程错误和低效的代码,它们来自程序员,他们显然不知道比特、字节和寄存器到底发生了什么。

其他回答

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攻击,反之亦然。

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

我现在正在comp组织学习汇编,虽然它很有趣,但它也非常低效。你必须在脑子里记住更多的细节才能让事情顺利进行,而且写同样的东西也会慢一些。例如,c++中一个简单的6行For循环可以等于18行或更多的汇编。

就我个人而言,学习硬件层面的工作方式非常有趣,它让我对计算的工作方式有了更多的了解。

合理水平的汇编能力是一项有用的技能,特别是当您从事任何类型的系统级或嵌入式编程时,这并不是因为您必须编写那么多汇编程序,而是因为有时了解盒子的实际功能非常重要。如果您对汇编程序的概念和问题没有低级的理解,这可能会非常困难。

然而,至于在汇编器中实际编写大量代码,有几个原因导致它做得不多。

There's simply no (almost) need. Except for something like the very early system initialization and perhaps a few assembler fragments hidden in C functions or macros, all very low-level code that might once have been written in assembler can be written in C or C++ with no difficulty. Code in higher-level languages (even C and C++) condenses functionality into far fewer lines, and there is considerable research showing that the number of bugs correlates with the number of lines of source code. Ie, the same problem, solved in assembler and C, will have more bugs in assembler simply because its longer. The same argument motivates the move to higher level languages such as Perl, Python, etc. Writing in assembler, you have to deal with every single aspect of the problem, from detailed memory layout, instruction selection, algorithm choices, stack management, etc. Higher level languages take all this away from you, which is why are so much denser in terms of LOC.

从本质上讲,以上所有内容都与汇编程序与C或其他语言中可用的抽象级别有关。汇编程序迫使您自己制作所有的抽象,并通过您自己的自律来维护它们,而任何中级语言,如C,特别是高级语言,都可以为您提供开箱即用的抽象,以及相对容易地创建新抽象的能力。

不同之处在于,汇编程序是一门代码的艺术,是一幅出自艺术家之手的好画。你比蹩脚的编译器代码聪明吗?如果你是,使用它或照顾你的绘画与c和汇编一起。

跟我们不再去外面厕所的原因一样,也跟我们不再说拉丁语和阿拉姆语的原因一样。

技术的出现使事情变得更容易,更容易获得。

编辑——为了不冒犯别人,我删除了某些词语。