2

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

bne $t0, $0, 0x7813a21c

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

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

4

3 回答 3

1

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

于 2013-04-10T22:02:04.817 回答
0

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

这是一个链接,可以更好地审查您必须做的事情。查看跳跃部分。这些是可用的跳跃类型。其中之一是您需要的:j offset, jal offset, jr $rs,jalr $rs

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

祝你好运

于 2013-04-10T22:04:34.053 回答
0

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

  1. lui通过(Load Upper Immediate) 加载高 16 位。
  2. ori通过(或立即数)加载低 16 位。

注意:这是有效lui的,因为用 0 填充低 16 位,因此按位或加载低 16 位(n | 0 = n);

在下面的代码中,如果$t0等于0,我们跳过指令。 或者如果不等于 0,我们跳过指令(或者我们跳转)。jr
$t0jr

      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:
于 2019-08-04T16:57:40.717 回答