我正在使用ASM / MIPS技术,我想训练自己进行转换。
我想将MIPS指令转换为32位十六进制数。 例如,我想将$ t0,$ 0,$ t1更改为hexa数字。
我找到了很多解决方案,但一切都不同。 有什么想法吗?
答案 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