如何在保护模式下执行间接远跳/调用?首先,我认为这样做是允许的:
jmp 0x10:eax;
(不要担心段选择器......我的 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
它成功组装,但是当我尝试运行它时,处理器出现一般保护故障并重新启动。我不知道发生了什么。
我假设编码是这样的:
(例如我想使用间接跳转跳转到 0x10:0x8010)
dw 0x10
dd 0x8010
这可能有什么问题?
是不是48位内存值应该用little endian编码?
它应该像这样编码吗?
;0010 0000 8010
dd 0x10,0x80,0,0,0x10,0
我没试过做最后一个。
最佳答案
一个常用的技巧是使用远 ret 模拟跳跃,例如:
push 0x10
push eax
retf
关于assembly - 在保护模式下进行间接远跳/调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4812797/