gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:03:03 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com