2011-11-19 64 views
4

我試圖計算出正確的操作碼的跳,我在其他線程看着這個和我還是不明白:計算JMP的操作碼

我認爲公式爲desination - (from+5)但其只是不工作,它的方式了,這裏就是我想跳到/從地址:

FROM: 6259326B 
TO: 02980000 

CORRECT OPCODE: E9 90CD3EA0 
FORMULA OPCODE: E9 5FC13266 

所以我有這個問題,任何幫助表示讚賞。

回答

5

你正在計算負面jmp!所以,正確的公式是:

0 - (從 - desination) - 5

0 - ($ 6259326B - $○二九八○○○○) - 5

什麼等於$ A03ECD90(或$ 90小尾數的CD3EA0)。

+0

感謝您的回答,我現在使用的代碼是'to-5-from',它給出了與您相同的輸出。我是否正確地說我的新代碼適用於所有5個字節的跳轉? – Drahcir

+0

@Richard Livingston:是的,它應該適用於所有5個字節的操作碼跳轉。 –

1

的公式是罰款(雖然看似提供的組裝和地址不準確匹配:02980000 - 6259326b - 5 = c726cd90,反向的字節順序,它幾乎你正確的組裝相匹配,編號承擔其關閉,由於圖像搬遷等。 )。你確定你正確地做了數學運算顛倒了字節順序以匹配相對32位跳轉所需的編碼(小尾數)?

1

該公式是正確的,假設跳轉指令正好有5個字節,並且FROM是該跳轉指令的地址。如果長度不是5或FROM不是jmp所在的位置,則不正確。

與您在模得到2 算術:

2980000H-(6259326BH + 5)= 0A03ECD90H。

如果你不知道如何2980000H - 62593270H等於0A03ECD90H在32位,想象你是從102980000H而不是2980000H減去了一下,那就是,你有33位設置。那麼你有102980000H - 62593270H = 0A03ECD90H。你可以驗證102980000H = 62593270H + 0A03ECD90H。但是因爲你只有32位計算,所以第33位,不管它是什麼,都不會影響總和和差異。所以你只需將這兩個數字相減爲32位數字,並取最不重要的32位結果,忽略32位以外的任何未完成借入。

而且0A03ECD90H在從最低顯著字節到最顯著字節JMP指令進行編碼,讓您獲得編碼的指令字節序列:

E9,90,CD,3E, A0。

A similar question已被詢問過。