1

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

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

如果我在控制台上写:

添加 $t0、$t1、$t2

结果应该是

00000001001010100100000000100000

4

2 回答 2

1

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

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

然而,它解析 R 格式指令(add、sub、or、and、slt)、I 格式(beq、bne、lw、sw),但还没有 J 格式。实现它们很简单。

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

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

                                lw rt, #n(rs)

请注意,寄存器的顺序是相反的,与应该以二进制表示形式编码的顺序相反:

                     [opcode][ rs ][ rt ][immediate]

祝你好运!

编辑:这里还有一项正在进行的工作(我的翻拍)。

于 2013-12-07T16:11:09.217 回答
0

该死,我倒着读了这个问题,想出了一个很酷的方法来把二进制文件变成一个操作码。但它可能会为您指明正确的方向(呵呵):使用指针数组作为一堆字符串的索引。我将首先描述(更简单的)二进制到操作码的概念,然后调整操作码到二进制的想法。

首先,你没有问的问题:binary into opcode。考虑将指令字的每个部分的位用作数组的位移(指针),然后将您指向适当的字符串。至少,我认为我会这样做。

让我们看看如何翻译 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 真正直观的东西)。

于 2013-11-06T15:44:38.077 回答