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

Assembly NASM-在一个文件中使用多个BITS指令,assembly,operating-system,nasm,instructions,Assembly,Operating System,Nasm,Instructions,我正在编写第二阶段引导加载程序,其部分职责是从16位实模式进入32位保护模式 我的代码有一些初始化实模式代码、一些实模式函数、保护模式代码和一些保护模式代码。下面是我所做的(实际代码的顺序相同): 在启动第一个实模式功能之前添加了位16 在第一个保护模式功能之前添加了位32 在初始化实模式代码之前添加了位16 在初始化保护模式代码之前添加了位32(基本上是在mov cr0之前,eax之后或ingeax后加1) 这不起作用,所以我读了NASM的手册,上面说没有必要使用这个指令。我删除了所有的指

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

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

  • 在启动第一个实模式功能之前添加了
    位16

  • 在第一个保护模式功能之前添加了
    位32

  • 在初始化实模式代码之前添加了
    位16

  • 在初始化保护模式代码之前添加了
    位32
    (基本上是在
    mov cr0之前,eax
    之后
    ing
    eax
    后加1)

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


那么,我的方法中的错误是什么呢?还有,我是不是在某种程度上混淆了位和处理器模式?

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

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


我敢肯定,如果NASM手册提到您不需要这个指令,它所说的代码在整个过程中使用相同的“位”,并且是在命令行上指定的(或通过格式选择的)代码.

位32
将在
mov cr0
之后,因为它仍然在实模式下执行。在执行
JMP 0x08:ProtectedModeMain
指令之前,不应切换到
位32