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

How to simply convert MIPS instruction to 32bits hex number

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

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

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

MIPS sub指令将两个寄存器相减并将结果存储在一个寄存器中。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 格式指令,操作码或 "operation code" 始终为零。 rs、rt、rd分别对应两个源寄存器和一个目的寄存器。

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

说明

每条MIPS指令都是32位的,转换成一个32位的数字,可以写成十六进制格式的机器码。

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

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

所有 R 类指令的格式如下:

OP rd, rs, rt

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

sub $t0, $zero, $t1

换句话说,你的指令意味着"subtract t1 from 0 and put the result in t0"。

如果你想交换两个寄存器的值,你可以这样做:

.text
.globl  __start
__start:

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

如果想把$t0中的内容也放到$t1中,可以使用or指令:

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