2017-05-13 51 views
1

我想知道如何找到指令的分支位置,如 bne $s1, $s0, label_name。从我所了解的16位立即值是一个相对偏移量,应该添加到PC分支。MIPS分支指令 - 获取分支位置

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

我迄今发现:

  1. 递增当前PC四。
  2. 将立即数值(16位)左移两位(乘以四)。
  3. 符号将立即值延长到32位。
  4. 添加PC和立即值。

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

+0

转移偏移通常是从该分支指令的下一条指令的地址有符号位移扩展它,所以分支0会做什么。 –

+0

我不明白的是如何计算分支目标地址。如果我正在执行0x400020处的指令并需要跳转到0x400004,那么PC的新地址如何计算?如果我将16位立即数加到PC上,我会得到比我所需要的地址大得多的地址。 –

+0

这是一个签名的位移。但我的意见是一般的,也许MIPS不像典型的处理器。 –

回答

1

这个等式说明了一切。

PC'=接下来PC

SignImm=符号扩展immidiate

PC' = PC + 4 + SignImm*4 

你可以得到下一个PCPC')如下。

  1. 将四个添加到当前的PC

  2. 符号扩展16位立即。

  3. 将它左移2并将其添加到PC+4

如何将签署用C

 int16_t s = -890; 
    int32_t i = s;