首页 文章

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

提问于
浏览
0

我是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 回答

  • 2

    MIPS上的 branch 保持16位位移(相对于下一条指令),测量为有符号数的指令 . 所以你可以通过 branch 从地址 0x2000 00000x2000 1400 获得偏移量(0x1400 / 4-1)= 4FF . 你不能得到 0x0000 1000 ,因为它的偏移量为 - (1FFF000 / 4 1)= -7FFC01 ,超过16位 .

    jump 包含一个26位值,表示如下计算的绝对地址:
    (encoded value * 4) | (next instruction & 0xE0000000) ,即跳转后从指令中取出最高的4位 . 所以你可以通过 jump instr-index=0x5000x2000 00000x2000 1400 ,但是你无法进入 0x0000 1000 ,因为无论你做什么,新地址中的4个最高位将是 0x2 ,而不是 0x0 .

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

相关问题