2014-02-09 76 views
7

我正在嘗試反向設計MIPS固件。固件是大端編碼的,用於32位r4kec處理器。MIPS彙編中的兩條連續分支指令?

我已經拆卸(可以使用objdump)二進制看裝配看起來像什麼,一切看起來合法的代碼,但就在我看到下面的兩個指令的代碼的開頭:

bfc00220 152a0001 bne t1, t2, 0xbfc00228 
bfc00224 10000009 b 0xbfc0024c 

第一條指令檢查t1和t2寄存器的值,如果不相等則跳轉到一個地址。第二條指令似乎處理掉落情況,直接跳到後續地址。到目前爲止好,還是不好?

據我所知,這是不合法的。我讀取的所有可用MIPS文檔都聲明,直接跟隨任何分支/跳轉指令的指令被視爲跳轉延遲槽,其跳轉延遲槽的指令始終(除了可能的分支類指令外)在實際跳轉之前執行執行。

這裏的關鍵問題是跳轉延遲槽中的另一分支/跳轉是不允許,這將使處理器處於未定義狀態。

那麼我要做的這段代碼呢?我不相信這是手工裝配(儘管它不會太牽強),因爲對於以已知確定性方式處理這種情況的CPU來說。我也不能相信編譯器會故意生成這樣的代碼。另一種可能性是,我使用錯誤的反編譯器的二進制文件,或者我有字節順序錯誤,或其他...

任何人都可以解釋這裏發生了什麼?

+1

復位或加電後,MIPS處理器執行的第一條指令的地址是什麼?這些前兩條指令是否是某種類型的頭文件,並且從未作爲代碼執行過? – rcgldr

+0

'b'指令是*分支*,而不是「中斷」。 –

+0

編輯爲s/break/branch /供將來的搜索者使用。 – markgz

回答

0

雖然這是未定義的行爲,但是對於此指令序列,特定的CPU實現可能會做一些有用且可重複的操作。唯一的方法是通過在該實際實現上運行代碼。使用調試器在每個分支的目標上放置一個斷點,並查看您得到的是哪一個斷點。

這甚至可能是手工生成的程序集中的一個錯誤,因爲代碼的實際行爲沒有錯誤,所以從未被捕獲。

+0

我認爲你可能是對的 - 這可能是手工製作的組件,並且這兩個分支指令被放置在那裏,並且按照預期「針對特定CPU」「意外」工作。 我沒有這個代碼應該運行的板的jtag接口,但是一旦我進一步進行了反轉,我應該可以像這樣運行代碼並通過串行輸出來跟蹤它。 – user3290882

2

「未定義的行爲」的意思就是 - 沒有指定會發生什麼。它可能會導致CPU鎖定,或者它可能實際執行指令。

看到這個職位的一些技巧與延遲槽在M88K中使用的:

http://www.pagetable.com/?p=313

或者答案可能是更簡單:你看到的可能是數據,而不是代碼。由於原始二進制文件沒有關於代碼/數據邊界的信息,因此objdump默認爲反彙編所有內容,無論它是否合理。