pri*_*ner 4 x86 assembly osdev
如何在保护模式下执行间接远跳转/调用?首先我认为这样做是允许的:
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位内存值应该以小端编码吗?并且应该这样编码吗?
;0010 0000 8010
dd 0x10,0x80,0,0,0x10,0
我还没有尝试做最后一项。