【问题标题】:Where do I start with assembly?我从哪里开始组装?
【发布时间】:2011-04-13 04:34:32
【问题描述】:

嘿,我可以用 C 编程,很少用 Python 和 Pascal,我真的很想学习汇编。我今年 18 岁,高中毕业了,编程是我的爱好,因为学业肯定不是什么挑战。

我已经下载了几本关于汇编的书籍:《汇编的艺术》、《Assembly for Beginners》、《Assembly for Complete Beginners》和 Wrox Professional Assembly Language。我还下载了 FASM、MASM 和 HLA 编译器。

现在有几个问题。

  1. Assembly for Complete Beginners 中的示例适用于 MASM,我是否应该在模拟器中运行它们,有人告诉我如果我不使用它会损坏我的电脑,如果是,我应该使用哪个模拟器采用?

  2. 另外,开发人员如何使他们的汇编代码具有可移植性?我在这个主题上找到的唯一信息是关于编写病毒的,因为用汇编编写的病毒必须是可移植的。

  3. 究竟什么是 HLA,它是真实的东西还是只是伪装成汇编的 HLL,以帮助教授初学者汇编?

  4. 除了明显的 vxheaven 和cracker 网站之外,汇编社区在哪里?

我最近读书很多,但我觉得自己像一个正在学习拉丁语的人,但永远不会去梵蒂冈见到其他说拉丁语的人。我的朋友们都用 Java 编程,但似乎并不关心 C 或 C++,他们认为他们可以将 Java 用于一切。我在 Intel 上运行 Windows 7 和 Ubuntu 10.0.10。我现在只编程了大约一年......我是否过早地投入到组装中?我想学汇编的理由:

  1. 想进一步了解 CPU 的工作原理。
  2. 寻找挑战。
  3. 想学习编写高效的代码。
  4. 想要编写更小更快的程序。
  5. 当我掌握了汇编之后,想了解更多关于 OS 开发的知识。
  6. 如果我掌握了汇编,学习更多 HLL 会更容易。
  7. 希望在申请其他人没有的工作时能提供一些东西。
  8. 对 AVR 感兴趣,例如 Arduino,它使用 C 而不是汇编,但想了解更多关于 AVR 的信息。

谢谢。 T

【问题讨论】:

    标签: assembly


    【解决方案1】:

    1) 运行汇编程序对系统的真正“损害”不会比运行 C 程序对系统的“损害”更大。在现代操作系统上,通常最糟糕的结果就是进程崩溃。不过,无意中从汇编代码中使您的进程崩溃可能会更容易一些。如果您想从模拟器中获得有用的东西,请查看 Bochs 或 QEMU - 而不仅仅是提供沙箱,它们还有有用的调试工具。但是,如果没有 vm,你会很好,使用常规调试器在常规操作系统上编写和测试代码。

    2) 你没有,真的。您可以像使用 C 一样跨操作系统(但使用相同的 CPU)进行移植,但跨 CPU 汇编没有意义(如果您想这样做,您不妨使用 C 或 .NET 或 Java 字节码)。

    3) 许多火焰战争的主题。取决于你如何看待它......汇编程序实际上只是一个处理汇编语言的编译器。组装的方式很多,有些比其他的要高;大多数可用于 x86 的都支持宏。 HLA 添加了很多 宏支持和很多人不喜欢的语法,以及一个大型标准库。不是我的那杯茶(我宁愿使用“真正的”HLL),但在我的书中它仍然是汇编语言。

    4) http://www.asmcommunity.net/board/ , http://board.flatassembler.net :) - 远离 IRC 频道。另外,请远离 usenet alt.lang.assembly,它已被一些卑鄙的人摧毁了。

    关于你学习汇编的几个原因:

    6.如果我掌握了汇编,学习更多的HLL会更容易。

    不一定,如果在深入研究 HLL 之前“做得太多”,可能会更难。我发现一些机器架构知识可以导致编写更好的软件,但前提是你要学会不要一直沉迷于无关紧要的细节。

    7.想在申请别人没有的工作时能提供一些东西。

    不一定会对您有所帮助,因为在大多数职位上,组装完全无关紧要。哎呀,你冒着“哦,他永远不会完成任务,迷失在无用的微优化中”的偏见的风险。

    【讨论】:

    • 我相信在堆栈溢出方面有不少人对汇编非常了解,可以提供帮助。
    • @Georg:确实如此,但 SO 不是“组装社区”——它专注于问答互动,而论坛/留言板有其他价值。
    【解决方案2】:

    来了……

    • x86 并不理想:
      • 很少有 3-op 指令(lea 通常用作 3-op add IIRC)。我喜欢 3-op 指令。
      • x86 机器代码非常不同于实际在 CPU 上运行的微操作。已经完成了大量的预处理;您看到的程序集很少告诉您 CPU 的实际工作原理。
      • 很多汇编建议(“这条指令更快”)有点过时了。显然,您可以通过将 x86 二进制转换为 x86 来使一些古老的 x86 应用程序更快,从而摆脱缓慢的指令。
    • Assembly 不一定会教您编写“更快的代码”。当有人说“哦,这个 $large_function 很慢,所以我会自己在汇编中编写”时,通常它最终会变慢。 阅读汇编和发现慢位是有用的;然后,您可以调整代码以查看对编译器有什么帮助(即使它很简单,例如“哦,GCC 没有注意到该函数调用的结果是恒定的”)。
    • Assembly 可能让您编写更小的代码(人类非常擅长打代码),但最大的节省空间通常是因为您不需要包含 C 运行时。人类也可以不遵守调用约定而侥幸。
    • 操作系统在很大程度上不是用汇编语言编写的(我在这里挖掘了一个人/人的轶事,他们用汇编语言编写了整个操作系统,却发现它更慢)。有几位,其中最大的是引导加载程序(在 x86 上,它仍处于 16 位“实模式”)。我知道有人将东西编程到他的引导加载程序中。听起来很有趣(但您可能希望在 VM 中运行它,前提是您可以同时使用互联网)。
    • Assembly 可能不会帮助您完成大多数工作(但就像我不会为一个希望在我的简历中看到 $list_of_languages 的地方工作一样,我也不会为一个拒绝我的地方工作,因为我'我做了一些业余爱好者组装)。
    • 程序集不可移植。即使使用相同 CPU 的系统也经常使用不同的 ABI(例如“经典”Mac OS 与 Mac OS X)。

    大多数 CS 课程倾向于使用 RISCy(ARM、MIPS、SPARC)。我从 M68K 开始,在某个时候学习了一点 PPC,并在大学学习了 ARM。如果您想使用手机/嵌入式设备或 ARM,ARM 相当干净并且可能有用;如果您想在 ARM 上做一些有趣的事情,请尝试使用 SheevaPlug 或类似名称。

    我从未在微控制器上做过任何事情,但这听起来类似于使用 ARM 开发板(可能是我整个 CS 课程中最有趣的)。

    【讨论】:

      【解决方案3】:

      正如你在 nr 中提到的。 8、我鼓励你使用 AVR,因为它是一个很好的学习和使用汇编程序的平台。

      为什么?

      因为在我的电脑上我不只是运行一些自写的汇编程序,除了在模拟器中。
      我想不出任何用于 pc 的常规程序,用汇编程序比用现代、复杂的语言编程更有意义。

      AVR 或其他微控制器 (µc) 相关的编程非常接近硬件、填充寄存器、移位位集等。
      在 µc 中,您可以立即获得可以显示的结果(闪烁一些 LED!是的。)。此外,µc 程序往往很短,它们的速度得益于有效的编程。

      【讨论】:

      • 这是一个很好的答案,但我仍然希望能够编程的不仅仅是微控制器。我找到了 Virtual Box 的网站,看起来不错,我要去试试。对于其他想要尝试的人virtualbox.orgTimo
      • 是的,VirtualBox 是您用于安全编程的沙箱/模拟器,但您是否也考虑了 asm 代码中的代码开销,例如在 Windows 中向控制台写入“hello world”?
      【解决方案4】:

      优化汇编语言已成为过去。现代 C/C++ 编译器和处理器在优化编写良好的 C 代码方面效率惊人。他们非常了解对指令进行排序的所有技巧,因此他们可以最大限度地并行执行并最有效地利用缓存。手工很难做到这一点。如果这是一个问题,大多数编译器还可以选择优化大小。

      如果您确实想玩转汇编,可以查看 GNU 汇编器。它是合理的跨平台,但组装本质上不是跨平台的。您编写汇编语言是因为您想要执行一些您的编译器可能不知道的非常具体的硬件技巧。

      如果我是你并且我想进入低级别,我肯定会转而研究图形硬件。使用现代 GPU 可以做到的事情几乎是不可思议的。

      或者学习精通 C++。查看 boost.org 或游戏编程网站。它会给你带来很多挑战和你需要的所有速度。

      【讨论】:

      • "优化汇编语言已成为过去。"这不是真的,只是需要的频率要低得多。现在通常不会在汇编中编写大部分代码,但是对于 +优化 + 代码,它仍然很有价值。很少需要,但仍然需要。
      • 我不会反对您在极端情况下可以优化一些内部循环,超出编译器可以为您做的事情。我在黄金“演示”时代在那里,我们在纯汇编中编写了 95%,但这是一个不同的游戏。硬件更简单,速度也慢得多,所以有很多收获。现在我们有一个年轻人,他想弄脏自己的手,我所说的“过去的事情”的意思是,组装是九十年代初年轻有抱负的程序员要做的事情。组装不再是前沿。而是要擅长 GPU、手机应用程序或其他东西。
      猜你喜欢
      • 1970-01-01
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多