call gate

gas的call far 形狀的指令編碼是 FF /2 不知道爲何!編碼

64位模式下當即數是限制爲32位,所以64位call 調用門只能是經過間接形式。指針

            call fword ptr [far_ptr]it

far_ptr:pdf

           .long 0x0im

            .word call_gate_selecotrcall

call fword ptr 在gas裏是這種 CALL MEM16:32,若是想用64位偏移須要這樣:word

            .byte 0x48img

            call fword ptr [far_ptr]co

far_ptr:

            .long    0x0

            .long    0x0

            .word    call_gate_selecotr

AMD是不支持 call mem16:64,所以就用 CALL MEM16:32比較好,對於調用門來講偏移部分是被忽略的,完整的64位RIP的值是從調用門描述符種獲取,因此CALL MEM16:32是正確的選擇。

正是由於AMD不支持80位的長指針,所以jmp far call far 最好是不用,用retfq 和 iretq 是最好的選擇。

AMD64 Architecture Programmer’s Manual
Volume 2:
System Programming

24593-3.23.pdf  May 2013

64位調用門保護規則與32位相同,可是棧交換機制有變化。64位調用門的第二個類型域(字節13)用作一致性校驗,這5個位必須是0.

相關文章
相關標籤/搜索