質問
Kolibri Bootloaderを使用してSimple Kernelを実行しようとしました。 1000:0000にロードされています。私は理解していません、この部分で何が悪いのか:
...
; switch to PM
mov eax, cr0
or al, 1
mov cr0, eax
use32
PROTECTED_ENTRY:
mov ax, 00010000b ; DATA
mov ds, ax
mov ss, ax
mov esp, 0xFFFF
jmp $
mov ax, 00011000b ; VIDEO
mov es, ax
mov edi, 0
mov esi, string
int 1
jmp $
デバッガーでは、このように見えます
何が起きてる?なぜESとDSが変更されていないのですか?
PS私はこのカーネルをコリブリローダーで動作させようとしています:http://wasm.ru/article.php?article=ia32int
解決
プロセッサは、保護されたビットをに設定したときに自動的に保護されたモードに入りません cr0
. 。保護されたモードに入ります cs
その後変更されます。これを行う最も簡単な方法は、書く直後に遠いジャンプを挿入することです cr0
.
mov cr0, eax
.db 066h
jmp CODE_SEGMENT:PROTECTED_ENTRY
use32
PROTECTED_ENTRY:
うまくいけば、私はそれを正しくしました。 (私はAT&Tの構文に慣れています。) .db
32ビットアドレスを許可するオペランドサイズオーバーライドです。
他のヒント
Teeデバッガーは32ビットコードを分解します(アセンブラーに32ビットコードを生成するように指示しました use32
16ビットコードとしての擬似op)。だから指示 mov ax, 10h
と解釈されます mov eax, d88e0010h
, 、 どこ d88e
一部は実際には次の命令のオペコードです。 mov ds,ax
.
の場合 mov esp, 0xffff
, 、これはと解釈されます mov sp, 0xffff
そして、2つの追加のゼロバイトが偽物として表示されます add byte ptr...
命令。
プロセッサが実際に実行するものは、現在の状態に依存します。保護モード、リアルモード、フラットモードなどです。ステータスレジスタを調べて確認してください。おそらく、デバッガーにコードを異なる解釈するように指示することができます。