学习 ASM 还值得吗?
我知道一点,但我还没有真正使用它或者正确地学习它,因为我在汇编程序中学到的一切都可以用1/10的时间用C或C ++这样的语言来完成。那么,我应该真正学习和使用ASM吗?这对我有什么好的专业吗?它会增加我的机智吗?简而言之,它会让我成为更好的程序员吗?
注意:我说的是低级程序集,如 FASM 或 NASM ,而不是 HLA (高级汇编程序)。
答案 0 :(得分:96)
我从Kip Irvine's书中学到了。如果你忽略对(不相关)库的(公平)批评,我可以推荐它作为语言本身的一个很好的介绍 - 虽然对于真正的有趣的东西,你必须找出关于它的强迫症。净。
我认为了解较低级别会发生什么是有用的。在研究汇编程序时,您将学习cpu流水线,分支预测,缓存对齐,SIMD,指令重新排序等。了解这些将有助于您编写更好的高级代码。
此外,传统观点是不要试图在大多数时间手动优化装配,而是让编译器担心它。当你看到编译器产生的扭曲事物的一些例子时,你将更好地理解为什么传统智慧成立。
示例:LFSR使用rotate-with-carry指令快速运行,对于这样的特定情况,编写汇编程序版本就像发现汇编程序是否足够聪明来解决它一样容易。有时you just know something编译器没有。
它还可以增加您对安全问题的理解 - 写入或执行,堆栈溢出等。
当您意识到每个指令级别发生的事情时,一些concurrency问题才会变得明显。
如果您没有完整的源代码,有时在调试时会很有用。
有好奇心的价值。如何实现虚拟功能?曾经尝试在汇编程序中编写DirectX或COM程序吗?如何返回大型结构,调用函数是否为它们提供了空间,反之亦然?
然后有图形硬件的特殊汇编语言,虽然几年前着色器语言很高级,任何让你以不同方式思考问题的东西都是好的。
答案 1 :(得分:47)
我觉得有趣的是,很多人都会说是的,你需要/应该学习装配。对我来说,问题是你需要知道多少程序集?我认为你不必像程序设计语言一样知道汇编,那就是我不相信每个人都应该能够写出来汇编中的程序,但另一方面,能够阅读它并理解它实际意味着什么(可能需要更多的架构知识而不是汇编程序)就足够了。
我肯定不能编写汇编(即在汇编中编写任何非常重要的代码段),但我可以阅读它,并了解实际的硬件架构和调用约定正在使用的内容足以分析性能,并确定哪个C ++代码是该程序集的源代码。
答案 2 :(得分:25)
是 - 为C和C ++开发人员学习汇编的主要原因是它有助于理解C和C ++代码下的内容。这并不是说您实际上会在汇编中编写代码,但是您将能够查看代码反汇编to assess its efficiency,并且您将了解不同的C和C ++功能如何更好地工作。
答案 3 :(得分:22)
从许多不同的范例中学习许多不同的语言是值得的。学习Java,C ++,C#和Python不算数,因为它们都是相同范例的实例。
由于汇编位于所有语言的根(好,靠近根),我可以说有必要学习汇编。
然后,再次学习函数式编程语言,逻辑编程,脚本语言,基于数学的语言是值得的。你只有这么多时间,所以你必须挑选。
答案 4 :(得分:4)
了解ASM在调试时也很有用,因为有时你所拥有的只是“错误的ASM转储”。
答案 5 :(得分:2)
您计划做什么使用?是否会以任何方式帮助您完成您目前正在做或计划做的事情?这些是你应该问自己的两个问题,答案就是你问题的答案。
在更一般的意义上,是的,我认为在我看来非常值得学习asm(类似于x86或arm),它对你的服务有多好取决于你编程的内容以及你的调试方式。
答案 6 :(得分:2)
取决于您希望达到的编程级别。 如果您需要使用调试器,那么YES。 如果你需要知道编译器如何工作,那么YES。 任何汇编程序/调试程序都依赖于CPU,所以有很多工作,只需检查x86系列它的大小。