Programming languages 学习汇编语言值得吗?

Programming languages 学习汇编语言值得吗?,programming-languages,assembly,nasm,Programming Languages,Assembly,Nasm,还值得学习ASM吗 我知道一些,但我还没有真正使用它或者学习它,因为我在汇编程序中所学的一切都可以在1/第十的时间里用C或C++语言来完成。那么,我真的应该学习和使用ASM吗?这对我的职业生涯有好处吗?这会增加我的机智吗?简言之,这会使我成为一名更好的程序员吗 注释:我是在讨论FASM或NASM之类的低级汇编,而不是像HLA(高级汇编程序)之类的。 < P>是的,学习C和C++开发人员的汇编的主要原因是帮助理解C和C++代码的引擎下的情况。这并不是说你实际上会在汇编中编写代码,但是你可以看看代码

还值得学习ASM吗

我知道一些,但我还没有真正使用它或者学习它,因为我在汇编程序中所学的一切都可以在1/第十的时间里用C或C++语言来完成。那么,我真的应该学习和使用ASM吗?这对我的职业生涯有好处吗?这会增加我的机智吗?简言之,这会使我成为一名更好的程序员吗


<>注释:我是在讨论FASM或NASM之类的低级汇编,而不是像HLA(高级汇编程序)之类的。

< P>是的,学习C和C++开发人员的汇编的主要原因是帮助理解C和C++代码的引擎下的情况。这并不是说你实际上会在汇编中编写代码,但是你可以看看代码的拆卸,你会理解C和C++的不同的功能是如何工作得更好的。如果你忽略了对他的(不相关的)库的(公平的)批评,我可以推荐它作为语言本身的一个很好的介绍——尽管对于真正有趣的东西,你必须在网上找到痴迷者

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

此外,传统的智慧是,大多数时候不要试图手动优化程序集,而是让编译器担心它。当您看到编译器生成的扭曲的东西的一些例子时,您将更好地理解为什么传统智慧适用

示例:LFSR使用带进位的rotate指令运行得很快,对于这种特定情况,编写汇编程序版本与发现编译器是否足够聪明来理解它一样容易。有时,编译器不会

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

只有当您知道每指令级别上发生的情况时,某些问题才会变得明显

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

这就是好奇的价值。虚拟函数是如何实现的?有没有试过用汇编语言编写DirectX或COM程序?大型结构如何返回,调用函数是否为它们提供空间,反之亦然


还有一些专门用于图形硬件的汇编语言,虽然着色器语言在几年前已经达到了高级水平,但任何让你以不同的方式思考问题的语言都是好的。

在你计划做的事情中,你有什么使用它的方法吗?它对你目前正在做或计划做的事情有任何帮助吗?这是你应该问自己的两个问题,这些问题的答案就是你问题的答案


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

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

从许多不同的范例中学习许多不同的语言是值得的。学习java、C++、c++和python并不重要,因为它们都是同一个范例的实例。p> 由于汇编是所有语言的根(很好,接近根),我个人认为学习汇编是值得的


同样,学习函数式编程语言、逻辑编程、脚本语言和基于数学的语言是值得的。你只有这么多的时间,所以你必须选择。

我觉得有趣的是,这么多人跳出来说是的,你需要/应该学习组装。对我来说,问题是你需要知道多少装配?我不认为你必须像编程语言一样了解汇编,也就是说,我不认为每个人都应该能够用汇编编写程序,但另一方面,能够阅读它并理解它的实际含义(这可能需要比汇编程序更多的体系结构知识)就足够了


我肯定不能编写汇编(即在汇编中编写任何非琐碎的代码),但我可以阅读汇编,再加上对实际硬件体系结构的了解,以及所使用的调用约定足以分析性能,并且识别哪一块C++代码是该程序集的源代码。

<强>取决于您希望达到哪个编程级别。< /强> 如果您需要使用调试器,那么可以。 如果您需要了解编译器的工作原理,那么可以。


任何汇编程序/调试器都依赖于CPU,因此需要做大量的工作,只需检查x86系列有多大,有多旧。

注意,汇编语言绑定到处理器/控制器。你的意思是它不是跨平台的?!!不。例如:好的,那么每个处理器都有不同的汇编语言???!!!!!!!!!!!!!!!!!!!!!!!!!每个处理器系列使用不同的汇编语言。386代码运行在任何更高版本的x86处理器上,包括Intel和AMD的产品,但有些功能集是专有的扩展。对于这些额外的指令,语言是相同的,但生成的二进制文件不可移植。你是说我应该只学习基本的push、pop、mov和invoke命令?我同意,了解汇编的必要性很大程度上取决于你使用的编程分支。网络/桌面/数据库?忘记汇编程序吧。电脑游戏和图形?这可能有点方便。操作系统开发还是实时嵌入式系统?这是必须的。诸如此类。你曲解了其他答案——没有人说你需要/应该学习汇编;根据问题,这是有用的或值得的。“不过,你的回答仍然是相关的。”伯恩·普罗迪:我认为你应该有一些基本的知识