汇编快速入门

本文是 WebAssembly 系列文章的第三部分。若是你尚未阅读过前面的文章,咱们建议你 从头开始前端

理解汇编和编译器如何生成它的有助于你后续理解 WebAssembly 的工做原理,react

介绍 JIT 的文章里,我谈到了与机器交流的方式和与外星人通讯是类似的。android

一我的用源代码示意,外星人以二进制回应

我如今真想看看外星人大脑的思考方式——即机器大脑解析和理解通讯的机制。ios

大脑中有一部分专门用来思考(例如作加减或其余逻辑运算),一部分提供短时间记忆存储,还有一部分提供长期记忆存储。git

这几个不一样的部分都有各自的名称:github

  • 负责思惟的部分称为算术逻辑单元 (ALU)。
  • 短时间存储由寄存器提供。
  • 长期存储由随机存取存储器 (RAM) 提供。

图为 CPU,包含 ALU、寄存器和 RAM

机器码中的句子被称为指令。web

当一条指令进入大脑时会发生什么?它会被分解成带不一样含义的不一样部分。编程

指令分解的方式是特定于当前大脑构造的。后端

例如,这种结构的大脑可能老是将前六个字节传送给 ALU。ALU 根据接收到的序列中 1 和 0 的排列,就会明白须要将两个东西加在一块儿。架构

这个字段称为操做码(opcode),它的做用是告诉 ALU 要执行的操做。

从 16 字节指令中取出 6 个字节并传送给 ALU

接下来大脑会取后续两个三字节的字段来肯定要相加的两个数。这两个数会存储在寄存器中。

两个 3 字节字段被解码用以肯定源寄存器

注意这里机器码上方的注释,有助于咱们理解这个过程。这就叫作汇编。这段代码称为符号机器码。符号机器码是人类理解机器码的一种方式。

你会发现汇编和这台机器的机器码有很直接的关系。所以不一样的机器架构对应有不一样的汇编方式。当你遇到使用不一样架构的机器时,可能就得按它们本身的方式进行汇编。

所以,咱们的翻译对象并不止一个。机器码不止一种语言,有许多不一样种类的机器码。就像咱们人类会说不一样的语言同样,机器也会使用不一样的语言。

随着人类和外星人之间的翻译问题解决,你也能够将英语、俄语、普通话等语言转化成外星文A、外星文B了。对编程而言,就是将 C、C++、Rust 等语言转化成 x8六、ARM。

若是你想将任意一种高级语言编译成对应任意体系结构的汇编语言,一种方法是建立一整套不一样语言到不一样汇编的转化器。

图中左侧为编程语言 C、C++ 和 Rust,右侧为汇编语言 x86 和 ARM,各组合分别以箭头链接

但这样的作法很是低效。大部分编译器会在中间放置至少一个中间层。编译器接收高级编程语言并将其转化成相对底层的形式,转化结果也不能和机器码同样直接运行。这类形式称为(IR)。

图中解释了高级语言和汇编语言以及中间表示(IR)的关系,箭头由高级编程语言指向 IR,又由 IR 指向汇编语言

这意味着编译器能够将任意一种高级编程语言翻译成一种 IR 语言。编译器的另外一部分将获得的 IR 内容编译成特定于目标架构的语言。

编译器的前端部分将高级编程语言翻译成 IR 语言,再由后端将它们从 IR 语言编译成目标架构的汇编代码。

与上图相同,增长了前端和后端的注释

总结

以上就是汇编的简要说明,以及编译器将高级程序语言转成汇编的过程。在下一篇文章里,咱们将会看到 WebAssembly 是如何实现的。


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOSReact前端后端产品设计 等领域,想要查看更多优质译文请持续关注 掘金翻译计划

相关文章
相关标签/搜索