如何在保护模式下执行间接远跳转/呼叫?首先,我认为这样做是允许的:
jmp 0x10:eax;
(不用担心段选择器。我的 GDT 的第二个条目是有效的代码段)
但是当 nasm 组装它时,这是一个语法错误。查看 Intel (instruction set reference) 手册的 Book 2a,只能使用jmp ptr16:32
,其中ptr16:32
是立即数,或使用jmp m16:32
,其中m16:32
是包含 48 位跳转地址的内存位置(16:32 )。
现在我尝试以这种方式对其进行编码:
mov dword[ds:jumpaddress_offset],eax
; or just dword[jumpaddress_offset],eax
mov word[ds:jumpaddress_sel],0x10;
; or just mov word[ds:jumpaddress_sel],0x10;
jmp dword far [dword ds:jumpaddress];
...
jumpaddress:
jumpaddress_sel dw 0
jumpaddress_offset dd 0
它组装成功,但是当我尝试运行它时,处理器出现一般保护故障并重新启动。我不知道发生了什么。
我假设编码是这样的:
(例如我想使用间接跳转跳转到 0x10:0x8010)
dw 0x10
dd 0x8010
这可能有什么问题?是不是应该用小端编码48位内存值?它应该这样编码吗?
;0010 0000 8010
dd 0x10,0x80,0,0,0x10,0
我还没试过做最后一个。