汇编语言中的外中断和内中断差不多
1、取中断类型码n
2、标致寄存器入栈,IF=0,TF=0
2、CS、IP入栈
3、(IP)=(n*4),(CS)=(n*4+2)
但是外中断和内中断的中断类型码的来源不同,所以第一步肯定是不一样的,其他相同
下面来讲一下键盘事件下的处理方式
只要有键盘事件发生,就会触发int 9,这个int 9是硬件扫描过程,其实就是CPU对按键的IO口进行扫描的过程
这里问题就出现了,因为键盘事件发生必定会引发int 9,所以如果要对按按键后进行处理的话,需要将中断程序写在int 9中,但是如果需要扫描键盘的按键,就必须要调用BIOS提供的int 9
解决这种冲突的办法就是先将BIOS提供的int 9的IP和CS储存起来,用模拟int指令的方式来调用原来的int 9,当然新建的int 9需要将其入口的IP和CS放到向量表中
任务:显示a~z,按下ESC结束
代码:
assume cs:code
data segment ;储存原int9的IP和CS
dw 0, 0
data ends
code segment
start:
mov ax, 0 ;将原int9的IP和CS放到data空间中
mov ds, ax
mov ax, data
mov es, ax
push ds:[9*4]
pop es:[0]
push ds:[9*4 + 2]
pop es:[2]
mov ax, 0 ;将新的int9中断的IP,CS写入中断向量表中
mov ds, ax
mov word ptr ds:[9*4], offset do9h
mov word ptr ds:[9*4 + 2], cs
mov ax, 0B800H
mov ds, ax
mov al, 'a'
mov cl, 2
s: mov ds:[10*160 + 8*2], al
mov byte ptr ds:[10*160 + 8*2 + 1], cl
call delay