[英]How do I know whether MASM encodes my JMP instruction using a relative or absolute offset?
我怎么知道MASM是使用相對偏移還是絕對偏移編碼我的JMP指令?
我知道x86提供相對和絕對偏移量的JMP操作碼。
我想確定我的跳轉是相對的,但是我找不到任何合適的MASM文檔來告訴我JMP @label
是否實際上轉換為相對跳轉。
如果可能,請在答案中提供指向文檔的鏈接。
對於相反的問題:請參見如何在MASM中編碼遠為絕對的JMP / CALL指令? 如果您試圖讓MASM發出直接的絕對遠距離jmp
直接接近jmp
的唯一機器編碼使用相對位移,而不是絕對位移 。 另請參見x86標簽Wiki,以獲取指向文檔/手冊的更多鏈接,包括MASM官方手冊。 不過,我認為這個問題沒有任何意義。
幾乎沒有jmp
會立即占用絕對位移,因此沒有匯編程序會意外使用非PIC分支的風險。
絕對的近跳轉將需要寄存器或內存操作數中的地址,因此MASM不能僅將jmp target
組裝到
section .rodata
pointer_to_target dq target ; or dd for a 32bit pointer
section .text
jmp [pointer_to_target]
因為那太荒謬了。 IDK,如果您曾經找到文檔說明這種特定的精神錯亂是特別不可能的。
我可以想象,如果有某種“巨大代碼模型”,所有的跳轉目標都使用64位指針而不是32位相對位移來引用,那么我可以想象一個匯編程序為您做類似的事情。
但是AFAIK,如果要執行此操作,則必須在所有現有的匯編程序中自行執行。
文檔變得腫,沒有提到程序沒有做的每件事,所以我不希望找到任何具體的東西。 這可能是被認為很明顯並且不用說的事情之一。 (或者語法與Intel在其指令參考手冊中使用的語法匹配。)
作為小丑說,你不會得到一個far
沒有要求它跳,所以沒有使用任何匯編的風險JMP ptr16:32
編碼( EA imm16(segment) imm32(offset)
)的正常JMP。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.