簡體   English   中英

我怎么知道MASM是使用相對偏移還是絕對偏移編碼我的JMP指令?

[英]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唯一機器編碼使用相對位移,而不是絕對位移 另請參見標簽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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM