2014-03-01 39 views
4

英特爾軟件開發maunal,調用指令支持:如何使用64位調用門

call r/m64 
call m16:32 
call m16:64 

在用戶代碼,如果我要轉移通過64位調用門與響0選擇器47. 如何使用intel語法在彙編中編寫指令?

測試:

call far [mem]; wrong 
call qword ptr [mem]; wrong 

內存內容:

[mem + 0]: qword 0x00 
[mem + 8]: word 47 
+0

這是一個遠射,但'tword ptr'用於解決10個字節的結構(基本上是80位長的double)。另外一些彙編程序使用'lcall'進行長時間通話。 –

+0

我以爲只有中斷和系統調用可以轉移到零環?畢竟,如果簡單的調用可以改變它,它並不是真正的安全功能。 – EOF

+0

不,調用門是從環x(x> 0)輸入環0的選項。 –

回答

1

正確的關鍵字使用是fword ptr。這將產生m16:32變體,但是因爲對於調用門而言,偏移量將被忽略,並且將從門上載入全部64位的RIP,這將很好。但是,如果要保留m16:64指針,則必須手動包含前綴REX,如rex64 call fword ptr [mem]rex.w call fword ptr [mem]

+0

順便說一句,'call far [mem]'的意思是什麼,我發現它不等於'call fword ptr [mem]'。 –

+0

從生成的機器代碼判斷,「遠」似乎被默默忽略,並在這種情況下產生近旁呼叫。 – Jester