在保护模式下如何执行间接远跳转/调用?我最初认为可以这样做:
它已经成功编译,但是当我尝试运行时,处理器出现了通用保护故障并重新启动。我不知道发生了什么。
我假定编码是这样的:
(例如,我想使用间接跳转跳转到0x10:0x8010)
这个有什么问题吗? 是不是48位的内存值应该按照小端编码? 那么它应该像这样编码吗?
jmp 0x10:eax;
不用担心段选择器,我的GDT的第二项是一个有效的代码段。
但是当nasm将其汇编时,会出现语法错误。查看英特尔手册(指令集参考)的书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
我还没有尝试过做最后一个。