MIPS 分支指令 - 获取分支位置

MIPS Branch Instruction - Getting Branch Location

我想知道如何找到指令的分支位置,例如 bne $s1, $s0, label_name。据我了解,16 位立即数是一个相对偏移量,应该添加到 PC 以进行分支。

我想知道分支地址是如何计算的,因为我发现了同一件事的多个相互矛盾的答案。

到目前为止我发现了什么:

  1. 将当前 PC 增加四。
  2. 将立即数(16 位)左移二(乘以四)。
  3. 将立即数符号扩展到 32 位。
  4. 添加 PC 和立即数。

这是正确的吗?如果是这样,我将如何在 C 中签署扩展这个值?

这个等式说明了一切。

PC'=下一个PC

SignImm= 符号扩展即时

  PC' = PC + 4 + SignImm*4 

您可以获得下一个PCPC')如下。

  1. 在当前PC的基础上加四。

  2. 符号扩展16位立即数。

  3. 向左移动 2,然后将其添加到 PC+4

我如何在 C 中签名扩展它

     int16_t s = -890;
     int32_t i = s;