2012-03-05 5 views
3

私は問題をフックしています。09h私は新しいIsrにポインタを変更しました。ウィンドウでデバッグすると、キーが押されるたびに割り込みが発生します。しかし、VMWareでは、これは1回だけ起動され、それ以降は起動しないようです。私はDOS 6.22でテストしましたが、まったく同じように起こります。Hooking Int 09h割り込み

MyIsr:
pusha
pushf
;tell PIC that interrupt has finished
mov al,0x20
out 0x20,al
popf
popa
iret


私はUSBキーボードを使用する場合、私は、PS/2のように同じコマンドを送信することができます

私のコードは次のようになり?

+2

は、あなたがそれを上書きし、代わりにACKのあなたのISRからそれを呼び出す前に、IVTから、以前のISRポインタを保存しよう:IRQをINGの。 CALLの前にPUSHFを覚えておいてください:古いポインタ(int-callをシミュレートするため) –

+0

私はUSBキーボードを使うとPs/2のような同じコマンドを送ることができますか? –

答えて

1

あなたが書いているコードの完全なビューを投稿していないので、ここにはいくつかの問題があります。あなたが達成しようとしていることを正確に説明してください。

ISRが呼び出され、処理されない場合、何もすることができませんので、留意してください。問題は、割り込みベクタテーブルにISRをインストールする方法に関連している可能性があります。リアルモードでは

  • 、あなたはINT 21hをでそれを行う、保護モードでAH = 25H
  • 、DJGPPの下で、あなたはINT 21Hの機能を使用して、またはC関数を使用してのいずれか(DPMI関数を使用する必要があります。を参照してください。 DPMI documentation
  • メモリが "ページアウト"する可能性があるため、PMで実行しているときにISRのメモリをロックダウンする必要があります(ISRに必要なのは、実行時にはわからないためです)。

ISRは、次のようになります。

newInt9: 

enter 0,0 
push eax 

in al, 60h 
mov [raw_key], al 

mov al, 20h 
out 20h, al 

pop eax 
leave 
iret  

; ENDPROC

+0

さて、私はリアルモードMS-DOS 6.22で動作しています。私はUSBキーボードをレガシーで使用しています。 私の元の機能では、スタックフレームの入力と退室はしません。私はPS/2キーボードでagianをテストします。結果を教えてあげます –

関連する問題