2014-02-21 60 views
0

我正在編寫第二階段啓動加載程序,其部分職責是從16位實模式進入32位保護模式。NASM - 在一個文件中使用幾個BITS指令

我的代碼有一些初始化實模式代碼,一些實模式函數,保護模式代碼和一些保護模式代碼。下面是我做了什麼(實際的代碼是相同的順序):

  • 新增BITS 16第一實模式功能的啓動之前。

  • 新增BITS 32OR荷蘭國際集團eax 1之後的第一個受保護模式功能

  • 添加BITS 16初始化實模式代碼

  • 添加BITS 32初始化受保護模式的代碼(mov cr0, eax之前基本上前前前。

This沒有工作,所以我讀了NASM的手冊,說它沒有必要使用這個指令。我刪除了所有這些代碼,並且代碼正常工作!

那麼我的方法有什麼錯誤?另外,我是不是混淆了bitness和處理器模式?

回答

1

BITS 32會在mov cr0之後去,因爲它仍然以實模式執行。您不應該切換到BITS 32,直到您執行JMP 0x08:ProtectedModeMain指令,

0

需要的位指令,幾乎爲您顯示除了最後一點:在CPU仍然是當時執行的16位代碼,直到你重新加載CS(由遠跳,通常情況下)。

根據所使用的說明,如果幸運的話,代碼的16位部分可能在意外組裝爲32位時工作。

我非常確定,如果NASM手冊提到你不需要這個指令,它是在談論使用相同「位」的代碼,以及在命令行中指定的代碼(或由格式)。

相關問題