假设程序计数器(PC)设置为0x20000000,是否可以使用跳转(j)MIPS汇编指令将PC设置为地址0x40000000?是否可以使用等号分支(beq)MIPS汇编指令将PC设置为该相同地址?
答案 0 :(得分:3)
我相信您可以使用jr
跳转到32位地址
li $t0, 0x40000000
jr $t0
类似地,您可以使用分支并将其与上面的内容结合起来以执行此跳转。
BNE
不适合这样做的原因是,由于指令的编码方式,它仅对16位偏移进行操作。
0001 01ss ssst tttt iiii iiii iiii iiii
表示一条BNE
指令,其中sssss
和ttttt
是比较寄存器,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
。