考虑这条 I 型指令(BNE,不等于分支):0001 0100 1010 1001 1111 1111 1110 1111。当满足 NE 条件时,PC 值的变化是什么,即 PC = PC + _____?
问题的答案是-68,但我不完全确定为什么。我知道对于 I-Type 指令,最后 16 位是偏移量,源目标和分支位置之间的有符号差异。所以所有的1都表示负值?但是,我仍然不明白值 68 是如何得出的。
考虑这条 I 型指令(BNE,不等于分支):0001 0100 1010 1001 1111 1111 1110 1111。当满足 NE 条件时,PC 值的变化是什么,即 PC = PC + _____?
问题的答案是-68,但我不完全确定为什么。我知道对于 I-Type 指令,最后 16 位是偏移量,源目标和分支位置之间的有符号差异。所以所有的1都表示负值?但是,我仍然不明白值 68 是如何得出的。
指令的直接部分是
1111 1111 1110 1111
等于-17。这是由于二进制补码编码,人们可以很容易地验证通过将 17 加到这个数字上,我们得到 2^16(如果我们只保留前 16 位,则为零)。
MIPS 指令是 32 位(4 字节)并且它们是对齐的,即它们的地址始终是 4 的倍数。MIPS 架构利用这一特性来增加分支范围,并且由于 PC 始终是 4 的倍数,因此分支偏移量将乘以4之前被添加到PC。这允许存储 4 倍大的偏移量。
因此,值 0 4*(-17) 将添加到 PC,即 -68。
准确地说,官方 MIPS 文档指出
在分支延迟槽中,将一个 18 位带符号偏移(16 位偏移字段左移 2 位)添加到分支之后的指令地址(不是分支本身),以形成 PC 相对的有效目标地址。
一个等效的公式是这个值 -68 将被添加到 PC,在它在获取指令阶段增加 4 之后。