在保护模式下进行间接远跳转/调用

pri*_*ner 4 x86 assembly osdev

如何在保护模式下执行间接远跳转/调用?首先我认为这样做是允许的:

jmp 0x10:eax;
Run Code Online (Sandbox Code Playgroud)

(不用担心段选择器..我的 GDT 的第二个条目是有效的代码段)

但是当nasm组装的时候,却出现了语法错误。查看Intel(指令集参考)手册的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
Run Code Online (Sandbox Code Playgroud)

它组装成功,但当我尝试运行它时,处理器出现一般保护故障并重新启动。我不知道发生了什么事。

我假设编码是这样的:

(例如我想使用间接跳转跳转到0x10:0x8010)

dw 0x10
dd 0x8010
Run Code Online (Sandbox Code Playgroud)

这可能有什么问题吗?难道48位内存值应该以小端编码吗?并且应该这样编码吗?

;0010 0000 8010
dd 0x10,0x80,0,0,0x10,0
Run Code Online (Sandbox Code Playgroud)

我还没有尝试做最后一项。

Jes*_*ter 5

一个常用的技巧是使用 far ret 来模拟跳跃,例如:

push 0x10
push eax
retf
Run Code Online (Sandbox Code Playgroud)