我无法弄清楚如何为我的矩阵程序实现键盘和鼠标中断,以便在按下键盘上的任何键和/或鼠标移动后终止矩阵程序终止,以及当按下鼠标上的任何按钮时。
这是我的矩阵代码:
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
因此我基本上必须将键盘和鼠标中断代码组合成一个,这样当运行我的程序的任何人都可以通过按键盘上的键,移动鼠标或单击鼠标上的按钮来终止它(左侧)单击,右键单击,然后单击中键。
对于键盘终端部分,我相信我的教授告诉我们,我们只需要将代码粘贴到&#34; Loop2 :; Matrix代码在这里循环Loop2&#34;代码的一部分,但我很确定我只是听错了他。我相信他的意思是说我们必须将我们的代码粘贴到该循环并检查键盘键输入,但我知道它不是我知道如何检查输入的方式(mov啊7h / 1h,int 21h) 所以我对那部分感到困惑。
至于鼠标中断部分,似乎我的教授给了我所需的一切,我只需将我的代码粘贴到&#34 ;;矩阵代码就在这里&#34;我的鼠标中断代码的各个部分。如果这不正确,请告诉我,如果可能的话,向我解释一下,如果可能的话,我需要做些什么才能使鼠标中断工作。
答案 0 :(得分: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)中没有任何意义。
; -------------------
为了使用鼠标中断33h,我们必须先启动像cutemouse驱动程序一样的mousedriver。 http://cutemouse.sourceforge.net/
cutemouse驱动器支持串行COM端口和PS / 2鼠标的协议。 (对于USB,我们需要在主板BIOS中启用USB延迟。这会将USB数据从鼠标重定向到键盘控制器,因此USB鼠标可以像PS2鼠标一样使用。)