4

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

1 回答 1

6

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

前 6 位,opcode对于一条j指令是000010

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

所以现在我们有了目标指令的地址0xFFFFFF2C,但这是 32 位,而我们只有 26 位用于 J 型指令中的目标地址。这是通过删除第一个十六进制数字并删除最后 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

TL;博士

  1. 获取跳转指令的操作码
  2. 在十六进制的标签处获取地址
  3. 删除地址的第一个十六进制数字
  4. 转换为二进制
  5. 删除最后两位
  6. 结合操作码和解释地址
于 2015-02-17T23:33:44.967 回答