NASM - 在一个文件中使用多个BITS指令

时间:2014-02-21 18:50:35

标签: assembly operating-system nasm instructions

我正在编写第二阶段引导加载程序,其职责之一是从16位实模式进入32位保护模式。

我的代码有一些初始化实模式代码,一些实模式函数,保护模式代码和一些保护模式代码。这就是我所做的(实际代码的顺序相同):

  • 在第一个实模式功能开始之前添加了BITS 16

  • 在第一个保护模式功能

  • 之前添加了BITS 32
  • 在初始化实模式代码

  • 之前添加了BITS 16
  • 在初始化保护模式代码之前添加BITS 32(基本上mov cr0, eax OR eax之后{1}}。

这不起作用,所以我读了NASM的手册,说没有必要使用这个指令。我删除了所有这些并且代码工作了!

那我的方法有什么错误?另外,我在某种程度上混淆了位和处理器模式吗?

2 个答案:

答案 0 :(得分:1)

BITS 32将追溯mov cr0,因为它仍然以实模式执行。在执行BITS 32指令

之前,不应切换到JMP 0x08:ProtectedModeMain

答案 1 :(得分:0)

需要位指令,就像你展示的那样,除了最后一点:cpu当时仍在执行16位代码,直到你重新加载CS(通过通常是跳远的。)

如果幸运的话,代码的16位部分可能会在组装为32位时意外工作,具体取决于所使用的说明。

我很确定NASM手册是否提到你不需要这个指令,它是在谈论整个使用相同“位数”的代码,以及在命令行中指定的代码(或由格式选择的代码)。