gpt4 book ai didi

assembly - "call"切换到保护模式后

转载 作者:行者123 更新时间:2023-12-04 18:48:58 25 4
gpt4 key购买 nike

我正在尝试在 intel x86 中切换到保护模式。

我已经用 lgdt 加载了我的 gdt,将 cr0 的 P 标志设置为 1 和所有段选择器,但是当我从函数调用返回时,我无法调用任何其他函数或出现此错误

qemu: fatal: Trying to execute code outside RAM or ROM at 0xfeeb7c5b

这是我的 switch_to_pmode 函数:
gdtr:
.short 23 // limit
gdtr_base:
.long 0 // base

switch_to_pmode:
movl $null_segment, %eax // Address of the first byte of the GDT
movl %eax, gdtr_base

cli // disable interrupts

lgdt (gdtr)

movl %cr0, %eax
or $0x1, %eax
movl %eax, %cr0 // Set the PE flag

push $0x8
push $reload_segments
lret

reload_segments:
movl $0x10, %eax
movl %eax, %ds
movl %eax, %ss
movl %eax, %es
movl %eax, %fs
movl %eax, %gs

ret

foo:
ret

还有我的电话
_start:
call switch_to_pmode
call foo // <----- Ouch!

谢谢

最佳答案

您需要确保汇编器将保护模式开关后面的代码转换为 32 位代码,并带有 .code32 (或 nasm 中的 use32)指令。

此外,您在保护模式例程之后的返回地址不再有效。在那之后你真的无法回到任何事情上。而是将 esp 设置为有用的东西并继续。

关于assembly - "call"切换到保护模式后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9164099/

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