0

マトリックス プログラムにキーボードとマウスの割り込みを実装して、キーボードのいずれかのキーが押されたとき、および/またはマウスが動かされたときに、決して終わらないマトリックス プログラムを終了させる方法を理解するのに苦労しています。マウスのボタンが押されました。

ここに私のマトリックスコードがあります:

    title lab9 (lab9.asm)

.model small
.stack 100h
.data

    seed dw 1234h   
 .code
main proc
mov ax, @data
mov ds, ax



    mov ax, 0B800h
    mov es, ax  

    mov bx, 0
    mov ax, 0 

    Loo1:
        add bx, 120
        call row  
        call busyWait
        mov si, 0
        jmp Loo1
        loop Loo1

    mov ax,4C00h
    int 21h

main endp
row proc    

      push cx 
      mov cx, 10   

      R:  
      call printMsg 
      add bx, 160

      loop R

      pop cx


      ret
row endp



printMsg proc

    call randomCh
    mov ah, [si]
    mov es:[bx], ax
    inc si 

    ret
printMsg endp 

randomCh proc
    mov ax, 343Fh
    mul seed
    xor dx, dx
    add ax, 269h
    mov seed, ax     

    ret
randomCh endp


busyWait proc  
       push cx
       mov cx, 100h
    L1: 


    loop L1 
    pop cx

    ret
busyWait endp      

My_int proc 
mov ax, 4C00h
int 21h
iret
My_int endp

end 

私の教授が私にくれたキーボード割り込みコードは次のとおりです。

mov ax, @data
mov ds, ax
;Install interrupt handler
push ds
mov ax, @code
mov ds, ax
mov ah, 25h
mov al, 9
mov dx, offset My_Int
int 21h
pop ds

Loop2;

;MATRIX CODE GOES HERE

jmp Loop2

;mov ax, 4c00h
;Int 21h
main endp

My_int proc 
mov ax, 4c00h
int 21h
iret
My_Int endp
end main

私の教授も私にくれたマウス割り込みコードは次のとおりです。

.model smal
.stack 100h
.data
oX dw 0
oY dw 0
.code
main proc

    mov ax, @data
    mov ds, ax

    moov ax, 3
    int 33h
    mov oX, CX
    mov oY, DX

L1:

cmp oX ,CX ; (While oX == cx, && oY == dx && button == 0) <-- I believe the "button variable is 
           ; the BX register             
jne exit
cmp oY, DX
jne exit
cmp bx, 0
jne exit

;Matrix code goes here probably with the "Loop2: ;Matrix goes here loop Loop2 section from the
;keyboard interrupt section

mov ax, 3
int 33h
jmp L1

exit:
mov ax, 4C00H
int 21h
main endp
end main

したがって、基本的には、キーボードとマウスの両方の割り込みコードを 1 つに結合する必要があります。これにより、私のプログラムを実行している誰かが、キーボードのキーを押すか、マウスを動かすか、マウスのボタンをクリック (左クリック、右クリック) することでプログラムを終了できるようになります。クリック、および中央ボタン)。

キーボード ターミネーションの部分については、コードの「Loop2: ;Matrix コードはここにループ Loop2 を挿入する」セクションにコードを貼り付けるだけでよいと教授が言ったと思いますが、彼の言葉を聞き間違えただけだと確信しています。彼は、コードをそのループに貼り付けて、キーボードのキー入力をチェックする必要があると言うつもりだったと思いますが、入力(mov ah 7h/1h、int 21h)をチェックする方法を知っている方法ではないことを知っているので、混乱していますその部分で。

マウス割り込み部分に関しては、私の教授が必要なものをすべてくれたようで、コードをマウス割り込みコードの「;マトリックスコードがここに入る」セクションに貼り付けるだけです。これが正しくない場合はお知らせください。可能であれば説明してください。可能であれば、マウス割り込みを機能させるために必要なものを例を挙げて説明してください。

4

1 に答える 1

0

私は少し助けようとしています:

My_int proc 
; mov ax, 4c00h ; This is the functions number for to terminate the program.
; int 21h       ; Both instructions are not needed here and it is a very wrong
                ; place for it, because all of the following instructions can
                ; not be execute after terminating the program.

; It make more sense to push all of the register that we use here to the stack.
push ax

; But before we want to return from the interrupt with iret, we have to send
; an End of Interrupt signal(EOI) to the programmable interupt controller(PIC).
mov al, 20h
out 20h, al

; And here we can pop all the register that we have pushed before.
pop ax

iret
My_Int endp
end main

終了関数: "AH=4Ch int 21h" は、親プログラムが子プログラムの呼び出し元である場合に、メイン プログラムを終了して DOS に戻るか、親プログラムに戻る場合にのみ役立ちます。しかし、割り込みサービス ルーチン (ISR) 内では意味がありません。

; ----------------------------------

mouseinterrupt 33h を使用するには、以前の cutemouse ドライバーのようなマウスドライバーを開始する必要があります。 http://cutemouse.sourceforge.net/

cutemouse ドライブは、シリアル COM ポートと PS/2 マウスのプロトコルをサポートしています。(USB の場合、メインボード BIOS で USB 遅延を有効にする必要があります。これにより、USB データがマウスからキーボード コントローラーにリダイレクトされるため、USB マウスを PS2 マウスと同様に使用できます。)

于 2014-12-03T15:28:33.933 に答える