学习汇编语言值得吗?[关闭]


92

学习ASM仍然值得吗?

我对它了解得很少,但是我并没有真正使用它或正确学习它,因为我学习的所有汇编程序工作都可以用诸如C或C ++之类的语言在1/10的时间内完成。那么,我真的应该学习和使用ASM吗?这对我的专业有好处吗?会增加我的机智吗?简而言之,这会让我成为一个更好的程序员吗?

注意:我在说的是FASMNASM之类的低级汇编,而不是HLA(高级汇编器)。


2
注意,该汇编语言与处理器/控制器绑定在一起。
rmflow 2011年

7
您是不是跨平台的?!
ApprenticeHacker


2
好的,所以每个处理器都有不同的汇编语言。
ApprenticeHacker

3
每个处理器系列使用不同的汇编语言。386代码可以在任何后来的x86处理器(包括Intel和AMD的产品)上运行-但某些功能集是专有扩展。这些额外指令的语言相同,但生成的二进制文件不可移植。
spraff 2011年

Answers:


107

我从基普·欧文的书中学到了东西。如果您无视他的(无关的)库的(公正)批评,我可以推荐它作为对语言本身的一个很好的介绍-尽管对于真正有趣的东西,您必须在网络上寻找迷恋者。

我认为了解较低级别的情况很有用。在研究汇编程序时,您将了解有关CPU流水线,分支预测,缓存对齐,SIMD,指令重新排序等的信息。这些知识将帮助您编写更好的高级代码。

此外,传统的观点是,大多数时候不尝试手动优化汇编,而是让编译器担心它。当您看到一些有关编译器产生的扭曲事物的示例时,您将更好地理解为什么传统观点仍然成立。

示例:LFSR使用随身携带的旋转指令快速运行,对于像这样的特定情况,编写汇编程序版本就像发现编译器是否足够聪明来找出它一样容易。有时您只知道编译器不知道的东西

它还使您对安全问题(写入或执行,堆栈溢出等)有所了解。

仅当您了解每条指令级别发生了什么时,某些并发问题才变得明显。

如果您没有完整的源代码,有时在调试时很有用。

有好奇心的价值。无论如何如何实现虚拟功能?是否曾经尝试在汇编器中编写DirectX或COM程序?大型结构如何返回,调用函数是否为其提供了空间,反之亦然?

还有一些用于图形硬件的特殊汇编语言,尽管着色器语言在几年前已成为高级语言,但任何可以让您以不同方式思考问题的方法都是不错的。


7
写得好答案+1。学习和使用是两件事,学习是一个好主意,何时/是否使用它会带来经验。
old_timer 2011年

举个例子,Linus Torvalds使用一个反汇编程序来调试他的代码,因此我认为他对x86汇编有很好的了解。
伊万津尼奥(Ivanzinho)

52

我发现有趣的是,许多人跳来跳去地说,是的,您需要/应该学习汇编。对我来说,问题是您需要知道多少组装?我认为您不必像编程语言一样了解汇编语言,也就是说,我不认为每个人都应该能够以汇编语言编写程序,但是另一方面,您可以阅读并理解其实际含义手段(可能需要比汇编程序更多的体系结构知识)就足够了。

我肯定不能编写汇编程序(即,在汇编程序中编写任何非平凡的代码段),但是我可以阅读它,并且与实际的硬件体系结构知识一起使用,并且所使用的调用约定足以分析性能,并且确定该程序集的源代码是什么C ++代码。


4
您的意思是我应该只学习基本的push,pop,mov和invoke命令?
ApprenticeHacker

10
我同意,了解汇编的需求在很大程度上取决于您所使用的编程分支。Web /桌面/数据库?忘记汇编器。电脑游戏和图形?它可能有点方便。OS开发还是实时嵌入式系统?这是必须的。等等。
伦丁

1
您误解了其他答案-没有人说您需要/应该学习组装;根据问题,只是有用或值得。您的答案仍然有意义。
卢克·丹顿

1
@burningprodigy:我相信您应该对使用的汇编程序中的指令有一些基本的了解(即参数的顺序等),并对一些命令有非常基本的了解,如何加载或一家商店。然后,如果您需要看一些组装件,则可以使用参考来理解其中的每条说明,然后您将开始学习所需的基础知识。
大卫·罗德里格斯(DavidRodríguez)-dribeas 2011年

1
我同意。特别是,只有了解汇编才能对评估现代CPU的效率产生最大的帮助。如果这是目标,那么汇编的一些基本知识以及相当多的计算机体系结构基础知识就会更有用。大多数时候,我需要汇编的地方是浏览经过优化的程序的转储,或者找乐子(例如,安全性,编写迷你内核等)。但是我不记得上次由于装配知识而更改了一些设计决策。
Voo

27

是的-为C和C ++开发人员学习汇编的主要原因是,它有助于理解C和C ++代码的内幕。这并不是说您实际上将代码编写为汇编语言,而是您可以查看代码反汇编以评估其效率,并且您将了解不同的C和C ++功能如何更好地工作。


23

值得从许多不同的范例中学习许多不同的语言。学习Java,C ++,C#和Python并不重要,因为它们都是同一范例的实例。

因为汇编语言是所有语言的根本(很接近词根),所以我不得不说学习汇编是值得的。

再说一次,值得学习一种函数式编程语言,逻辑编程,脚本语言,基于数学的语言。您只有很多时间,因此您必须选择。


然后,当你终于学会了所有这些,想你是怎么回事的一瞥,你会发现Ĵ
Micha Wiedenmann

4

调试时了解ASM也很有用,因为有时您所拥有的只是“错误的ASM转储”。


2

您打算将其用于任何用途吗?它会在您目前或计划做的事情上以任何方式帮助您吗?这些是您应该问自己的两个问题,答案是您的问题的答案。

从更一般的意义上讲,是的,我认为值得学习asm(例如x86或arm),它对您的服务有多好取决于您的编程内容和调试方式。


2

取决于您希望达到的编程级别。 如果您需要使用调试器,则可以。如果您需要了解编译器的工作原理,则可以。任何汇编器/调试器都依赖于CPU,因此需要进行大量工作,只需检查x86系列的大小即可。


也许您是说依赖CPU系列?
罗密诺
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.