Skip to content

Latest commit

 

History

History
47 lines (19 loc) · 1.55 KB

第六章:Hack Assembler.md

File metadata and controls

47 lines (19 loc) · 1.55 KB

第六章:Hack Assembler

本章内容:自制一个assembler完成从汇编语言到机器码的翻译。不支持多行注释和错误检查等功能,对于给出的代码都可以正常翻译。

总流程:分为两趟

1. 第一趟去掉空格,以及注释,把标签记录下来放在symbol_table。该处理生成的中间代码放在xxx.hack1中
2. 第二趟负责判断指令类型,然后生成对应的二进制码。该处理生成的最终机器码放在xxx.hack中

符号翻译

符号翻译使用一张符号表来存储变量和标签。

标签是查找是否存在$(xxx)$的字符串,然后将其存入符号哈希表。

该过程在第一趟遍历完成。

A,L,C指令的翻译

由于代码保证不存在语法错误,在第一次翻译之后去除空格和注释,就只剩下正常的指令了。

可以按照前缀字符解析:

  • @表示该指令为A或者L,只需要将后续字符在symbol_table以及variables中查看即可
  • 除去L指令和A指令就只剩下C指令了,只需要按位域解析得到各位域再转换为对应的二进制映射再拼接即可,这个过程查表放在comp, dest, jump哈希表中

源代码

该项目由本人于Clion下采用C++17Qt5开发。

代码放在这里了,如果感兴趣可以看看。

效果

显示效果