编译器如何生成汇编

作者: 子瑜说IT | 来源:发表于2019-04-26 21:11 被阅读6次

理解什么是汇编,以及编译器如何生成它,对于理解 WebAssembly 是很有帮助的。

image

现在来思考一下“外星人”的大脑是如何工作的——机器的“大脑”是如何对我们输入给它的内容进行分析和理解的。

“大脑”中,有一部分负责思考——处理加法、减法或者逻辑运算。还有其他的部分分别负责短暂记忆和长期记忆的。

这些不同的部分都有自己的名字:

  • 负责思考的部分叫做算数逻辑单元(ALU)
  • 寄存器提供短暂记忆功能
  • 随机存取存储器(RAM)提供长期记忆功能
image

机器代码中的语句称作指令。

那么在指令进入“大脑”以后都发生了什么呢?它们会被切分为不同的部分传送到不同的单元进行处理。

“大脑”切分指令通过不同连接线路进行。举个例子,“大脑”会将指令最开始的 6 比特通过管道送到 ALU 中。而 ALU 会通过 0 和 1 的位置来决定对两个数做加法。

这串 01 串就叫做“操作码”,它告诉了 ALU 要执行什么样的操作。

image

然后“大脑”会取后面两个连续的 3 比特 01 串来确定把哪两个数加到一起,而这 3 比特指的是寄存器的地址。

image

注意看上面机器码的注释:“ADD R1 R2”,这对于人类来讲很容易理解其含义。这就是汇编,也叫符号机器码,它使人类也能看懂机器代码的含义。

可以看到汇编和这台机器的机器码之间有直接的映射关系。正是因为如此,拥有不同机器结构的计算机会有不同的汇编系统。如果你有一个机器,它有自己的内部结构,那么它就需要它所独有的汇编语言。

从上面的分析可以知道我们进行机器码的翻译并不是只有一种,不同的机器有不同的机器码,就像我们人类也说各种各样的语言一样,机器也“说”不同的语言。

人类和外星人之间的语言翻译,可能会从英语、德语或中文翻译到外星语 A 或者外星语 B。而在程序的世界里,则是从 C、C++ 或者 JAVA 翻译到 x86 或者 ARM。

你想要从任意一个高级语言翻译到众多汇编语言中的一种(依赖机器内部结构),其中一种方式是创建不同的翻译器来完成各种高级语言到汇编的映射。

image

这种翻译的效率实在太低了。为了解决这个问题,大多数编译器都会在中间多加一层。它会把高级语言翻译到一个低层,而这个低层又没有低到机器码这个层级。这就是中间代码( intermediate representation,IR)。

image

这就是说编译器会把高级语言翻译到 IR 语言,而编译器另外的部分再把 IR 语言编译成特定目标结构的可执行代码。

重新总结一下:编译器的前端把高级语言翻译到 IR,编译器的后端把 IR 翻译成目标机器的汇编代码。

image
最后,给大家推荐一个前端学习进阶内推交流群685910553前端资料分享),不管你在地球哪个方位,
不管你参加工作几年都欢迎你的入驻!(群内会定期免费提供一些群主收藏的免费学习书籍资料以及整理好的面试题和答案文档!)

如果您对这个文章有任何异议,那么请在文章评论处写上你的评论。

如果您觉得这个文章有意思,那么请分享并转发,或者也可以关注一下表示您对我们文章的认可与鼓励。

愿大家都能在编程这条路,越走越远。

相关文章

  • 编译器如何生成汇编

    和计算机打交道,就像同外星人打交道一样 现在来思考一下“外星人”的大脑是如何工作的——机器的“大脑”是如何...

  • 编译器如何生成汇编

    理解什么是汇编,以及编译器如何生成它,对于理解 WebAssembly 是很有帮助的。 现在来思考一下“外星人”的...

  • volatile

    原理 volatile是如何来保证可见性的呢?在X86处理器下通过工具获取JIT编译器生成的汇编指令,有volat...

  • WebAssembly 系列(三)编译器如何生成汇编

    作者:Lin Clark 编译:胡子大哈 翻译原文:http://huziketang.com/blog/post...

  • 6、汇编和可执行文件(需要重新看视频整理)

    汇编≈机器码 编译器将源代码转换成汇编码(机器码) 代码经过编译器编译形成与之对应的汇编代码,而这些汇编代码不是可...

  • 19_编译过程简介

    关键词:初识编译器、预处理、编译、汇编 1. 初识编译器 广义上的编译器由:预处理器、编译器、汇编器、链接器组成。...

  • 汇编语言

    1.一般的编译器,是先将高级语言转换成汇编语言(中间代码),然后在汇编的基础上优化生成OBJ目标代码,最后Link...

  • 汇编语言学习笔记-仅供个人

    汇编语言 汇编指令通过编译器可以将汇编指令翻译成机器指令 伪指令告诉翻译软件,也就是编译器,这里怎么翻译,那里怎么...

  • 编译

    编译和链接 编译过程 预编译 生成.i 文件 不包含任何宏定义,宏被展开 编译 汇编 链接 编译器做了什么 词法分...

  • 汇编语言如何与高级语言混编

    汇编混编的两种方式(内联汇编 和 外链汇编) 内联汇编 asm();这是内联汇编,编译器可以直接运行asm ( 汇...

网友评论

    本文标题:编译器如何生成汇编

    本文链接:https://www.haomeiwen.com/subject/shhcnqtx.html