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

标签 assembly x86 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位内存值应该用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/

相关文章:

assembly - STP 中的寄存器存储顺序

assembly - 在程序集问题中将大写字母转换为小写字母

graphics - 如何直接写到屏幕上?

c - GCC - 标签地址返回当前 EIP 而不是真实标签地址

assembly - 设置IRQ映射

x86 - 像 PTLsim 这样的 CAS 模拟器如何实现 x86 硬件的周期精确模拟?

c - Eclipse 不做任何超链接或至少突出显示某些 *.h 文件和 *.S 的语法

assembly - AOSP 非显而易见的 syscall() 实现

performance - ADD 1 真的比 INC 快吗? x86

c - 尝试移动到在汇编上面的 C 代码中定义的变量时出现 undefined symbol 错误