6

きれいなグラフィックスの下でシステムが実際にどのように機能するかについて、もっと学ぼうとしています。そのため、現在、BIOS が起動時にロードする 512 バイトのメモリで遊んでいます。現時点では、それをブートローダーと呼ぶことはできません。とにかく、割り込みベクターを交換していますが、問題があります。割り込み 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
4

4 に答える 4

6

キーボード割り込みの処理に取り組んでから長い時間が経ちましたが、実際に欠けているのはキーボードハードウェアの処理であり、割り込み条件をクリアして別の割り込みを生成する準備ができていると思います.

何かのようなもの:

         in     al, 60h     ; Read input buffer 

必要なすべてかもしれません。

機会があれば、私がキーボード ドライバーを書いたときの古いメモやコードが残っていないか確認してみます。

于 2009-05-09T00:39:12.377 に答える
1

別の問題が見つかりました。2 つの別々の移動命令を使用して ISR に新しい割り込みベクトルを設定すると、この両方の移動命令の間で割り込みが発生し、古い位置の一部と壊れたベクトルからアドレスを取得する可能性があります。 ISR の新しい場所の他の部分。しかし、この場所には ISR も、割り込みの END の命令も、iret 命令もありません。

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

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

ダーク

于 2014-02-24T11:01:10.300 に答える
1

私の推測では (キーボード割り込みハンドラを書いたことはありません)、キーストロークを取得するためにキーボード ハードウェアとも通信する必要があります (そうしないと、キーボードは次の割り込みを生成するタイミングを認識できません)。

于 2009-05-09T00:44:29.260 に答える
0

これは単なる推測ですが、おそらく問題は int 9h ハンドラから int 10h を呼び出していることです。画面メモリに直接書き込んでみてください (0b800h:0 のバイトをインクリメントし、画面の左上の文字を確認してください)。キーを押すたびにインクリメントされる場合は、int 9h から int 10h を呼び出すべきではありません。

于 2009-05-09T00:37:54.393 に答える