Assembly MIPS指令J格式

Assembly MIPS指令J格式,assembly,mips,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, $

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

j
是一种j型指令,具有以下格式:
opcode-address
分别为6位和26位

前6位,即
j
指令的
opcode
000010

接下来的26位地址有点棘手。首先,您需要所指标签的地址。在您的示例中,由于
slt
的指令地址是
0xFFFFFF00
,每次加4,loopEnd的指令地址(即指令
j loop
)将是
0xFFFFFF2C

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

将所有这些结合到您的示例中:

0xFFFF2C
->
0x-FFFFF2C
->转换为二进制

1111\u 1111\u 1111\u 1111\u 1111\u 0010\u 1100
->
1111\u 1111\u 1111\u 1111\u 0010\u 10

现在,我们将操作码与解释指令地址结合起来:
000010_11111111111001010

这是
j loopend

TL;博士

  • 获取跳转指令的操作码
  • 以十六进制获取标签上的地址
  • 删除地址的第一个十六进制数字
  • 转换成二进制
  • 去掉最后两位
  • 组合操作码和解释地址

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