如何简单地将MIPS指令转换为32位十六进制数

时间:2016-12-11 14:22:49

标签: hex mips

我正在使用ASM / MIPS技术,我想训练自己进行转换。

我想将MIPS指令转换为32位十六进制数。 例如,我想将$ t0,$ 0,$ t1更改为hexa数字。

我找到了很多解决方案,但一切都不同。 有什么想法吗?

1 个答案:

答案 0 :(得分:2)

MIPS子指令减去两个寄存器并将结果存储在寄存器中。sub $d,$s,$t表示$d = $s - $t

sub = function code 34 (see manual), 22 in hex, 100010 in bin (6 bits)
$t0 = 8 in decimal, 8 in hex, 01000 in bin (5 bits)
$zero = 0 in decimal, 0 in hex, 00000 in bin (5 bits)
$t1 = 9 in decimal, 9 in hex, 01001 in bin (5 bits)

因此,您的指令的机器代码为01001 01000 00000 100010

对于R格式指令,操作码或“操作代码”始终为零。 rs,rt和rd对应于两个源寄存器和一个目标寄存器。

sub$t0,$zero,$t1因此以十六进制表示法转换为0x00094022

<强>解释

每条MIPS指令都是32位,转换为32位数,可以用十六进制格式写成机器代码。

指令子(减法)具有操作码0x22。因此,最右边的数字必须是22(见上文)。

sub是指令类型R.这意味着当指令使用的所有数据值都位于寄存器中时,使用R指令。

所有R型指令都具有以下格式:

OP rd, rs, rt

其中“OP”是特定指令的助记符(在本例中为sub)。 rs和rt是源寄存器,rd是目标寄存器。在这种情况下,子指令用作:

sub $t0, $zero, $t1

换句话说,你的指令意味着“从0减去t1并将结果放在t0”。

如果要交换两个寄存器的值,可以按如下方式进行:

.text
.globl  __start
__start:

sw      $t0, x
sw      $t1, y
lw      $t0, y
lw      $t1, x
.data
x:
.word   0x000000FF
y:
.word   0xABCDE080

如果你想在$ t1中将内容放在$ t1中,你可以使用or指令:

lui  $t0, 0x0123
or   $t1, $zero, $t0