MIPS 分支指令 - 获取分支位置
MIPS Branch Instruction - Getting Branch Location
我想知道如何找到指令的分支位置,例如
bne $s1, $s0, label_name
。据我了解,16 位立即数是一个相对偏移量,应该添加到 PC 以进行分支。
我想知道分支地址是如何计算的,因为我发现了同一件事的多个相互矛盾的答案。
到目前为止我发现了什么:
- 将当前 PC 增加四。
- 将立即数(16 位)左移二(乘以四)。
- 将立即数符号扩展到 32 位。
- 添加 PC 和立即数。
这是正确的吗?如果是这样,我将如何在 C 中签署扩展这个值?
这个等式说明了一切。
PC'=
下一个PC
。
SignImm=
符号扩展即时
PC' = PC + 4 + SignImm*4
您可以获得下一个PC
(PC'
)如下。
在当前PC
的基础上加四。
符号扩展16位立即数。
向左移动 2,然后将其添加到 PC+4
。
我如何在 C 中签名扩展它
int16_t s = -890;
int32_t i = s;
我想知道如何找到指令的分支位置,例如
bne $s1, $s0, label_name
。据我了解,16 位立即数是一个相对偏移量,应该添加到 PC 以进行分支。
我想知道分支地址是如何计算的,因为我发现了同一件事的多个相互矛盾的答案。
到目前为止我发现了什么:
- 将当前 PC 增加四。
- 将立即数(16 位)左移二(乘以四)。
- 将立即数符号扩展到 32 位。
- 添加 PC 和立即数。
这是正确的吗?如果是这样,我将如何在 C 中签署扩展这个值?
这个等式说明了一切。
PC'=
下一个PC
。
SignImm=
符号扩展即时
PC' = PC + 4 + SignImm*4
您可以获得下一个PC
(PC'
)如下。
在当前
PC
的基础上加四。符号扩展16位立即数。
向左移动 2,然后将其添加到
PC+4
。
我如何在 C 中签名扩展它
int16_t s = -890;
int32_t i = s;