从零开始构建现代计算机--第六章,01-HACK汇编编译器模块介绍

  • 语法分析器(Parser)
  • 编码(Code)
  • 无符号程序的汇编编译器
  • 符号表(Symbol Table)
  • 有符号程序的汇编编译器

HACK汇编编译器分成四个模块:
语法分析器(Parser):对输入文件进行语法分析
编码(Code):提供所有汇编命令对应的二进制代码
符号表(Symbol Table):处理符号
主程序:驱动整个编译过程

语法分析器(Parser)

Parser: 将汇编命令分解为其所表达的内存含义(域和符号)。
封装对输入代码的访问操作。功能包括:读取汇编语言命令并对其进行解析:提供“方便访问汇编命令成分(域和符号)”的方案;去掉所有空格和注释。

程序 参数 返回值 功能
构造函数/
初始化函数
输入文件/
输入流
打开输入文件/输入流,为语法解析作准备
hasMoreCommands Boolean 输入当中还有更多命令吗
advance 从输入中读取下一条命令,将其当作“当前命令”,仅当hasMoreCommands()为真时,才能调用本程序。最初始的时候,没有“当前命令”
commandType A_COMMAND,
C_COMMAND,
L_COMMAND
返回当前命令的类型:
A_COMMAND:
当@Xxx中的Xxx是符号或十进制数字时
C_COMMAND
用于dest=comp;jump
L_COMMAND(实际上是伪命令)
当(Xxx)中的Xxx是符号时
symbol 字符串 返回形如@Xxx或(Xxx)的当前命令的符号或十进制值,仅当commandType()是A_COMMAND或L_COMMAND是才能调用
dest 字符串 返回当前C-指令的dest助记符(具有8种可能的形式)
仅当commandType()是C_COMMAND时才能调用
comp 字符串 返回当前C-指令的comp助记符(具有28种可能的形式),仅当commandType()是C_COMMAND时才能调用
jump 字符串 返回当前C-指令的jump助记符(具有8种可能的形式),仅当commandType()是C_COMMAND时才能调用

编码(Code)

将Hack汇编语言助记符翻译成二进制码。

程序 参数 返回值 功能
dest 助记符(字符串) 3bits 返回dest助记符的二进制码
comp 助记符(字符串 7bits 返回comp助记符的二进制码
jump 助记符(字符串 3bits 返回jump助记符的二进制码

无符号程序的汇编编译器

Parser和Code模块实现较为简单,可以先实现,而符号表的处理较为复杂,可以放到第二阶段再进行。
在第一阶段约定:输入的Prog.asm程序不包含符号,因此:(a)在所有地址命令@Xxx中,Xxx常数是十进制数而不是符号;(b)输入文件不包含标记命令即(Xxx)命令。
实现:

  1. 打开Prog.hack的输出文件
  2. 处理汇编指令文件Prog.asm
  3. 对C指令,将翻译后的指令域的二进制码连接到一个单一的16-位字上,将16-位字写入Prog.hack文件
  4. 对A-指令@Xxx,将语法分析器返回的二进制常数翻译成对应的二进制表示,然后将得到的16-位字写入Prog.hack文件。

符号表(Symbol Table)

翻译中需要为指令中可能包含的符号确定实际的地址。汇编编译器使用符号表(symbol table)来完成这个任务,符号表用来建立和维持符号与其地址之间的关联。哈希表(hash table)是建立映射的经典数据结构之一。
SymbolTable: 在符号标签(symbolic labels)和数字地址之间建立关联。

程序 参数 返回值 功能
Constructor 创建空的符号表
addEntry symbol(字符串),
address(int)
将(symbol,address)配对加入符号表
contains symbol(字符串) Boolean 符号表是否包含了指定的symbol
GetAddress symbol(字符串) int 返回与symbol关联的地址

有符号程序的汇编编译器

汇编程序允许符号在定义之前使用(即goto命令的目的地)。此功能为汇编程序员福音,却使编译器开发变得困难。解决方法之一是,编写“两遍(two-pass)”编译器,从头到尾读取两次代码。
第一遍构建符号表,第二遍用每个符号相关的含义(数字地址)替换该符号,并产生最后的二进制码。
符号表中应该包含并处理Hack语言中的所有三种符号:预定义符号(predefined symbols)标签(labels)变量(variables)

  1. 初始化 用所有预定义符号和它们预分配的RAM地址对符号进行初始化。
  2. 第一遍 用数字记录ROM地址–当前命令最终加载的目标地址。每遇到一条指令都自动加1,遇到标签伪指令或注释时不发生变化。
    遇到伪指令时,在符号表中加上一个新条目来将Xxx与最终用于存储程序中下一条指令的ROM地址关联起来。在这个阶段程序中所有标记和它们的ROM地址被加入到符号表中。程序的变量放在第二阶段处理。
  3. 第二遍 对每一行进行语法分析。@Xxx指令中Xxx是符号时,在符号表中查找Xxx。如果在符号表中没有找到该符号,说明它是变量。这时在符号表中添加(Xxx,n),这里n代表下一个可使用的RAM地址。分配的RAM地址是紧邻预定义符号地址之后的连续数字。

计算机系统要素--第六章,01-HACK汇编编译器模块介绍相关推荐

  1. 计算机系统要素--第六章,02-HACK汇编编译器实现

    从零开始构建现代计算机--第六章,02-HACK汇编编译器实现 要点 A-指令 C-指令 符号表 python实现 要点 关心三点: A指令,C指令,符号表 A-指令 A指令:将@num的num转为1 ...

  2. c语言实现HACK汇编编译器(一)

    汇编编译器: 汇编程序在被计算机执行之前,必须被翻译成计算机的二进制语言.翻译任务是由汇编编译器来完成的.汇编编译器的输入是一串汇编命令,然后产生一串等价的二进制指令作为输出.生成的代码被加载到计算机 ...

  3. 计算机要素--第六章 汇编编译器

    计算机系统要素,从零开始构建现代计算机(nand2tetris) 如果完成了本书所有的项目 你将会获得以下成就 构建出一台计算机(在模拟器上运行) 实现一门语言和相应的语言标准库 实现一个简单的编译器 ...

  4. 计算机系统导论第六章答案,《计算机系统概论》-第4章-习题答案

    写出冯·诺依曼模型的5个组成部分,并写出各个部件的功能和目的. 输入设备:输入数据 输出设备:输出结果 控制器:控制程序执行 内存:存放程序(各类运行指令) 处理器:对数据进行处理和运算git 简要描 ...

  5. 计算机系统基础(六)之RISC-V汇编

    文章目录 前言 一.RISC-V汇编语言简介 汇编语言的优缺点 二.汇编语言语法介绍 三.RISC-V汇编指令总览 RISC-V 汇编指令操作对象 RISC-V 汇编指令分类 RISC-V 汇编伪指令 ...

  6. 【Java数据结构与算法】第十六章 图

    第十六章 图 文章目录 第十六章 图 一.图 1.介绍 2.基本术语 3.邻接矩阵 4.邻接表和逆邻接表 5.十字链表 二.深度优先遍历 三.广度优先遍历 四.代码实现 一.图 1.介绍 图相较于前面 ...

  7. 《计算机系统要素》 第六章 汇编编译器

    6.1 背景知识 符号化的语言称为汇编,翻译程序称为汇编编译器,汇编编译器对每个汇编命令的所有部分进行解析,将每个部分翻译成它对应的二进制码,并将生成的二进制码汇编成真正能被硬件执行的二进制指令. 编 ...

  8. 计算机系统要素:第六章 Part2 汇编编译器(symbol)

    要给汇编编译器加入符号,首先要明确这个汇编编译器有哪些符号: 预定义符号:SP,LCL等,这些符号预先就在SymbleTable中定义好了对应内存的地址 变量variables:注意,变量是在第二遍读 ...

  9. 微型计算机系统与接口重要吗,微型计算机系统与接口 马宏锋 等编著 第六章

    微型计算机系统与接口 马宏锋 等编著 第六章 (67页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.90 积分 6.1 输入/输出接口概述 内容简介6 ...

最新文章

  1. 2017.1.9版给信息源新增:max_len、max_db字段
  2. 来聊聊可形变卷积及其应用
  3. 如何忽略Git中目录中的文件?
  4. 数学建模学习笔记——聚类模型
  5. 从单体到Flink:一文读懂数据架构的演变
  6. 没有工作经验找it_没有工作经验怎么找工作?
  7. 【零基础学Java】—static关键字概述(十六)
  8. python绘制心形图像
  9. Linux服务-rsync
  10. 【C++】 ArcFace Demo2.0版
  11. Cesium中的Heading/Pitch/Roll
  12. 三星sm-g7106com.android.mms,三星g7106官方原版固件rom系统刷机包_三星g7106线刷包
  13. 【SpringBoot】微信点餐系统
  14. 经济应用文写作【4】
  15. HashMap如何解决hash冲突?
  16. 【vue路由跳转外部链接】
  17. 中标麒麟Linux64平台上QT5.6.3源码编译安装
  18. 【5G会话管理】UE IP地址的管理
  19. SpringBoot单元测试的@RunWith与@SpringBootTest注解
  20. Biotin-WFA,WFL;生物素化紫藤凝集素(WFA,WFL)

热门文章

  1. 服务器存储视频文件夹在哪里找,微信视频文件夹存储在什么位置?在哪里能找到...
  2. el-upload回显细节--没有图片数据返回的时候每点击一次添加多了一个空白图片
  3. 信息系统项目管理:质量管理
  4. 图论学习--5匹配与因子分解(思维导图)
  5. 查看路由器拨号的宽带密码
  6. 学生机房管理服务器系统设计,中小学机房管理系统设计与实现
  7. 谁动了我的奶酪佳句欣赏
  8. 计算机编程语言是什么?
  9. 流体力学——流体动力学
  10. 一个悄然崛起的国产软件