[尝试更新ds寄存器时系统崩溃

问题描述 投票:-3回答:2

我正在编写一个简单的引导加载程序,在该引导加载程序中,我从磁盘读取下一个扇区,加载gdt,切换到32位模式并打印一个字母以指示成功。一切都可以在仿真器(qemu)上正常运行,但是进入32位模式后,物理系统立即重新启动,同时尝试更新'ds'寄存器。如果我尝试更新其他段寄存器,它也会在模拟器上崩溃。

导致崩溃的代码

mov ax, 0x10
mov ds, ax

如果我注释掉这段代码,则引导程序可以正常运行。gdt:

null:
dd 0x0
dd 0x0
code:
dw 0xffff
dw 0x0
db 0x0
db 10011010b
db 01000111b
db 0x0

data0:
dw 0xffff
dw 0x0
db 0x0
db 10010010b
db 01000111b
db 0x0
assembly x86-16 bootloader gdt
2个回答
0
投票

找到了。它是gdt的数据部分。特别是极限(15-19),我不知道为什么,所以总是欢迎提供解释。


0
投票

是的!这是因为我的数据段仅扩展到7FFFF,但是我试图打印ie;写地址到B8000,就是这样!该打印代码位于C的“内核”内部,所以我不知道会是这种情况,特别是如果我不设置它就可以工作。谢谢大家的指导。

© www.soinside.com 2019 - 2024. All rights reserved.