MIPS跳转和BNE地址计算

时间:2018-11-21 13:44:50

标签: mips cpu-architecture mips32

假设程序计数器(PC)设置为0x20000000,是否可以使用跳转(j)MIPS汇编指令将PC设置为地址0x40000000?是否可以使用等号分支(beq)MIPS汇编指令将PC设置为该相同地址?

2 个答案:

答案 0 :(得分:3)

我相信您可以使用jr跳转到32位地址

li $t0, 0x40000000
jr $t0

类似地,您可以使用分支并将其与上面的内容结合起来以执行此跳转。

BNE不适合这样做的原因是,由于指令的编码方式,它仅对16位偏移进行操作。

0001 01ss ssst tttt iiii iiii iiii iiii表示一条BNE指令,其中sssssttttt是比较寄存器,iiii iiii iiii iiii是16位偏移量(二进制补码,允许向后偏移量)。 这意味着0x20000000偏移不能用此编码提供的16位来表示。

跳转指令的行为与使用当前PC计算目标地址的方式有些不同。这是通过将当前PC的前6位(在这种情况下为0010 00)和存储在编码的立即部分中的目的地(将是26位用{{1 }})。因此,结果地址只能是0

另一方面,跳转寄存器(0x20000000)可以跳转到完整的32位地址,因为它使用了寄存器作为目标地址,并且不受上述指令限制的约束。

答案 1 :(得分:1)

文档在BEQ指令的编程说明部分中声明了以下内容:

  

说明:如果rs = rt,则分支一个18位带符号偏移量(   将16位偏移字段左移2位)添加到   分支(不是分支本身)之后的指令,在   分支延迟槽,以形成相对于PC的有效目标地址。

     

编程说明:   使用18位带符号指令偏移量,   条件分支范围为±128 KB。使用跳转(J)或跳转   寄存器(JR)指令以跳转到该范围之外的地址。

因此,您不能使用BEQ指令跳至0x40000000(从0x20000000开始,它必须跳过0x20000000 = 536870912 b = { {1}} kb)。因此,您必须使用跳转寄存器指令跳转到536871