2012-01-16 11 views
2

私はkolibriブートローダで単純なカーネルを実行しようとしました。 1000:0000にロードされています。私は理解していない は、この部分で間違っているものです:デバッガでX86:GDT、IDT

... 
; 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が変更されていないのですか?

P.S.私はこのカーネルはkolibriローダーで作業を取得しようとしている: http://wasm.ru/article.php?article=ia32int

答えて

3

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

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

use32 
PROTECTED_ENTRY: 

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

2

ティーデバッガは32ビットコードを逆アセンブルし(あなたがuse32擬似OPと32ビット・コードを生成するようにアセンブラに告げた)16ビットのコードとして。したがって、命令mov ax, 10hは、の部分が次の命令のオペコードmov ds,axであるmov eax, d88e0010hと解釈されます。

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

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