Assembly Mips汇编代码到机器代码的转换

Assembly Mips汇编代码到机器代码的转换,assembly,type-conversion,mips,instructions,machine-code,Assembly,Type Conversion,Mips,Instructions,Machine Code,我必须编写程序,将mips指令转换为二进制,就像在本网站上一样: 请找个人帮忙。 我需要写一个mips代码 如果我在控制台上写: 添加$t0、$t1、$t2 结果应该是这样的 0000000 1001010100100000000100000该死,我把这个问题倒过来看了,想出了一个很酷的办法,把二进制代码转换成操作码。但它可能会给你指明正确的方向:使用指针数组作为一组字符串的索引。我将首先描述(更简单的)二进制到操作码的概念,然后将操作码的思想改编为二进制 首先,您没有问的问题是:二进制转换为

我必须编写程序,将mips指令转换为二进制,就像在本网站上一样:

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

如果我在控制台上写:

添加$t0、$t1、$t2

结果应该是这样的


0000000 1001010100100000000100000

该死,我把这个问题倒过来看了,想出了一个很酷的办法,把二进制代码转换成操作码。但它可能会给你指明正确的方向:使用指针数组作为一组字符串的索引。我将首先描述(更简单的)二进制到操作码的概念,然后将操作码的思想改编为二进制

首先,您没有问的问题是:二进制转换为操作码。考虑将指令字的每个部分的位作为一个位移(指针)到一个数组中,然后将指针指向适当的字符串。至少,我想我会这么做

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

现在是代码。对于“funct”,我们想屏蔽掉除6位之外的所有位,然后向左移动两次,使其成为单词指针。(对于其他人,您需要右移。)

现在您有了详细说明指令的字符串地址(对于操作码为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
opcoderxref
获取指针,使用该指针从
opcodeNames
获取字符串,并查看是否匹配。如果没有,请转到
opcoderxref
中的下一个单词

如果它是匹配的,则使用您在
opcoderxref
中的相同索引从
.opcodeTypes
获取格式,然后从
.opcodeVals
获取位模式


希望这就足够开始了。听起来像是一个相当大的项目,尤其是那些字符串操作(不是汇编程序真正直观的东西)。

该死的,我把这个问题倒过来看了,想出了一个很酷的方法将二进制文件转换成操作码。但它可能会给你指明正确的方向:使用指针数组作为一组字符串的索引。我将首先描述(更简单的)二进制到操作码的概念,然后将操作码的思想改编为二进制

首先,您没有问的问题是:二进制转换为操作码。考虑将指令字的每个部分的位作为一个位移(指针)到一个数组中,然后将指针指向适当的字符串。至少,我想我会这么做

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

现在是代码。对于“funct”,我们想屏蔽掉除6位之外的所有位,然后向左移动两次,使其成为单词指针。(对于其他人,您需要右移。)

现在您有了详细说明指令的字符串地址(对于操作码为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
opcoderxref
获取指针,使用该指针从
opcodeNames
获取字符串,并查看是否匹配。如果没有,请转到
opcoderxref
中的下一个单词

如果它是匹配的,则使用您在
opcoderxref
中的相同索引从
.opcodeTypes
获取格式,然后从
.opcodeVals
获取位模式


希望这就足够开始了。听起来像是一个相当大的项目,特别是有了所有的字符串操作(不是汇编程序真正直观的东西)。

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

但它解析R格式指令(add、sub或and、slt)、I格式指令(beq、bne、lw、sw),但还不能解析J格式指令。实现它们很简单

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

关键是要知道每个指令的属性。例如,在lw/sw中,我们有

                                lw rt, #n(rs)
请注意,寄存器的顺序与二进制表示中应编码的顺序相反:

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


编辑:还有一项工作正在进行中(由我重新制作)。

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

但它解析R格式指令(add、sub或and、slt)、I格式指令(beq、bne、lw、sw),但还不能解析J格式指令。实现它们很简单

我还没有刷新自述文件,但是您可以使用-c选项来执行它,该选项将
                     [opcode][ rs ][ rt ][immediate]