题
我的目标集中在软件应用程序开发,也许还有 Web 应用程序开发,但最有可能的是桌面应用程序。我正在走上一条更加熟悉 C/C++ 的道路,但我应该进一步深入了解汇编吗?或者我对我的长期目标没有好处吗?
解决方案
除非您直接应用它,否则它可能不会带来很多好处。如果您想要了解一般知识,C/C++ 是一个很好的起点。
也就是说,装配带来的挑战非常有趣,需要一种完全不同的思维方式才能完成任务。
我花了一点时间通过编程来学习Z80汇编 TI-86 计算器。Z80 指令集非常小,用汇编语言对计算器进行编程的新颖性非常有趣。
ticalc.org 有很多好的资源 TI 汇编编程.
其他提示
我真的很惊讶看到这个问题有这么多“不”答案。我觉得你 应该 学习组装。
我不希望你会 使用 直接组装作为您工作的一部分。但这并不意味着你不应该学习它。
学习汇编将教会您计算机内部发生的事情。它将帮助您了解该软件实际上在做什么。
这确实与专业精神有关。您想成为一名专业的软件工程师吗?或者你会成为一个复制粘贴黑客吗?当然,后者可能会支付账单,但成为一名专业人士更令人满意。
听到有人说“不,别费心学习汇编”,在我听来就像“这是构建桥梁的食谱。你不需要学习物理或工程学来建造一座桥梁。只需遵循这些食谱即可。”不,谢谢。
“学习装配方言值得吗?”
我专业地编写过汇编程序。M68k 运行传真机和扫描仪。另外,Windows VxD(虚拟设备驱动程序)早在 Windows 3/3.1 时代就有了真正的内核。
当您编写汇编代码来执行普通软件类型的任务(复制内存、连接字符串、调用中断处理程序等)时,这很有趣。有时,您编写由 C 代码调用的汇编代码,以便在给定处理器上尽可能快地执行某些专门任务。这可能更有趣,因为您正在寻找利用处理器为您提供的每个周期的方法。您关心处理器的 L1 缓存中的内容。您关心的是对齐内存中的数据以避免缓存行命中(如果我记得这个术语的话)。您关心的是双管道处理器架构,并以正确的顺序使用正确的 2 或 3 或 4 条指令,以便在单个时钟周期(处理器的 XGHz 中的那些 HZ 之一)内发生 2 或 3 或 4 件事。
当您编写汇编代码来驱动自定义硬件时,现在您要做的事情包括填充 16 字节内存缓冲区、设置 DMA 操作并将数据发送到正在执行诸如驱动激光打印机鼓之类操作的控制器。鼓正在转动并且无法停止,并且希望在接下来的 5us 内完成下一个 16 字节。当然,这可以用 C 或 C++ 来完成。但例子是无穷无尽的。
我可能会裁定您的问题的后半部分“学习组装方言值得吗?”并让它“值得学习吗?”
如果您热爱编程,那么您如何定义“价值”涉及到热爱编程的某些组成部分。从这个意义上说,我从来没有在编程中学到过东西,也不认为这是值得的。即使我在后记中没有使用它太多。
从同样的意义上说,我几乎可以说,学习越难的东西,它就越“值得”。
但抛开所有这些毛茸茸的废话不谈,我相信至少获得一些装配背景是值得的。继续弄清楚如何编写程序集来替换一些简单的 stdlib 例程,如 strcpy、memmove 等。然后尝试优化它们,在计时的同时从 C 调用它们一百万次。
我不会开始学习 ASM。如果你想学习 C/C++ 那就从这里开始吧。随着代码质量的成熟,您可能会发现需要 ASM。99% 的情况下您不会,但有时您可能会需要它。
此外,了解 ASM 确实有助于理解 C/C++ 在幕后所做的事情。但同样,在您变得更高级之前,您可能不需要它。
我做到了,我认为这当时对我有帮助。它不再对我的日常工作有帮助,但我认为这取决于你的工作。
20 年前,我在 Commodore 上学习了汇编程序,在大学时又在 IBM 大型机上学习了汇编程序。我不能说这对我目前的工作有帮助。
我同意马克的观点。我认为这与用 C#、VB.NET 或其他 .NET 语言编写时学习 MSIL 类似。它有助于了解幕后发生的事情,但您可能会花费一生来创建可以工作但永远不需要它的应用程序。
不。除非你想好玩,否则你真的不需要学习汇编。
有些事情你需要了解汇编,比如驱动程序创建、操作系统开发、漏洞利用开发,但除此之外,我个人相信你可以在不知道的情况下很高兴地永远编码。
如果您确实需要学习汇编,您就会知道 - 我不会为了学习而学习它。
如果您正在编写非托管 C++,那么至少了解基本的 x86 汇编、二进制数字系统等有时是无价的。我主要进行 C/C++ 开发,偶尔需要调试生产代码中的错误,这些错误特定于编译器生成的机器代码表示形式,因此找到并修复错误的唯一方法是读取反编译的程序集并确定编译器为什么会这样生成它。
有关组装的更多信息,请参阅问题: 学习汇编的最佳方法是什么?具体来说,对于有动态语言经验的人.
组装并不是很困难。一旦熟悉了 C,就可以花一两天的时间学习基本的汇编。它在调试方面的帮助是巨大的,而且能够编写速度比 C 同等语言快 10、15 甚至更多的代码,这很有趣。