Mips汇编代码转换为机器码

时间:2013-11-06 08:15:21

标签: assembly type-conversion mips instructions machine-code

我必须编写将mips指令转换为二进制的程序,就像在本网站上完成一样: http://www.mipshelper.com/mips-converter.php

请有人帮忙。 我需要写一个mips代码

如果我在控制台上写字:

添加$ t0,$ t1,$ t2

应该结果

00000001001010100100000000100000

2 个答案:

答案 0 :(得分:1)

您可以看到我正在开发的程序,用于将MIPS汇编指令解析为二进制表示形式,格式适合于verilog的$ readmemb()。看一下这个。该程序用C语言编写。

https://www.dropbox.com/sh/vkmfcytlc01yqwf/AACmLEBsN3rhjo9TBVO0RPUCa?dl=0

然而它解析R格式指令(add,sub,或,和slt),I格式(beq,bne,lw,sw),但还不是J格式。实施它们是微不足道的。

我还没有刷新README,但您可以使用-c选项执行它,该选项在编码行(./masmbin -c input.masm ouput.mbin)之后将解析的指令作为注释传输。

关键是要了解每条指令的属性。例如。在lw / sw中,我们有

                                lw rt, #n(rs)

请注意,寄存器的顺序相反,与二进制表示中应编码的顺序相反:

                     [opcode][ rs ][ rt ][immediate]
祝你好运!

编辑:还有一项工作正在进行中(我的翻拍)here

答案 1 :(得分:0)

Darn it,我向后看了这个问题,想出了一个很酷的方法将二进制文件变成操作码。但它可能指向(嘿)你正确的方向:使用指针数组作为一串字符串的索引。我将首先描述(更简单的)二进制到操作码概念,然后调整操作码到二进制的想法。

首先,你没问过的问题:二进制到操作码。考虑使用指令字的每个部分的位作为位移(指针)到一个数组中,然后指向适当的字符串。至少,我认为这就是我要做的事情。

让我们看看如何翻译R型指令的最后6位(使用Green Sheet)。我只是要做前四个:0 = sll,1 =无效,2 = srl,3 = sra。这是数据段,我已经定义了字符串(不一定按顺序)和向量表(按顺序)。

.data

.functNames
f_invalid: .asciiz "invalid_funct"
f_sll: .asciiz "sll"
f_srl: .asciiz "srl"
f_sra: .asciiz "sra"

.align 2
.functXref
.word f_sll # 0
.word f_invalid # 1
.word f_srl # 2
.word f_sra # 3

现在代码。对于“功能”,我们​​希望屏蔽除了我们正在查看的6位之外的所有内容,然后向左移动两次以使其成为字指针。 (对于其他人,你需要向右移动。)

.text
# assume $s0 contains the 32-bit MIPS instruction
andi $t0, $s0, 0x0000003F
sll $t0, $t0, 2
# get pointer to the string
lw $t1, functxref($t0)
# get address of the string
lw $t2, 0($t1)

现在你有了详细说明该指令的字符串的地址(对于带有操作码0的R类型)。

最后,您问的问题是:如何开始将文本转换为二进制文件?也许你可以使用类似的字符串数组和指向字符串的指针。循环遍历可能的字符串,直到找到匹配项(或用完字符串进行比较)。您需要设置一个并行数组来指示它是什么类型的操作码,以及相关的位模式是什么:

.opcodeNames
f_add: .asciiz "add"
f_addi: .asciiz "addi"
f_j: .asciiz "j"

.align 2
.opcodeXref
.word f_add
.word f_addi
.word f_j

.opcodeTypes
ft_add: .byte 'R'
ft_addi: .byte 'I'
ft_j: .byte 'J'

.opcodeVals
fv_add: .byte 0x20
fv_addi: .byte 0x08
fv_j: .byte 0x02

opcodeXref获取指针,使用它来从opcodeNames获取字符串,并查看它是否匹配。如果没有,请转到opcodeXref中的下一个单词。

如果匹配,则使用opcodeXref中的相同索引从.opcodeTypes获取格式,然后从.opcodeVals获取位模式。

希望这足以开始。听起来像一个非常大的项目,尤其是所有字符串操作(不是Assembler非常直观)。