【问题标题】:How to start learning assembly language on any system如何在任何系统上开始学习汇编语言
【发布时间】:2022-01-02 23:46:47
【问题描述】:

我想学习汇编,但我对此不确定,但因为汇编是低级编程语言,所以为打印 Hello 而编写的代码在 windows 机器上和在 mac 上会有所不同。

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

【问题讨论】:

  • 首先选择您要为其编程的操作系统和架构。然后获取该特定组合的教程或书籍。不要使用其他架构或操作系统的教程,由于所有细微的差异,它不会真正起作用。
  • 您无法绕开程序集不可移植的事实。这是组装的一个基本事实,无论是跨操作系统还是跨 CPU 架构。没有一种单一的汇编语言可以在任何地方都可以使用,这就是存在高级语言的原因之一!汇编是一个语言家族。挑一个学起来;其余部分通常是相似的,因为所有现代机器在大图方面都有很多相似之处,即都有寄存器。

标签: assembly cpu-architecture portability platform-independent


【解决方案1】:

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

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

此外,您还需要很好地掌握调试技巧——逐行观察您的程序运行;观察变量变化;观察控制流;将复杂的语句分解成更简单的语句,这样您就可以看到它们内部发生了什么。调试技能是编程的要求,在汇编中更是如此。


高级语言提供:

  • 已命名、具有作用域、生命周期/持续时间、已键入并且可以根据其类型保存值的变量
  • 易于嵌套的结构化语句/控制结构
  • 用容易熟悉的(数学)符号编写的表达式

相比之下,汇编/机器代码提供:

  • 仅存在的物理存储,没有范围,生命周期/持续时间,无类型等。
    • CPU 寄存器
    • 主内存/RAM
  • 控制结构的 if-goto-label 样式
  • 操作存储和计算的说明

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


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

尤其是在学习汇编语言时,知道自己在尝试做什么总是一个好主意,这意味着首先拥有/编写一个算法,最好是可以测试该算法以便知道它可以工作,因为 C 中的小设计更改有时会导致汇编中的重大更改(例如重写)。一种方法是使用伪代码在纸上执行此操作,但我建议使用高级语言(首选 C)编写,以便您可以实际运行和测试您的算法。


将算法转换为程序集:

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

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

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

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

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

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

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

【讨论】:

  • 非常感谢我已经知道 C 的信息,我想尝试一些更底层的东西,但我不知道从哪里开始,所以再次非常感谢
  • @RudolfVrbensky:如果您已经了解 C,那么看看它如何映射到不同 CPU 的 asm 是一个很好的学习方法。请参阅How to remove "noise" from GCC/clang assembly output?,尤其是 Matt Godbolt 的 CppCon2017 演讲 “What Has My Compiler Done for Me Lately? Unbolting the Compiler's Lid”,它针对 x86-64 GNU/Linux 编译所有示例(特别是 Intel 语法,而不是 GCC 的 AT&T 语法默认值),并以 x86-64 asm 的简要介绍开始.大多数其他 ISA 只有一种广泛使用的 asm 语法。
  • 每次你想知道“我如何在汇编中做 X?”时都询问编译器。将节省您自己和其他人的时间。
猜你喜欢
  • 1970-01-01
  • 2011-10-04
  • 2011-10-01
  • 2011-10-15
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多