我对以下MIPS代码有一个问题:如果第一条指令放置在0xFFFFFF00处的内存地址中,那么指令“j LoopEnd”的十六进制表示是什么?我不知道该怎么做。任何帮助将不胜感激。谢谢。
loop:
slt $t9, $s3, $s2
bne $t9, $zero, end
add $s4, $s2, $s3
srl $s4, $s4, 1
sll $t0, $s4, 2
add $t0, $s0, $t0
lw $t1, 0($t0)
slt $t9, $s1, $t1
beq $t9, $zero, bigger
addi $s3, $s4, -1
j loopEnd
loopEnd:
j loop
Run Code Online (Sandbox Code Playgroud)
小智 8
j是j型指令,其格式如下:opcode - address
分别为6位和26位。
opcode指令的前 6 位j是000010
接下来的 26 位地址有点棘手。首先,您需要您所引用的标签的地址。在你的例子中,由于 的指令地址slt是0xFFFFFF00,每次加4,loopEnd(即指令j loop)的指令地址将是0xFFFFFF2C。
现在我们有了目标指令的地址0xFFFFFF2C,但这是 32 位,而 J 类型指令中我们只有 26 位可用于目标地址。这是通过删除第一个十六进制数字并删除最后 2 个二进制数字来解决的。实际跳转到的地址的第一个十六进制数字将与当前指令相同(F在您的情况下)。我们可以删除最后 2 个二进制数字,因为指令地址始终是 4 的倍数,因此我们不需要最后 2 个二进制数字给我们提供的 0、1、2、3 的精度,它们将始终用于00指令地址。
将所有这些结合起来作为您的示例:
0xFFFFFF2C-> 0x FFFFF2C-> 转换为二进制
1111_1111_1111_1111_1111_0010_1100->1111_1111_1111_1111_1111_0010_10
现在我们将操作码与解释的指令地址结合起来:
000010_11111111111111111111001010
这就是机器代码j loopend
长话短说