MIPS指令J格式

时间:2013-04-04 15:19:35

标签: assembly mips

我对以下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

1 个答案:

答案 0 :(得分:2)

j是一种j型指令,格式如下:opcode - address 它们分别是6位和26位。

前6位,opcode指令的j000010

地址的下26位有点棘手。首先,您需要您所指的标签的地址。在您的示例中,由于slt的指令地址为0xFFFFFF00,每次向上计数4,因此loopEnd的指令地址(指令j loop)将为0xFFFFFF2C

所以现在我们有了目标指令0xFFFFFF2C的地址,但这是32位,而我们在J型指令中只有26位用于目标地址。这是通过丢弃第一个十六进制数字并删除最后2个二进制数字来处理的。实际跳转到的地址的第一个十六进制数字将与当前指令(在您的情况下为F)相同。我们可以删除最后2位二进制数字,因为指令地址总是4的倍数,所以我们不需要最后2位二进制数字给出的0,1,2,3的精度,它们总是{{1}用于指令地址。

将所有这些结合起来作为例子:

00 - > 0xFFFFFF2C - >转换为二进制

0x FFFFF2C - > 1111_1111_1111_1111_1111_0010_1100

现在我们将操作码与解释的指令地址结合起来: 1111_1111_1111_1111_1111_0010_10

这是000010_11111111111111111111001010

的机器代码

TL; DR

  1. 获取跳转指令的操作码
  2. 以十六进制标签获取地址
  3. 删除地址的第一个十六进制数字
  4. 转换为二进制
  5. 删除最后两位
  6. 合并操作码和解释地址