要给汇编编译器加入符号,首先要明确这个汇编编译器有哪些符号:

预定义符号:SP,LCL等,这些符号预先就在SymbleTable中定义好了对应内存的地址

变量variables:注意,变量是在第二遍读取阶段才依次从地址16开始计算的

标签符号lables:你会在机器码中见到(LOOP)@LOOP 这样的循环代码,这些就是标签代码,之所以要分两遍读取,就是因为(LOOP)这样的标签有可能出现在@LOOP之前,如果只读取一遍的话无法解决这个问题,因此第一遍读取的目的就是把所有标签的地址给确定。而标签的地址,按照书上的说法,是由(XXX)之前总的指令数决定的。

本书作者已经帮我们把问题最简化了,只要分别考虑这三类符号如何表示就能够在nonsymbol编译器的基础上完成这一部分的内容。

Parser和Code模块与nonsymbol编译器相同,不再列出。

SymbolTable.py

这个模块有些多此一举,因为很多函数在python中都有内置函数可以直接使用,但是为了遵守API规范,还是把这些函数都列出来了。

#!/usr/bin/python
def Constructor():symboldict={'SP' : 0,'LCL' : 1,'ARG' : 2,'THIS' : 3,'THAT' : 4,\'R0' : 0,'R1' : 1,'R2' : 2,'R3' : 3,'R4' : 4,'R5' : 5,'R6' : 6,'R7' : 7,\'R8' : 8,'R9' : 9,'R10' : 10,'R11' : 11,'R12' : 12,'R13' : 13,'R14' : 14,\'R15' : 15,'SCREEN' : 16384,'KBD' : 24576}return symboldictdef addEntry(symbol,address,symboldict):symboldict[symbol]=addressreturn symboldictdef contains(symbol,symboldict):return symboldict.has_key(symbol)def GetAddress(symbol,symboldict):return symboldict[symbol]

Assembler.py

#!/usr/bin/python
import sys
import Parser
import Code
import SymbolTablefilename=sys.argv[1]
#The first Loop, aiming to decide the lables' addresses
symboldict=SymbolTable.Constructor()
rfile = open(filename,'r')
i=0 #i is the sum of the construction numbers above lables
linepre=rfile.readline()
flag=Parser.hasMoreCommands(linepre)
while flag:#clean the line which starts with // or blank lineswhile linepre == '\n' or linepre.startswith('//'):linepre=rfile.readline()if linepre.find('(')>=0:symbol=linepre.strip('()\n')if not SymbolTable.contains(symbol,symboldict):symboldict=SymbolTable.addEntry(symbol,i,symboldict)else: i+=1linepre=Parser.advance(rfile,linepre)flag=Parser.hasMoreCommands(linepre)rfile.close()#The second Loop
j=0 #j records the total number of previous variables
rfile = open(filename,'r')
wfile = open('prog.hack','w')
#main loop
line=rfile.readline()
flag=Parser.hasMoreCommands(line)
while flag:while line == '\n' or line.startswith('//'):line=rfile.readline()ctype=Parser.commandType(line)#compare command typeif ctype is 'A_COMMAND':AS=Parser.symbol(line)if not AS.isdigit():if not SymbolTable.contains(AS,symboldict):symboldict=SymbolTable.addEntry(AS,j+16,symboldict)j+=1binAS=bin(SymbolTable.GetAddress(AS,symboldict))[2:]else:binAS=bin(int(AS))[2:]AString=binAS.zfill(15)wfile.write('0'+AString+'\n')#L_COMMAND should be deletedelif ctype is 'C_COMMAND':DestString=Code.dest(line)CompString=Code.comp(line)JumpString=Code.jump(line)wfile.write('111'+CompString+DestString+JumpString+'\n')line=Parser.advance(rfile,line)flag=Parser.hasMoreCommands(line)rfile.close()
wfile.close()

注意点:

1,两次循环的问题

2,A指令中数字变量和字幕变量的分情况处理

计算机系统要素:第六章 Part2 汇编编译器(symbol)相关推荐

  1. 计算机系统要素--第六章,01-HACK汇编编译器模块介绍

    从零开始构建现代计算机--第六章,01-HACK汇编编译器模块介绍 语法分析器(Parser) 编码(Code) 无符号程序的汇编编译器 符号表(Symbol Table) 有符号程序的汇编编译器 H ...

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

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

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

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

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

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

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

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

  6. 用AntlR4实现简单的汇编编译器

    最近在学习<计算机系统要素--从零构建现代计算机>这本书,花了两天时间用antlr4把书中第6章的汇编编译器实现了. 输出的机器指令和参考答案完全一致. 下面把antlr4的代码贴出来,供 ...

  7. 计算机系统要素高清pdf,计算机系统要素:从零开始构建现代计算机[PDF][43.21MB]...

    内容简介 本书通过展现简单但功能强大的计算机系统之构建过程,为读者呈现了一幅完整.严格的计算机应用科学大图景.本书作者认为,理解计算机工作原理的最好方法就是亲自动手,从零开始构建计算机系统. 通过12 ...

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

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

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

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

最新文章

  1. 4.Java面向对象相关知识总结
  2. 都江堰--我永远支持你
  3. 【Tools】Xshell6安装和卸载图解教程
  4. SQL 中 PROCEDURE,TRIGGER,FUNCTION简单应用
  5. c语言 编程 牛顿迭代,C语言编写牛顿迭代法的跟踪
  6. 对html2canvas的研究
  7. Missing binding node_modules/node-sass/vendor/darwin-x64-72/binding.node
  8. 新浪微博数据网络舆情分析客户端软件
  9. java 实现中文排序,Java自定义比较器实现中文排序
  10. 定制Bootstrap
  11. xshell连接成功但无法输入命令_如何解决cisco设备无法进入系统问题?
  12. Python实现Kubernetes Operator
  13. sybase默认数据库
  14. win8计算机意外,解决win8.1/win10开机提示“致命错误c0000034”的方案
  15. VALSE 4月12日 下午 第一会场 深度学习模型设计 会议记录
  16. 程序员面试、算法研究、编程艺术、红黑树、机器学习5大经典原创系列集锦与总结
  17. 数学学习方法:直观思维的重要性
  18. go编译找不到包golang.org/x/net
  19. 【HDOJ】4355 Party All the Time
  20. cdc有哪些rapper_cdc说唱会馆成员介绍

热门文章

  1. 根据搜索词使得搜索结果中的关键词改变颜色
  2. 成功的交易者有什么好的方法去做期货交易
  3. 认识单元测试中的打桩
  4. dedeCMS采集规则各大CMS采集规则通用
  5. 【天空盒】资源预览下载
  6. SPOJ DQUERY - D-query (莫队算法)
  7. NIST加密标准是什么意思?
  8. Truth or dare - 真心话大冒险片尾曲
  9. MapReduce学习之概述和设计构思
  10. 【C语言初学必看】猜数字游戏背后的知识