计算机系统要素--第六章,01-HACK汇编编译器模块介绍
从零开始构建现代计算机--第六章,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)命令。
实现:
- 打开Prog.hack的输出文件
- 处理汇编指令文件Prog.asm
- 对C指令,将翻译后的指令域的二进制码连接到一个单一的16-位字上,将16-位字写入Prog.hack文件
- 对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)。
- 初始化 用所有预定义符号和它们预分配的RAM地址对符号进行初始化。
- 第一遍 用数字记录ROM地址–当前命令最终加载的目标地址。每遇到一条指令都自动加1,遇到标签伪指令或注释时不发生变化。
遇到伪指令时,在符号表中加上一个新条目来将Xxx与最终用于存储程序中下一条指令的ROM地址关联起来。在这个阶段程序中所有标记和它们的ROM地址被加入到符号表中。程序的变量放在第二阶段处理。 - 第二遍 对每一行进行语法分析。@Xxx指令中Xxx是符号时,在符号表中查找Xxx。如果在符号表中没有找到该符号,说明它是变量。这时在符号表中添加(Xxx,n),这里n代表下一个可使用的RAM地址。分配的RAM地址是紧邻预定义符号地址之后的连续数字。
计算机系统要素--第六章,01-HACK汇编编译器模块介绍相关推荐
- 计算机系统要素--第六章,02-HACK汇编编译器实现
从零开始构建现代计算机--第六章,02-HACK汇编编译器实现 要点 A-指令 C-指令 符号表 python实现 要点 关心三点: A指令,C指令,符号表 A-指令 A指令:将@num的num转为1 ...
- c语言实现HACK汇编编译器(一)
汇编编译器: 汇编程序在被计算机执行之前,必须被翻译成计算机的二进制语言.翻译任务是由汇编编译器来完成的.汇编编译器的输入是一串汇编命令,然后产生一串等价的二进制指令作为输出.生成的代码被加载到计算机 ...
- 计算机要素--第六章 汇编编译器
计算机系统要素,从零开始构建现代计算机(nand2tetris) 如果完成了本书所有的项目 你将会获得以下成就 构建出一台计算机(在模拟器上运行) 实现一门语言和相应的语言标准库 实现一个简单的编译器 ...
- 计算机系统导论第六章答案,《计算机系统概论》-第4章-习题答案
写出冯·诺依曼模型的5个组成部分,并写出各个部件的功能和目的. 输入设备:输入数据 输出设备:输出结果 控制器:控制程序执行 内存:存放程序(各类运行指令) 处理器:对数据进行处理和运算git 简要描 ...
- 计算机系统基础(六)之RISC-V汇编
文章目录 前言 一.RISC-V汇编语言简介 汇编语言的优缺点 二.汇编语言语法介绍 三.RISC-V汇编指令总览 RISC-V 汇编指令操作对象 RISC-V 汇编指令分类 RISC-V 汇编伪指令 ...
- 【Java数据结构与算法】第十六章 图
第十六章 图 文章目录 第十六章 图 一.图 1.介绍 2.基本术语 3.邻接矩阵 4.邻接表和逆邻接表 5.十字链表 二.深度优先遍历 三.广度优先遍历 四.代码实现 一.图 1.介绍 图相较于前面 ...
- 《计算机系统要素》 第六章 汇编编译器
6.1 背景知识 符号化的语言称为汇编,翻译程序称为汇编编译器,汇编编译器对每个汇编命令的所有部分进行解析,将每个部分翻译成它对应的二进制码,并将生成的二进制码汇编成真正能被硬件执行的二进制指令. 编 ...
- 计算机系统要素:第六章 Part2 汇编编译器(symbol)
要给汇编编译器加入符号,首先要明确这个汇编编译器有哪些符号: 预定义符号:SP,LCL等,这些符号预先就在SymbleTable中定义好了对应内存的地址 变量variables:注意,变量是在第二遍读 ...
- 微型计算机系统与接口重要吗,微型计算机系统与接口 马宏锋 等编著 第六章
微型计算机系统与接口 马宏锋 等编著 第六章 (67页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.90 积分 6.1 输入/输出接口概述 内容简介6 ...
最新文章
- 2017.1.9版给信息源新增:max_len、max_db字段
- 来聊聊可形变卷积及其应用
- 如何忽略Git中目录中的文件?
- 数学建模学习笔记——聚类模型
- 从单体到Flink:一文读懂数据架构的演变
- 没有工作经验找it_没有工作经验怎么找工作?
- 【零基础学Java】—static关键字概述(十六)
- python绘制心形图像
- Linux服务-rsync
- 【C++】 ArcFace Demo2.0版
- Cesium中的Heading/Pitch/Roll
- 三星sm-g7106com.android.mms,三星g7106官方原版固件rom系统刷机包_三星g7106线刷包
- 【SpringBoot】微信点餐系统
- 经济应用文写作【4】
- HashMap如何解决hash冲突?
- 【vue路由跳转外部链接】
- 中标麒麟Linux64平台上QT5.6.3源码编译安装
- 【5G会话管理】UE IP地址的管理
- SpringBoot单元测试的@RunWith与@SpringBootTest注解
- Biotin-WFA,WFL;生物素化紫藤凝集素(WFA,WFL)