更改09h中断向量号

来源:百度知道 编辑:UC知道 时间:2024/06/13 12:56:05
目的:在死循环中只要按一次键盘 就显示 'B' 字符 先不管能不能推出程序
问题:为什么 狂按键盘 就只显示 一次 'B'字符
是不是 逻辑上哪里出错了??
assume cs:code
stack segment
dw 10 dup (0)
stack ends

process segment
show proc far ;中断程序
mov ah,02h
mov dl,'B'
int 21h
iret
show endp
process ends

code segment
start:
mov ax,stack
mov ss,ax
mov sp,20
mov ax,seg show
mov ds,ax
mov dx,offset show
mov al,09h
mov ah,25h
int 21h
l:
;死循环
jmp l
mov ah,4ch
int 21h
code ends
end start
自己找到解决的办法了 在show过程iret返回前 加上 mov al,20h out 20h,al 就可以了
不过问题又来了 20h端口作用是什么 而且 为什么按一次键盘就显示 2个 'B'字符呢??
要是按键盘上的 上下左右键 就显示 8 个 'B'字符 怎么回事??希望高手来 回答回答
有那些有关的 电子书 介绍介绍

9号中断是硬件中断,由8259向CPU产生中断申请而引起,故中断推出之前,要“通知”8259:本次中断服务已完成,否则8259会一直认为仍然在进行9号键盘中断,因此也就不会再响应任何优先级不大于它的中断(包括以后的按键中断)。
你说的那2条指令,就是起到“通知”8259的作用的,20H端口就是系统为8259分配的访问端口(一共2个端口:20H,21H)
第2个问题:要知道,每一次按键键盘都会产生2次中断(按下的时候1次,放开的时候又一次),你的9号中断处理要加以区分。至于那些编辑按键,产生的“键码”是2字节的,于是又会加倍。
细节很复杂,几句话很难说清楚了。

中段处理程序中调用Dos软中断INT21 会引起重入问题。中段处理程序中,只能把输入字符放在缓冲区,主程序去取出来显示。

不是高手回答不了这个问题。我17年前刚好遇到过类似的。