在运行时复制 'b' 指令不起作用

Copying 'b' instruction at runtime doesn't work

这是我的测试代码:

.data
msg:        .asciiz     "test\n"

.text

partc:
b       partb

parta:
syscall

partb:
la      $a0, msg
li      $v0, 4
syscall
li      $v0, 10
syscall

_start:
main:

lw      $t0, partc
la      $t1, parta
sw      $t0, ($t1)
b       parta

如果我按原样运行 代码,它会给出内存越界错误。但是,如果我在 partc 中将 b 更改为 j,它就可以正常工作。我知道 j 可以比 b 跳得更远,但我认为这是它们之间的唯一区别。这里有什么问题?

b使用相对地址,j使用绝对地址。因此,如果您将 b 从一个地方复制到另一个地方,它不会跳转到最初的地址,而是会从新位置跳转相同的距离。