2009-05-09 3 views
6

私はシステムが本当に上のすべてのかわいいグラフィックの下でどのように動作するかについてもっと学びたいと思っています。だから私は現在、起動時にBIOSがロードする512バイトのメモリを使用しています。私が推測するように、実際にブートローダと呼ぶことはできません。とにかく、私は割り込みベクトルを置き換えているが、それに問題がある。 interupt 09h(キーボード)を交換すると、正しく機能し、キーを押すと「Memory messing」が出力されます。しかし、それから何も。その後、キーを押すたびに何もしません。私は私のハンドラから何かが欠けていた場合、システムがクラッシュしたりした場合、私は知らないが、ここではコードです:リアルモード、割り込みベクタの置き換えクラッシュ

jmp start 
times 100 db 0 ; Cleared space for stack 

start: 
xor ax, ax 
mov ax, start 
sub ax, 80 
mov sp, ax 

mov al, 0x09 ; Interupt number 
mov bl, 4 
mul bl 
mov bx, ax 
xor ax, ax 
mov es, ax 
mov [es:bx], word prints ; My interupt handler 
add bx, 2 
mov [es:bx], word 0x00 

bloader: 
    jmp bloader 

prints: 
    cli 
    push ax 
    push bx 
    push si 
    mov si, msg  ; Message to print 
    mov bl, 0x07 
    mov bh, 0x00 
    printnb: 
     lodsb  ; Grab byte from message 
     cmp al, 0 ; End of message 
     je printf 
     mov ah, 0x0E 
     int 0x10 ; Print byte 
     jmp printnb 
    printf: 
     mov al, 0x20 
     out 0x20, al ; Inform interupt controller interupt has been handled 
     pop si 
     pop bx 
     pop ax 
     sti 
     iret ; Interupt return 

msg db "Memory messing",0 

times 510 - ($ - $$) db 0 
dw 0xAA55 

答えて

6

私はキーボードの割り込みに取り組んで以来、長いことをしていますが、実際にはキーボードのハードウェアを処理しているため、割り込み条件をクリアして別の割り込みを生成する準備ができていないと思います。以下のような

何か:

  in  al, 60h  ; Read input buffer 

は、それが取るすべてであるかもしれません。

もし私がチャンスを得るなら、キーボードドライバを書いたときに古いメモやコードが途中に横たわっているのを見るでしょう。

+0

これは、それを修正しました。負荷ありがとう。 – Dave

0

これが唯一の野生の推測ですが、おそらく問題は、あなたがint 10hを呼んでいるということですint 9hハンドラから取得します。スクリーンメモリに直接書き込みを試みてください(0b800h:0でバイトをインクリメントし、画面の左上の文字をチェックしてください)。それぞれのキー操作でインクリメントされる場合、int 9hからint 10hを呼び出すべきではありません。

1

私はキーボードの割り込みハンドラを書いたことがありませんでした。キーボードのハードウェアと話してキーストロークを取得する必要があるということです。そうしないとキーボードは次の割り込みを生成するタイミングを知らないでしょう。

1

別の問題が見つかりました。 2つの別々の移動命令を使用してISRの新しい割り込みベクタを設定すると、この両方のMO命令の間に割り込みが発生し、次に、壊れたベクタから古い位置の一部とISRの新しい場所の他の部分。しかし、この場所にはISRはなく、割り込みの終了とiret命令の指示はありません。

このような悪いイベントを防止するために、新しい割り込みベクタを設定するための移動命令のまわりにcliとstiを配置する必要があります。

cli 
mov [es:bx], word prints ; My interupt handler 
mov [es:bx+2], word 0x00 
sti 

ディルク

関連する問題