学习汇编语言是否值得?

App*_*ker 85 assembly programming-languages nasm

学习ASM还值得吗?

我知道一点,但我还没有真正使用它或者正确地学习它,因为我在汇编程序中学到的一切都可以用1/10的时间用C或C++这样的语言来完成.那么,我应该真正学习和使用ASM吗?这对我有什么好的专业吗?它会增加我的机智吗?总之,它会让我成为更好的程序员吗?

注意:我说的是像FASMNASM这样的低级程序集,而不是像HLA(高级汇编程序)这样的程序.

spr*_*aff 99

我从Kip Irvine的书中学到了很多东西.如果你忽略对他(无关)图书馆的(公平)批评,我可以推荐它作为语言本身的一个很好的介绍 - 虽然对于真正有趣的东西你必须在网上搜寻迷恋.

我认为理解较低层次发生的事情是有用的.在研究汇编程序时,您将学习cpu流水线,分支预测,缓存对齐,SIMD,指令重新排序等.了解这些将有助于您编写更好的高级代码.

此外,传统观点是不要试图在大多数时间手动优化装配,而是让编译器担心它.当你看到编译器产生的扭曲事物的一些例子时,你将更好地理解为什么传统智慧成立.

示例:LFSR使用rotate-with-carry指令快速运行,对于这样的特定情况,编写汇编程序版本就像发现编译器是否足够聪明以便弄清楚它一样容易.有时您只知道编译器没有的东西.

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

当您意识到每个指令级别发生的情况时,一些并发问题才会变得明显.

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

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

然后有图形硬件的特殊汇编语言,虽然几年前着色器语言很高级,任何让你以不同的方式思考问题的东西都是好的.

  • 写得好的答案+1.学习和使用是两个不同的东西,学习它是一个好主意,何时/如果使用它带来经验. (7认同)

Dav*_*eas 49

我觉得有趣的是,很多人都会说是的,你需要/应该学习装配.对我来说,问题是你需要知道多少装配?我不认为你必须像编程语言一样知道汇编,也就是说我不相信每个人都应该能够在汇编中编写程序,但另一方面,能够阅读它并理解它实际上是什么意味着(可能需要更多的架构知识而不是汇编程序)就足够了.

我肯定不能编写程序集(即在程序集中编写任何非常重要的代码段),但我可以阅读它,并且与实际硬件体系结构的知识一起,以及正在使用的调用约定足以分析性能,以及确定哪个C++代码是该程序集的源代码.

  • 我同意,了解组装的必要性很大程度上取决于您正在使用的编程分支.网络/桌面/数据库?忘了汇编.电脑游戏和图形?它可能有点方便.OS开发还是实时嵌入式系统?这是必须的.等等. (9认同)
  • 你的意思是我应该学习基本的**push,pop,mov和invoke**命令? (4认同)

sha*_*oth 25

是的 - 为C和C++开发人员学习汇编的主要原因是它有助于理解C和C++代码下的内容.这并不是说您将在汇编中实际编写代码,但是您将能够查看代码反汇编来评估其效率,并且您将了解不同的C和C++功能如何更好地工作.


Dav*_*men 22

从许多不同的范例中学习许多不同的语言是值得的.学习Java,C++,C#和Python不算数,因为它们都是相同范例的实例.

由于汇编是在所有语言的根(好,靠近根),我有人说,学习汇编是值得的.

再说一次,学习函数式编程语言,逻辑编程,脚本语言,基于数学的语言是值得的.你只有这么多时间,所以你必须挑选.


ain*_*ain 5

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