分支指令和Mips中的跳转指令

时间:2014-07-25 18:00:41

标签: assembly branch mips

我是Mips的新手,我需要你的帮助。我遇到了一个练习:

Assuming that the program counter has the 2000 0000hex value in it, is it possible that the program counter will get the 00001000hex or the 20001400hex value using the beq or the jump instruction

首先,我无法真正理解beq指令的16位值和跳转指令的26位值所表示的内容。它是一个偏移量还是一个地址?老实说我觉得它是一个地址,但我真的不明白它是如何工作的。

练习的答案是,对于00001000hex值,两个指令都可以带你到那里,但对于第二个指令,只有跳转指令才有效。这是为什么?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

MIPS上的

branch保持16位位移(相对于下一条指令),以有符号数的指令进行测量。 因此,您可以使用0x2000 0000从地址0x2000 1400branch,其中偏移量为+(0x1400 / 4-1)= 4FF。您无法转到0x0000 1000,因为它的偏移量为 - (1FFF000 / 4 + 1)= -7FFC01,超过16位。

jump包含一个26位值,表示如下计算的绝对地址:
(encoded value * 4) | (next instruction & 0xE0000000),即跳转后的指令中最上面的4位。因此,您可以0x2000 00000x2000 1400jump instr-index=0x500,但无法到达0x0000 1000,因为无论您做什么,新地址中的4位最高位为0x2,而非0x0

如果你想要一个可以带你到任何你想要的指令,MIPS有jr指令,跳转寄存器。由于寄存器包含32位值,因此它可以带您到32位地址空间内的任何位置。