【问题标题】:MIPS Instruction J-FormatMIPS指令J格式
【发布时间】:2013-04-04 15:19:35
【问题描述】:

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

【问题讨论】:

  • 为什么不运行as,然后运行objdump 来找出答案?对我来说似乎是最快和最简单的方法。
  • 您好,我不确定您指的是什么。我应该手动计算。
  • 我指的是使用汇编器和反汇编器。您的问题在当前状态下无法回答,因为您粘贴的代码中没有loopEnd,这使得无法计算分支目标地址。
  • 哦,抱歉,错过了 loopEnd 代码。重新编辑了我的 qn。

标签: assembly mips


【解决方案1】:

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

前 6 位,j 指令的 opcode000010

地址的下 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的机器码

TL;DR

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多