2

kolibriブートローダーを使用して単純なカーネルを実行しようとしました。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私はこのカーネルをkolibriローダーで動作させようとしています: http ://wasm.ru/article.php?article = ia32int

4

2 に答える 2

3

で保護ビットを設定しても、プロセッサは自動的に保護モードになりませんcr0。その後変更するとプロテクトモードになりますcs。これを行う最も簡単な方法は、に書き込んだ直後にファージャンプを挿入することcr0です。

mov cr0, eax
.db 066h
jmp CODE_SEGMENT:PROTECTED_ENTRY

use32
PROTECTED_ENTRY:

うまくいけば、私はそれを正しく理解しました。(私はAT&T構文に慣れています。)これ.dbは、32ビットアドレスを許可するためのオペランドサイズのオーバーライドです。

于 2012-01-16T19:03:27.830 に答える
2

Teeデバッガーは、32ビットコード(use32疑似操作で32ビットコードを生成するようにアセンブラーに指示した)を16ビットコードとして逆アセンブルします。したがって、命令mov ax, 10hはと解釈されますmov eax, d88e0010h。ここで、そのd88e部分は実際には次の命令のオペコードですmov ds,ax

と同様にmov esp, 0xffff解釈されmov sp, 0xffff、2つの追加のゼロバイトがスプリアスadd byte ptr...命令として表示されます。

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

于 2012-01-16T18:17:17.043 に答える