如何在任何系统上开始学习汇编语言

How to start learning assembly language on any system

我想学习汇编,但我不确定,但是因为汇编是低级编程语言,所以为打印 Hello 编写的代码在 windows machine 上会有所不同,然后在 mac.

我怎样才能解决这个问题(如果这个问题存在的话)以及我可以从哪里开始学习实际的语言。

首先,您需要很好地掌握编程,使用像 C 这样的语言,因为它的级别与汇编之前一样低 - 其他语言也很棒,但隐藏了更多的低级细节。

C 有指针,这在汇编语言中很常用,所以在 C 中我们可以有一些算法的数组版本,也可以有相同的指针版本。学汇编之前先know/understand这些东西就好

另外,你需要很好地掌握调试——逐行查看你的程序运行;观察变量变化;观察控制流;将复杂的语句分解成更简单的语句,以便您可以观察其中发生的事情。调试技能是编程的必要条件,在汇编中更是如此。


高级语言提供:

  • 已命名、具有作用域、lifetime/duration 的变量是有类型的,并且可以根据其类型保存值
  • structured-statements/control-structures容易嵌套
  • 用容易熟悉的(数学)符号编写的表达式

相比之下,assembly/machine-code 提供:

  • 简单存在的物理存储,没有范围,lifetime/duration,没有类型,等等。
    • CPU 注册
    • 主存/RAM
  • 控制结构的 if-goto-label 样式
  • 操作存储和计算的说明

汇编的这些特性在所有处理器中都是通用的。


要学习汇编,最好能够将高级语言结构与处理器的功能联系起来。一种方法是尝试将用 C 或伪代码编写的小程序翻译成汇编。

尤其是在学习汇编语言时,知道自己要做什么总是一个好主意,这意味着 having/writing 首先是算法,最好是可以测试算法,这样它已知可以工作,因为 C 中的小设计更改有时会导致汇编中的重大更改(例如重写)。一种方法是在纸上使用伪代码来做到这一点,尽管我建议使用高级语言编写,首选 C,这样您就可以实际 运行 并测试您的算法。


将算法转化为程序集:

  1. 将数据类型转换为物理存储概念,考虑大小、偏移和对齐方式
  2. 将全局变量转换为物理存储预留
  3. 将函数转换为汇编:
    1. 将参数和局部变量转换为物理存储,考虑使用情况、生命周期、大小和类型,以及与其他变量的重叠。
    2. 将结构化控制语句转换为 if-goto-label 中的等效模式
    3. 将表达式翻译成机器码指令

以上讨论应该让您了解所有汇编语言之间的共同点。学习一种汇编语言意味着理解上述主题,再加上学习某些特定​​处理器的实际指令集。您在一个处理器上学到的大部分知识都会转移到另一个处理器上,尤其是如果您可以将上述 broad/common 概念与任何给定指令集的细节分开。

指令集在可用寄存器数量、执行条件(if-goto-label)分支的方式、立即操作数的大小、二元运算符允许的操作数数量方面有所不同:二对三,如何访问内存,还有许多其他细节。正如其他人在评论您的问题时所说 post,即使对于相同的硬件,不同操作系统的寄存器使用方式和参数传递方式也可能存在差异。

要开始学习汇编语言,我建议先选择一种简单的处理器来学习物理存储、控制结构模式、表达式求值和函数调用的概念。也许还有指令编码,特别是如果您的兴趣倾向于处理器内部。

相当简单但又真实又现代:RISC V,与 MIPS 非常相似,都有很好的 PC 模拟器以及大量在线学习资料。此外,这些处理器是真实的,具有可用的编译器,可以将 C 代码转换为汇编代码供您检查。

更简单的是 LC-3 — 一种非常基础、易于学习、面向教育的(玩具)处理器,具有良好的模拟器支持。缺点是缺乏真正的编译器支持,但优点是简单 — 它的局限性使该处理器非常简单易懂。

x86 是一种非常常见的处理器,尽管它背负了数十年的包袱,当您了解历史和演变时,其中的大部分内容都是有意义的;否则从头开始学习可能过于复杂。