我正在编写第二阶段引导加载程序,其部分职责将是从16位实际模式进入32位保护模式。
我的代码有一些初始化实模式代码,一些实模式函数,保护模式代码和一些保护模式代码。下面是我所做的工作(实际代码的顺序相同):
BITS 16。BITS 32BITS 16BITS 32 (基本上是在mov cr0, eax之后用1对eax进行OR之后)。这是行不通的,所以我阅读了NASM的手册,它说它没有必要使用这个指令。我把它们都删除了,代码也起作用了!
那么我的做法有什么错误呢?另外,我是不是把bitness和处理器模式搞混了?
发布于 2014-02-28 05:04:37
BITS 32将跟踪mov cr0,因为这仍然是在实际模式下执行的。在执行BITS 32指令之前,不应该切换到JMP 0x08:ProtectedModeMain,
发布于 2014-02-21 19:05:54
您的do需要位指令,除了最后一点外,您几乎显示了这一点:那时cpu仍在执行16位代码,直到重新加载CS (通常是远跳)。
如果幸运的话,如果您幸运的话,代码的16位部分可能会意外地作为32位进行组装,这取决于所使用的说明。
我非常肯定,如果NASM手册提到您不需要这个指令,那么它是指在整个过程中使用相同"bitness“的代码,以及在命令行上指定的代码(或由格式选择的代码)。
https://stackoverflow.com/questions/21942784
复制相似问题