2014-06-19 431 views
2

似乎應該有一個標準化的解決方案。基本上問題是我想能夠計算我是否應該使用近跳或遠跳。如:計算移動目標偏移量的最佳方法

jump_to_near: 
    ; ... lots of ops ... 

jump_to_near: 
    e9 24 ff ff ff   jmpq 1f22 <jump_to_far> 
    eb f9     jmp 1ff9 <jump_to_near> 

近跳轉操作碼看起來是兩個字節,而遠跳操作碼是五。問題是,如果實際操作碼之後跳轉到標籤來到,我怎麼能知道使用哪一個?是否有一種標準化的算法來計算這樣的緊密依賴關係,尤其是考慮到可能會有很多跳轉的情況,其中更改操作碼的大小可能會影響其他跳轉。

回答

1

我並不是說這是唯一的解決辦法,但對於不同編譯爲我寫的,我已經成功地使用了以下戰略領域特定語言:

對於所有向前跳最初假定目標可短暫跳躍達成。

之後,在反向修補期間,如果某個目標在所有使用短跳轉後都不可訪問,請將該跳轉標記爲需要近乎跳轉,並啓動相關例程的代碼生成。

-

也有可能(是的,其實我已經做到了這一點)發出所有鄰近跳躍(長格式),然後記錄下需要你以後可以搞掂的塊中,以防任何信息找出你可以並想要轉換一個特定的從近到近的跳轉形式。

-

第一種策略通常要簡單得多。

+0

其實我真的很喜歡第二種選擇。我可以試試看,謝謝! – sircodesalot

+0

很酷。根據我的經驗,絕大多數的目標,實際上可以用短跳轉到達,但根據雙方的源語言和編碼風格變化明顯(以及其他因素,如內聯)。 –

+0

是的,在我當前的實現中,我緩存了所有的操作碼,然後將它們釋放到內存中。因此,從擴展版本到簡化版本都很容易。比其他方式更容易(因此原來的問題)。如果我在一段時間(短距離假陰性測試)算錯一個或兩個一旦它不是什麼大不了的事。但是,我認爲一般來說大多數跳躍應該是短暫的。感謝幫助! – sircodesalot