2017-05-13 666 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;