学习汇编语言是否值得?

108

学习ASM仍然值得吗?

我有一点了解,但我没有真正使用过或正确学习它,因为我用C或C++之类的语言可以在十分之一的时间内完成汇编器所能实现的所有功能。那么,我真的需要学习和使用ASM吗?它会对我的职业发展有所帮助吗?它会提高我的资源利用率吗?简单来说,它会让我成为更好的程序员吗?

注意:我谈论的是像FASMNASM这样的低级汇编,而不是像HLA(高级汇编语言)这样的东西。


2
请注意,汇编语言与处理器/控制器紧密相关。 - rmflow
9
这是什么意思,它不支持跨平台?!! - ApprenticeHacker
不。例如:http://www.worldofspectrum.org/Z80instructions.html - rmflow
3
每种处理器都有自己独特的汇编语言?!!! - ApprenticeHacker
6
每个处理器“家族”都有不同的汇编语言。386代码可以在任何后来的x86处理器上运行,包括英特尔和AMD的产品——但某些功能集是专有扩展。这些额外指令的“语言”相同,但生成的二进制代码不可移植。 - spraff
4
我迟到了九年,但是我发现这个评论区中损伤的讽刺探测器真的很痛苦 :( - HFBrowning
7个回答

125

我从Kip Irvine的书中学到了一些东西。如果你忽略他(不相关的)库的(公正的)批评,我可以推荐它作为语言本身的良好入门--尽管对于真正有趣的东西,你必须在网络上寻找痴迷者。

我认为理解底层发生的事情很有用。当您研究汇编语言时,您将了解CPU流水线,分支预测,缓存对齐,SIMD,指令重新排序等内容。了解这些知识将有助于您编写更好的高级代码。

此外,传统智慧是大多数情况下不要尝试手动优化汇编语言,而是让编译器来操心。当您看到编译器生成的扭曲示例时,您将更好地理解为什么传统智慧如此重要。

例如:LFSR在使用带进位旋转指令时运行速度很快,对于这种特定情况,编写汇编版本与发现编译器是否聪明到足以解决问题一样容易。有时候你知道某些东西,而编译器却不知道。

它还增加了您对安全问题的理解--写入或执行,堆栈溢出等。

有些并发问题只有在您了解每个指令级别上发生了什么时才会变得明显。

有时在调试时,如果没有完整的源代码,这可能很有用。
有一些好奇的价值。虚函数实际上是如何实现的?你曾经尝试过用汇编语言编写DirectX或COM程序吗?大型结构体如何返回,调用函数是否提供空间还是相反?
然后,还有专门为图形硬件设计的汇编语言,尽管着色器语言几年前就变得高级了,但任何能让您以不同方式思考问题的东西都是好的。

11
写得好 +1。学习和使用是两个不同的事情,学习它是个好主意,何时或是否使用它则需要经验。 - old_timer
1
举个例子,Linus Torvalds使用反汇编器来调试他的代码,因此我认为他对x86汇编有很好的了解。 - user2188550

62

我认为很有趣的是许多人都会说是的,你需要或应该学习汇编语言。对我来说,问题是 你需要知道多少汇编语言? 我不认为你必须像编程语言一样了解汇编语言,也就是说,我不相信每个人都应该能够用汇编语言编写程序,但另一方面,能够阅读和理解其实际意义(这可能需要更多关于体系结构的知识而非汇编器)已经足够了。

我肯定不能编写汇编语言(即在汇编语言中编写任何非平凡的代码),但我可以阅读它,并且结合实际硬件架构的知识和正在使用的调用约定,足以分析性能并确定哪些C++代码段是汇编代码的来源。


4
你的意思是我只需要学习基本的 push,pop,mov 和 invoke 指令? - ApprenticeHacker
12
我同意,学习汇编语言的必要性很大程度上取决于你所从事的编程领域。网页、桌面应用或数据库?忘记汇编吧。电脑游戏和图形处理?有点用处。操作系统开发或实时嵌入式系统?必须要学。等等。 - Lundin
1
你误解了其他答案 - 没有人说你需要/应该学习汇编语言;只是根据问题,它是有用的或值得学习的。不过你的回答仍然相关。 - Luc Danton
1
@burningprodigy:我认为你应该对你使用的汇编语言指令有一些基本的了解(即参数的顺序等),并且对一些命令有一些非常基本的理解,例如 load 或 store 是什么。然后,如果你需要查看某个汇编代码片段,你可以使用参考资料来理解每个指令,通过这样做,你将开始学习所需的基础知识。 - David Rodríguez - dribeas
1
我同意。特别是只知道汇编语言,最多只能对现代CPU的效率评估有所了解。如果这是目标,一些基本的汇编语言知识和计算机体系结构的基础将更加有用。大多数时候,我需要汇编语言是为了查看优化程序的转储,或者出于兴趣(例如安全性问题、编写迷你内核等)。但我记不起上次因为汇编语言知识而改变了某些设计决策。 - Voo

33

是的 - 学习汇编语言对于C和C++开发人员的主要原因在于它有助于理解C和C++代码背后的运行机制。这并不意味着你实际上会用汇编语言来编写代码,但你将能够查看代码的反汇编以评估其效率,并且你将更好地理解不同的C和C++功能是如何工作的。


27

学习许多不同语言及其所属的不同范例是值得的。学习Java、C++、C#和Python等语言并不能算作是学习不同范例,因为它们都属于相同的范例。

由于汇编语言位于所有语言的根基(或者说靠近根基),因此我认为学习汇编语言是值得的。

然而,学习一种函数式编程语言、逻辑编程、脚本语言以及数学相关的语言也是值得的。由于时间有限,你必须进行选择。


1
然后,当你最终学会了它们并认为你已经看到了发生了什么,你会发现J - Micha Wiedenmann

5

了解汇编语言对于调试也很有用,因为有时你只有“错误的汇编转储”。


4

取决于您希望达到哪个编程水平。 如果您需要使用调试器,则是的。 如果您需要了解编译器的工作原理,则是的。 任何汇编器/调试器都与CPU有关,因此有很多工作要做,只需检查x86系列的规模和历史就知道了。


也许你的意思是基于CPU家族的依赖? - Unicorn

2
你计划做的事情中有没有任何用处?它是否能在你目前所做或计划要做的事情上帮助你?这是你应该问自己的两个问题,这些答案就是你的问题的答案。
更加普遍地说,我认为学习汇编语言(例如x86或arm)非常值得,它对你的服务程度取决于你编程的内容和你如何调试它。

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