【发布时间】:2011-01-27 04:36:59
【问题描述】:
如何在保护模式下执行间接远跳转/调用?首先,我认为这样做是允许的:
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
最后一个我还没试过。
【问题讨论】: