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

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

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

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

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


当前回答

你好,我是一个编译器。

I just scanned thousands of lines of code while you were reading this sentence. I browsed through millions of possibilities of optimizing a single line of yours using hundreds of different optimization techniques based on a vast amount of academic research that you would spend years getting at. I won't feel any embarrassment, not even a slight ick, when I convert a three-line loop to thousands of instructions just to make it faster. I have no shame to go to great lengths of optimization or to do the dirtiest tricks. And if you don't want me to, maybe for a day or two, I'll behave and do it the way you like. I can transform the methods I'm using whenever you want, without even changing a single line of your code. I can even show you how your code would look in assembly, on different processor architectures and different operating systems and in different assembly conventions if you'd like. Yes, all in seconds. Because, you know, I can; and you know, you can't.

附言:哦,顺便说一下,你没有使用你写的一半代码。我帮了你一个忙,把它扔了。

其他回答

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

我喜欢用汇编语言编程,但是用高级语言做同样的事情需要更多的代码,而且代码行和错误之间有直接的联系。(这在几十年前的《人月神话》中就有解释。)

可以把C语言看作是“高级汇编”,但再往上走几步,你就进入了另一个世界。在c#中,你不需要三思就可以写这样的代码:

foreach (string s in listOfStrings) { /* do stuff */ }

这将是几十行,甚至几百行的汇编代码,每个实现它的程序员将采用不同的方法,下一个来的人将不得不找出它。因此,如果您相信(许多人都相信)程序主要是为其他人阅读而编写的,那么汇编的可读性就不如典型的HLL。

编辑:我积累了一个用于常见任务的个人代码库,以及用于实现类c控制结构的宏。但在90年代,当gui成为常态时,我遇到了瓶颈。太多的时间被花在了例行公事上。

我的上一个需要使用ASM的任务是在几年前,编写代码来对抗恶意软件。没有用户界面,所以只有有趣的部分,没有臃肿的部分。

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

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

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

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

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

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

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

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