如何简单地将 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
我正在使用 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