我正在嘗試反向設計MIPS固件。固件是大端編碼的,用於32位r4kec處理器。MIPS彙編中的兩條連續分支指令?
我已經拆卸(可以使用objdump)二進制看裝配看起來像什麼,一切看起來合法的代碼,但就在我看到下面的兩個指令的代碼的開頭:
bfc00220 152a0001 bne t1, t2, 0xbfc00228
bfc00224 10000009 b 0xbfc0024c
第一條指令檢查t1和t2寄存器的值,如果不相等則跳轉到一個地址。第二條指令似乎處理掉落情況,直接跳到後續地址。到目前爲止好,還是不好?
據我所知,這是不合法的。我讀取的所有可用MIPS文檔都聲明,直接跟隨任何分支/跳轉指令的指令被視爲跳轉延遲槽,其跳轉延遲槽的指令始終(除了可能的分支類指令外)在實際跳轉之前執行執行。
這裏的關鍵問題是跳轉延遲槽中的另一分支/跳轉是不允許,這將使處理器處於未定義狀態。
那麼我要做的這段代碼呢?我不相信這是手工裝配(儘管它不會太牽強),因爲對於以已知確定性方式處理這種情況的CPU來說。我也不能相信編譯器會故意生成這樣的代碼。另一種可能性是,我使用錯誤的反編譯器的二進制文件,或者我有字節順序錯誤,或其他...
任何人都可以解釋這裏發生了什麼?
復位或加電後,MIPS處理器執行的第一條指令的地址是什麼?這些前兩條指令是否是某種類型的頭文件,並且從未作爲代碼執行過? – rcgldr
'b'指令是*分支*,而不是「中斷」。 –
編輯爲s/break/branch /供將來的搜索者使用。 – markgz