我正在学习x86程序集,我正在尝试在NASM中制作玩具操作系统,但我不了解一些事情.
我做了一个成功启动内核的bootloader:
kernel.feo;0x2000;jmp 0x2000:0x0000.所以我的内核代码位于0x2000:0内存中.CS可能是因为使用远跳而设置得当.在这个内核代码中,我想进入32位保护模式,但我不确定GDT是如何工作的.当我在虚拟机上运行下面的代码时(QEMU),它不会做任何事情.
我想请你帮我进入32位保护模式!
也就是说,您有以下问题:
- 您认为代码是
0x7c00:0由于加载而导致的org 0,但可能并非如此.唯一保证的是物理地址.您应该使用远程跳转到您的入口点,以便CS正确设置.- 您出于某种原因进行设置
DS,0x2000以便您的代码根本找不到任何数据.您应该设置DS匹配CS,或在CS任何地方使用覆盖(不推荐).- 受保护的模式代码假设从零开始的段,这反过来意味着它预计
org 0x7c00当然与您的设置冲突.你应该切换到org 0x7c00和细分0.- VGA文本模式段
0xb8000不是0xb80000(少一个零).- 您没有
0x55 0xaa在引导扇区末尾的引导签名字节.
我在代码中更正了这些内容:
[org 0x0]被更正为[org 0x2000]并且段被设置为0;DS被纠正为0而不是0x2000,所以现在它匹配CS;0xb8000;但代码不适用于这些更正,它应该打印两个字符串,但它什么都不做! …