ChatGPT解决这个技术问题 Extra ChatGPT

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

关闭。这个问题是题外话。它目前不接受答案。想改进这个问题?更新问题,使其成为 Stack Overflow 的主题。 11年前关闭。改进这个问题

学习 ASM 还值得吗?

我知道一点,但我并没有真正使用它或正确地学习它,因为我在汇编程序中学习的所有内容都可以用 C 或 C++ 之类的语言在 1/10 时间内完成。那么,我真的应该学习和使用 ASM 吗?它对我有什么专业的好处吗?它会增加我的机智吗?简而言之,它会让我成为一个更好的程序员吗?

注意:我说的是像 FASM 或 NASM 这样的低级汇编,而不是像 HLA(高级汇编器)这样的东西。

请注意,该汇编语言与处理器/控制器相关联。
你的意思是它不是跨平台的?!
好的,所以每个处理器都有不同的汇编语言???!!!!!!!!!!!!!!!!!!!!!!!!
每个处理器系列都有不同的汇编语言。 386 代码可在包括 Intel 和 AMD 的产品在内的任何更高版本的 x86 处理器上运行——但某些功能集是专有扩展。这些额外指令的语言相同,但生成的二进制文件不可移植。

s
spraff

我从 Kip Irvine's 本书中学到了。如果您忽略对他(不相关)库的(公平)批评,我可以推荐它作为对语言本身的一个很好的介绍——尽管对于 真正 有趣的东西,你必须在网。

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

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

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

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

某些 concurrency 问题只有在您了解每条指令级别发生的情况时才会变得明显。

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

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

然后是用于图形硬件的特殊汇编语言,虽然着色器语言在几年前已经成为高级语言,但任何能让你以不同方式思考问题的东西都是好的。


写得好答案+1。学习和使用是两件不同的事情,学习它是一个好主意,何时/是否使用它需要经验。
举个例子,Linus Torvalds uses a disassembler to debug his code,所以我认为他对 x86 汇编有很好的了解。
J
James Martinez

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

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


你的意思是我应该只学习基本的推送、弹出、移动和调用命令?
我同意,了解汇编的需要很大程度上取决于您正在使用的编程分支。网络/桌面/数据库?忘记汇编程序。电脑游戏和图形?它可能有点方便。操作系统开发还是实时嵌入式系统?这是必须的。等等。
你歪曲了其他答案——没有人说你需要/应该学习汇编;只是根据问题,它有用或值得。你的答案仍然是相关的。
@burningprodigy:我相信你应该对你使用的汇编器中的指令有一些基本的了解(即参数的顺序是什么等等),并且对一些命令有一些非常基本的了解,这是多么大的负担或者是一家商店。然后,如果您需要查看某个程序集,您可以使用参考资料来理解每条说明,这样做您将开始学习所需的基础知识。
我同意。尤其是仅了解汇编对于评估现代 CPU 的效率最多也没什么帮助。如果这是目标,那么具有相当一部分计算机体系结构基础知识的汇编基础知识会更有用。大多数时候我需要汇编是查看优化程序的转储,或者是为了好玩(即安全性的东西,编写一个迷你内核,..)。但我不记得上次因为装配知识而改变一些设计决策是什么时候了。
C
Community

是的 - 为 C 和 C++ 开发人员学习汇编的主要原因是它有助于理解 C 和 C++ 代码背后发生的事情。并不是说您实际上会在汇编中编写代码,但是您将能够查看代码反汇编to assess its efficiency,并且您将了解不同的 C 和 C++ 功能如何更好地工作。


n
nbro

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

由于汇编是所有语言的根源(嗯,接近于根源),我认为学习汇编是值得的。

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


然后,当您终于学会了所有这些并认为您对正在发生的事情有所了解时,您会发现 J
n
nbro

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


G
GJ.

取决于您希望达到的编程水平。如果您需要使用调试器,那么可以。如果您需要了解编译器的工作原理,那么可以。任何汇编器/调试器都依赖于 CPU,所以工作量很大,只需检查 x86 系列它的大小和年龄。


可能你的意思是依赖 CPU 家族吗?
N
Necrolis

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

在更一般的意义上,是的,我认为 asm 非常值得学习(例如 x86 或 arm),它为您服务的好坏取决于您的编程内容以及调试方式。