当前位置: 代码迷 >> 汇编语言 >> 新手有个有关问题
  详细解决方案

新手有个有关问题

热度:140   发布时间:2016-05-02 04:27:27.0
新手有个问题
对于王爽的汇编语言的第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
...
...

  相关解决方案