我正在编写第二阶段引导加载程序,其职责之一是从16位实模式进入32位保护模式。
我的代码有一些初始化实模式代码,一些实模式函数,保护模式代码和一些保护模式代码。这就是我所做的(实际代码的顺序相同):
在第一个实模式功能开始之前添加了BITS 16
。
在第一个保护模式功能
BITS 32
在初始化实模式代码
BITS 16
在初始化保护模式代码之前添加BITS 32
(基本上mov cr0, eax
OR
eax
之后{1}}。
这不起作用,所以我读了NASM的手册,说没有必要使用这个指令。我删除了所有这些并且代码工作了!
那我的方法有什么错误?另外,我在某种程度上混淆了位和处理器模式吗?
答案 0 :(得分:1)
BITS 32
将追溯mov cr0
,因为它仍然以实模式执行。在执行BITS 32
指令
JMP 0x08:ProtectedModeMain
答案 1 :(得分:0)
你做需要位指令,就像你展示的那样,除了最后一点:cpu当时仍在执行16位代码,直到你重新加载CS
(通过通常是跳远的。)
如果幸运的话,代码的16位部分可能会在组装为32位时意外工作,具体取决于所使用的说明。
我很确定NASM手册是否提到你不需要这个指令,它是在谈论整个使用相同“位数”的代码,以及在命令行中指定的代码(或由格式选择的代码)。