我正在尝试分支到一个地址:
bne $t0, $0, 0x7813a21c
但是,这是不正确的,因为 bne 仅将 16 位分配给立即数
如何分支到直接 32 位地址?有没有办法从寄存器中的值分支?
我正在尝试分支到一个地址:
bne $t0, $0, 0x7813a21c
但是,这是不正确的,因为 bne 仅将 16 位分配给立即数
如何分支到直接 32 位地址?有没有办法从寄存器中的值分支?
您必须使用JR
跳转到存储在寄存器中的地址。
要执行这种类型的操作,您需要一个跳转语句。您必须告诉代码将控制上下文跳转到您希望指定的确切行。这是示例语法:j offset
地址中的偏移量在哪里。
这是一个链接,可以更好地审查您必须做的事情。查看跳跃部分。这些是可用的跳跃类型。其中之一是您需要的:j offset
, jal offset
, jr $rs
,jalr $rs
这是链接: http ://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/jump.html
祝你好运
我们可以分两步将 32 位地址加载到寄存器(例如$t1
):
lui
通过(Load Upper Immediate) 加载高 16 位。ori
通过(或立即数)加载低 16 位。注意:这是有效lui
的,因为用 0 填充低 16 位,因此按位或加载低 16 位(n | 0 = n);
在下面的代码中,如果$t0
等于0,我们会跳过指令。
或者如果不等于 0,我们不跳过指令(或者我们跳转)。jr
$t0
jr
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: