簡體   English   中英

MIPS匯編中的兩個順序分支指令?

[英]Two sequential branch instructions in MIPS assembly?

我正在嘗試對MIPS固件進行逆向工程。 對於32位r4kec處理器,固件采用大端編碼。

我已經反匯編(使用objdump)二進制文件來查看程序集的外觀,並且所有內容看起來都像是有效的代碼,但是在代碼的開頭我看到了以下兩條指令:

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

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

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

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

那么我要對這段代碼做些什么呢? 我不認為這是一個以已知的確定性方式處理這種情況的cpu的手工組裝(盡管它不會太過牽強)。 我也無法相信編譯器會故意生成這樣的代碼。 另一種可能性是我使用錯誤的反編譯器來處理二進制文件,或者我有錯誤的字節序,或者別的......

誰能解釋一下這里發生了什么?

“未定義的行為”僅僅意味着 - 沒有指明會發生什么。 它可能導致CPU鎖定,或者它可能實際執行指令。

有關M88K中使用的延遲槽的一些技巧,請參閱此文章:

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

或者答案可能更簡單:您可能正在查看數據,而不是代碼。 由於原始二進制文件沒有關於代碼/數據邊界的信息,因此objdump默認為反匯編所有內容,無論它是否有意義。

雖然這是未定義的行為,但是特定的CPU實現可能會對此指令序列執行一些有用且可重復的操作。 要告訴的唯一方法是在實際實現上運行代碼。 使用調試器在每個分支的目標上放置一個斷點,並查看您獲得的斷點。

這甚至可能是手動生成的程序集中的錯誤,因為代碼的實際行為不正確,所以從未捕獲過。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM