我試圖了解跳轉地址是如何計算的。到目前為止,使用 MIPS 指令結構(32 位 ISA),我能夠理解這一點。閱讀我得到的一些材料后的解決方案是:連接以下內容:
- PC 的高 4 位
- 目標地址
- 低00后
現在如果我得到一個不同的位 ISA 比如說 8 位。其中 J 指令格式為:
- 操作碼 - 2 位
- 目標地址 - 6 位
目標地址會以相同的方式計算還是以不同的方式計算?
請幫我理解。
uj5u.com熱心網友回復:
如果沒有記錄,您必須從一些示例機器代碼或作業匯編程式對 ISA 設計進行逆向工程。所有商業 ISA都記錄了它們的機器代碼是如何作業的,在你期望使用機器代碼的地方教授 ISA 也是如此,而不僅僅是 asm 源代碼。
根據您的建議,我們可以嘗試猜測:
如果有一條 1 位元組指令,則不能假定指令與 4 位元組邊界對齊,盡管它幾乎不可能要求跳轉目標仍然對齊。但是,如果不需要對齊,那么您就不會左移立即數來創建低 2 位為零的地址。
在 1 位元組跳轉指令中,我希望 6 位用作相對偏移量(例如 MIPS b,例如beq $zero,$zero, target),而不是像 MIPS 那樣絕對分段j,因為 6 位絕對分段通常會遇到問題,您無法跳過附近的某個邊界。(64 位元組的塊非常小,而且你經常j在函式內部有一個無法跨越的邊界。)我假設還有一個更長的跳轉指令,范圍更大,以便可以尾呼叫其他函式超過 -32.. 31 個位元組
但是當然任何設計都是可能的,甚至可能使用立即數作為 2 的冪來跳轉多遠,所以你可以向前或向后跳躍 2、4、8、16、.. 位元組。或者到段內的那個位置。這將很難利用,但至少可以設計。
我提到最后一種可能性主要是為了表明如果沒有您正在使用的 ISA 的檔案,您將無法做出任何假設。(如果它在商業上取得了成功,您通常可以猜到大部分設計都是合理的,但有時在考慮整個設計時,它們本身看起來很瘋狂的事情是有道理的。或者只是祖傳設計的遺留包袱,例如 x86。 )
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/503877.html
