2011-07-08 206 views
64

还值得学习ASM学习汇编语言是否值得?

我对它有一点了解,但是我没有真正使用过它,或者没有正确地学习它,因为我在汇编程序中学习的所有东西都可以在1/10时间内用C或C++等语言完成。那么,我真的应该学习和使用ASM吗?它会对我有什么好的专业吗?它会增加我的机智吗?总之,它会让我成为更好的程序员吗?

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

+1

请注意,汇编语言绑定到处理器/控制器。 – rmflow

+1

你的意思是它不是跨平台的? – ApprenticeHacker

+0

编号例如:http://www.worldofspectrum.org/Z80instructions.html – rmflow

回答

78

我从Kip Irvine's得知书。如果你忽视他(不相关的)图书馆的(公正的)批评,我可以推荐它作为语言本身的一个很好的介绍 - 尽管对于有趣的东西你必须在网上搜寻迷恋。

我认为理解底层会发生什么很有用。在研究汇编程序时,您将学习CPU流水线,分支预测,高速缓存对齐,SIMD,指令重新排序等。这些知识将帮助您编写更好的高级代码。此外,传统的观点是大多数时候不尝试手动优化程序集,但让编译器担心它。当你看到编译器产生的扭曲事件的一些例子时,你会更好地理解为什么传统智慧会成立。

示例:LFSR通过rotate-with-carry指令快速运行,对于像这样的特定情况,编写汇编程序版本与发现编译器是否足够聪明以找出它一样容易。有时编译器不会编译you just know something

这也增加了你的安全性问题的认识 - 写 - 或 - 执行,堆栈溢出等

当你知道什么是在每个指令级发生的一些concurrency问题才变得明显。

如果您没有完整的源代码,调试有时可能会有用。

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

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

+3

写得很好的答案+1。学习和使用是两回事,学习这是一个好主意,何时/如果使用它,它带有经验。 –

20

是的 - 学习C和C++开发人员汇编的主要原因是它帮助理解C和C++代码背后发生的事情。这并不是说你实际上会在程序集中编写代码,但是你可以查看代码反汇编代码to assess its efficiency,你将会明白不同的C和C++特性如何更好地工作。

2

你有什么使用在你打算做什么?它会以任何方式帮助你在你目前做什么或计划做什么?这些是你应该问自己的两个问题,答案就是你的问题的答案。

从一般意义上说,是的,在我看来,我认为非常值得学习asm(类似于x86或arm),它对您的服务取决于您编程的方式以及调试方式。

3

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

14

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

由于程序集是所有语言的根源(很好,接近根源),所以我认为学习程序集是值得的。

然后,值得学习功能性编程语言,逻辑编程,脚本语言,基于数学的语言。你只有很多时间,所以你必须挑选。

33

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

我肯定不能组件(即写任何不平凡的一段汇编代码),但我可以读它,这与实际的硬件架构的知识,以及正在使用的调用约定一起足以分析性能,并确定哪些C++代码是该程序集的来源。

+2

你的意思是我应该学习基本的** push,pop,mov和invoke **命令? – ApprenticeHacker

+6

我同意,对组装的需求很大程度上取决于您正在使用的编程分支。网络/桌面/数据库?忘了汇编。电脑游戏和图形?这可能有点方便。 OS开发还是实时嵌入式系统?这是必须的。等等。 – Lundin

+1

你歪曲其他答案 - 没有人说你**需要/应该**学习程序集;只是根据这个问题它是有用的或有价值的。你的答案仍然相关。 –

2

取决于您希望达到的编程级别。 如果你需要使用调试器然后YES。 如果你需要知道编译器如何工作,那么是的。 任何汇编程序/调试程序都依赖于CPU,所以有很多工作,只需检查x86系列的年代。

+0

可能是你的意思是CPU系列? – Romeno