Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

第三十八章:汇编器

复习

  • 汇编语言为指令和地址提供了人能读的写法。
  • 标签和数据名称需要在翻译时换成真实地址。

TL;DR

  • 汇编器把汇编语言翻译成机器码。
  • 它通常先记录每个标签的位置,再生成指令编码。
  • 汇编器严格执行既定规则,不会猜测程序员的意思。

正文

  我们已经能用 JMP startLOAD A, [apples] 写程序,却还没有告诉计算机 startapples 在哪里。完成这件事的工具叫作汇编器(assembler)。

  它可以分两遍阅读一份源文件。第一遍不急着生成指令,只从头数到尾:每条指令占多少空间?每个标签出现在哪里?例如:

符号算出的地址
start0
apples12
pears13
total14

  第二遍,汇编器根据指令表把 LOAD 换成操作码,把 A 换成寄存器编号,再把 apples 换成 12。于是原来写给人的一行,变成 CPU 能执行的一串位。这个“两遍”的想法很朴素:先弄清所有名字指向哪里,再使用这些信息。

  有的汇编器会做更多工作,例如提供宏、把文件拆成模块,或报告更友好的错误。无论功能多复杂,它的核心职责没有变:遵守某台机器的指令格式,把文本精确地编码为机器指令和数据。

  汇编器也解释了一个常见现象:汇编程序里写错一个寄存器名或漏掉一个标签,错误会在翻译时出现;如果翻译顺利通过,也不表示算法一定正确。工具只能确认“这句话合不合语法、能不能编码”,不能替我们确认“这是不是想要的结果”。

  现在我们已经有一条完整的路径:人写汇编语言,汇编器生成机器码,CPU 执行机器码。可即使有了汇编器,描述“把一组数求和”仍要管理寄存器、跳转和地址。人还想在更高的一层表达想法。

思考题

为什么汇编器往往要先知道所有标签的位置,才能处理跳转指令?

小结

知识点

  • 汇编器是汇编语言到机器码的翻译工具。
  • 第一遍可建立符号与地址的对应,第二遍可完成编码。
  • 翻译正确不等于程序逻辑正确。

参考资料

  • Douglas Jones,《The Iowa Assembly Language Tutorial》

思考题答案(仅供参考)

  跳转指令的操作数必须是一个真实地址,而标签可能在文件后面才出现。先记录全部位置,就能在生成机器码时正确填入地址。

协议

本文采用 CC BY-NC-SA 4.0 协议发布。