以上有個問題:為什麼同樣的匯編指令JMP 12345678卻對應不同的機器碼呢? 首先,機器碼E9表明這是一個近跳轉(Near Jmp) 這裡需要補充下相關知識: JMP分3種: ①短跳轉(Short Jmp,只能跳轉到256字節的范圍內),對應機器碼:EB ②近跳轉(Near Jmp,可跳至同一段范圍內的地址),對應機器碼:E9 ③遠跳轉(Far Jmp,可跳至任意地址),對應機器碼: EA 短跳轉和近跳轉指令中包含的操作數都是相對於(E)IP的偏移。 遠跳轉指令中包含的是目標的絕對地址。 所以短/近跳轉會出現跳至同一目標的指令機器碼不同,不僅會不同,而且應該不同。 而遠跳轉中包含的是絕對地址,因此轉移到同一地址的指令機器碼相同 。 至此,我們知道了跳轉指令所對應的機器碼根據E(IP)計算出來的,那到底是怎麼計算的呢? 比如: 上圖的第一條指令:01007568 - E9 0BE13311 JMP 12345678 此時的EIP=01007568 12345678- 01007568 = 1133E110 這裡只是指向當前指令的EIP處,實際計算跳轉地址要去掉當前指令的長度,當前的跳轉指令需要5個字節, 1133E110 -5= 1133E10B 注意顛倒順序,高位在後