我正在尝试分支到一个地址:
bne $t0, $0, 0x7813a21c
然而,这是不正确的,因为bne仅将16位分配给立即
如何分支到直接的32位地址?有没有办法从寄存器中的值分支?
答案 0 :(得分:1)
您必须使用JR
跳转到存储在寄存器中的地址。
答案 1 :(得分:0)
要执行此类操作,您需要一个跳转语句。您必须告诉代码将控制上下文跳转到您希望指定的确切行。这是示例语法:j offset
您的地址中的位置是偏移量。
这是一个更好地回顾您必须做的事情的链接。查看有关跳转的部分。这些是可用的跳跃类型。其中一个就是您所需要的:j offset
,jal offset
,jr $rs
,jalr $rs
这是链接: http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/jump.html
祝你好运答案 2 :(得分:0)
我们可以分两个步骤将32位地址加载到寄存器(例如$t1
):
lui
加载高16位(立即加载高位)。ori
(或立即数)加载低16位。注意:之所以可行是因为lui
用0填充低16位,所以按位或 load 加载低16位(n | 0 = n);
在下面的代码中,如果$t0
等于等于0,我们 do 跳过jr
指令。
或者,如果$t0
not 等于0,则我们执行 not 跳过jr
指令(或者我们 do 跳转)。
beq $t0, $0, SKIP
# load 0x7813a21c to $t0
lui $t1, 0x7813 # load the upper 16 bits
# Now $t1 = 0x78130000
ori $t1, $1, 0xa21c # load the lower 16 bits
# Now $t1 = 0x7813A21C
jr $t1 # as @Matt Eckert said
SKIP: