要求
用C或JAVA编写程序,将MIPS汇编指令转换为机器码,并以二进制方式存盘,以作为随后反汇编的输入及CPU模拟器的执行程序。实现如下的指令:R类型(ADD、SUB、SLT)、LW、SW、BEQ、J。
能处理的指令格式
(只是为了写程序的时候处理起来不太麻烦而做的规定)
l 每行一条指令。(不能多条或没有)
l 指令名,变量名,行名等都不能用大写字母,只能用小写和数字。
l BEQ和J支持直接输入要跳转的行的位置(标准mips采用的),也可以输入该行的名称(小写字母开头)。
l 被跳转行的名称应以小写字母开头(若以数字开头会认为是跳转的行数)。
l 被跳转行的头部应顶格写名称,紧跟冒号,再空至少一个空格。
l 每行指令后空开至少一个空格后可写注释(是否有#其实无关紧要)。
下面是合格的(可以正确汇编的)指令:
lw $t0,8($s4) #dfs
tes1: lw $t1 , 0 ( $s1 )#fsfs
add $t0, $t0, $t1 #fefsf
test2: sw $t0, 12 ( $s4) #fgsdg
sub $k0 ,$a1,$a2 #grewgres
slt $s0, $s2,$s1 #fdsgs
beq $k0,$k1, tes1 #fgsgsd
j test2 #regfs
beq $k0,$k1, 12345 #fdsgsdfsdgf
add $s1,$s2,$s3
sub $s1,$s2,$s3#gfsgfdgs
slt $s1,$s2,$s3
lw $s1,20($s2) #ddsfgrwad
hello: lw $s1,-20($s2)
sw $s1,20($s2)
sw $s1,-20($s2) #fdsgsdgdfs
beq $s0,$s1,25
j 250
beq $s0,$s1,for
for: j hello #rgegdsgfds
使用方法
将符合上述规范的指令放在assembly.txt文件中,运行本程序,就能生成用十六进制表示指令的“binary.txt”文件,和二进制文件“binary”。
实例分析
我与ZW同学交换了自己的测试数据,拿对方的汇编指令在自己的程序上跑,比对二进制结果是否相同。经过数次的debug,终于能基本保证正确。
对于上面的输入,输出binary.txt的结果是这样的:
8e880008
8e290000
1094020
ae88000c