对于王爽的汇编语言的第15章,处理键盘的输入。
编写一个程序,实现在屏幕中间an依次显示a~z,可以让人看清变化的过程,在显示的过程中,按下esc键后, 改变显示的颜色。
assume cs:code
stack segment
db 128 dup(0)
stack ends
data segment
dw 0, 0
data ends
code segment
start: mov ax, stack
mov ss, ax
mov sp, 128
mov ax, data
mov ds, ax
mov ax, 0
mov es, ax
push es:[9*4+0]
pop ds:[0]
push es:[9*4+2]
pop ds:[2]
cli
mov word ptr es:[9*4+0], offset int9
mov es:[9*4+2], cs
sti
mov ax, 0b800h
mov es, ax
mov ah, 'a'
s: mov es:[12*160+2*40], ah
call delay
inc ah
cmp ah, 'z'
jna s
mov ax, 0
mov es, ax
push ds:[0]
pop es:[9*4+0]
push ds:[2]
pop es:[9*4+2]
mov ax, 4c00h
int 21h
delay: push ax
push dx
mov dx, 10h
mov ax, 0
s1: sub ax, 1
sbb dx, 0
cmp ax, 0
jne s1
cmp dx, 0
jne s1
pop dx
pop ax
ret
int9: push ax
push es
in al, 60h
prshf ;这里可以不要吗?
call word ptr ds:[0] ;这里可以不要吗?
cmp al, 1
jne break
mov ax, 0b800h
mov es, ax
inc byte ptr es:[160*12+40*2+1]
break: pop es
pop ax
iret
code ends
end start
我有个问题就是我问的那里是干嘛的 ,直接从60端口接受扫描码,然后对比不就可以了吗?为什么还要调用bios的中断呢?
------解决思路----------------------
prshf
call word ptr ds:[0]
首先 prshf 应该是pushf
dos的中断,并不一定是简单的独立程序,它可以是一条长长的程序串
比如原始的中断A,被程序B修改了
程序串:程序B->中断A
又有程序C修改中断
程序串变成:程序C->程序B->中断A
每一个修改中断者的原则是,尽量保持这条中断程序串,
保证每一个程序串中的程式都会被执行到
若不执行
pushf
call word ptr ds:[0]
中断就会被你完全独占了,若是int8以下等等系统中断,不难马上挂掉!
------解决思路----------------------
INT9不仅仅是从端口读键
in al, 60h
它还要做一系列重置,允许其他中断的动作,以保证系统正常
若你真的要独占中断,起码要代做一些 INT9必要做的工作
加入这段代码!
in al,060h
; -- ADD THIS --------
push ax
or al,080h
out 061h,al
and al,07fh
out 061h,al
mov al,020h
out 020h,al
pop ax
; pushf
; call dword ptr ds:[0]
;----------END -----------
cmp al, 1
...
...