質問

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 $

デバッガーでは、このように見えますenter image description here

何が起きてる?なぜ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... 命令。

プロセッサが実際に実行するものは、現在の状態に依存します。保護モード、リアルモード、フラットモードなどです。ステータスレジスタを調べて確認してください。おそらく、デバッガーにコードを異なる解釈するように指示することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top