第六章:汇编编译器

本章详细介绍了如何开发一个汇编编译器,将Hack汇编语言程序转化为Hach硬件平台的二进制代码。内容包括文本处理,解析.asm文件中的指令、常数、符号和注释,以及处理未定义符号的方法。通过两次遍历源代码,首次建立符号表,第二次处理符号化的A-指令并分配内存地址。最后提到了实现的Python模块Parser和SymbolTable,完成了从汇编到机器码的完整转换。
摘要由CSDN通过智能技术生成

目标:开发汇编编译器,将Hack汇编语言编写成的程序翻译成Hach硬件平台能够理解的二进制代码。


分析:本章的本质就是文本处理,将给定的.asm文本根据给定的规则映射为.hack二进制文件。

我们先分析.asm文件,一行可以是一下几种情况:

1)指令:又分为A-指令,C-指令。

2)常数和符号:常数还好解决,用户自定义的符号,还得为其分配内存。

3)注释:以"//"开头的被认为是注释,忽略。

4)空行:忽略。


书中为了降低难度先要求实现一个无符号版的,这也是一种很好的思维方法,将复杂的问题,转换为简单的已知的问题。

书中也给出了模块的API,既然是文本处理,语言自然就是python啦。


实现

Paser模块:

<span style="font-size:12px;">def hasMoreCommand(line):	
	if not line:
		return 0
	return 1

def advance(fl):			#return next line 
	line = fl.readline()
	return line

def clear(line):
	index = line.find('//')
	if index > 0:	#remove the gloss
		line = line[0:index]
	return line.strip('\n ') 		#remove the blank then return

def commandType(line):
	if line.find('(') > -1:
		return 'L_COMMAND'
	elif line.find('@') > -1:
		return 'A_COMMAND'
	else:
		return 'C_COMMAND'

def symbol(line):
	line = line.strip(' ()@\n')
	return line

def dest(line):
	if line.find(";") > 0:		#deal with the jump command
		return 'null'
	index = line.find('=')
	return line[0:index].strip()

def comp(line):
	index = line.find(';')
	if index > 0:
		return line[0:index].strip()
	idx = line.find('
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值