MIPS如何分支到32位地址?

时间:2013-04-10 21:54:59

标签: mips

我正在尝试分支到一个地址:

bne $t0, $0, 0x7813a21c

然而,这是不正确的,因为bne仅将16位分配给立即

如何分支到直接的32位地址?有没有办法从寄存器中的值分支?

3 个答案:

答案 0 :(得分:1)

您必须使用JR跳转到存储在寄存器中的地址。

答案 1 :(得分:0)

要执行此类操作,您需要一个跳转语句。您必须告诉代码将控制上下文跳转到您希望指定的确切行。这是示例语法:j offset您的地址中的位置是偏移量。

这是一个更好地回顾您必须做的事情的链接。查看有关跳转的部分。这些是可用的跳跃类型。其中一个就是您所需要的:j offsetjal offsetjr $rsjalr $rs

这是链接: http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/jump.html

祝你好运

答案 2 :(得分:0)

我们可以分两个步骤将32位地址加载到寄存器(例如$t1):

  1. 通过lui加载高16位(立即加载高位)。
  2. 通过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: