首页 > 代码库 > 汇编入门学习笔记 (十三)—— 外中断

汇编入门学习笔记 (十三)—— 外中断

疯狂的暑假学习之  汇编入门学习笔记 (十三)——  外中断


参考: 《汇编语言》 王爽 第15章


1.外中断信息


外中断分为可屏蔽中断和不可屏蔽中断


可屏蔽中断

先看看内中断所引发的中断过程:

(1)取中断类型吗n。

(2)标志寄存器入栈,设置IF=0,TF=0.

(3)CS、IP入栈

(4)(IP)=(n*4),(CS)=(n*4+2)


可屏蔽中断的中断过程于内中断所引发的中断过程不同的地方只是,第一步不同。可屏蔽中断的中断过程,CPU要先看IF的值,如果IF=0就不执行中断,如果IF=1执行中断。


不可屏蔽中断

不可屏蔽中断是CPU必须相应的中断。不可屏蔽中断很少,所以中断类型吗固定为2,中断过程不需要取中断类型吗

不可屏蔽中断的中断过程:

(1)标志寄存器入栈,设置IF=0,TF=0.

(2)CS、IP入栈

(3)(IP)=(8),(CS)=(0AH)


2. PC机键盘的处理过程


    当我们按下一个键时,键盘上的芯片产生一个扫描码,扫描吗说明了按下键盘的键在键盘的位置。扫描吗被送入主板上的相关接口芯片的寄存器中,该寄存器的端口是60h。一般按下一个键的扫描吗叫通吗,松开一个键的扫描吗叫断码,通吗第7位0,断码第7位1,即 断码=通吗 + 80h

    键盘的扫描吗到达60h是,相关芯片就会向CPU发出中断类型吗为9的可屏蔽中断信息。

    int 9 中断例程主要工作:

(1)读出60h端口的扫描吗

(2)如果是字符键的扫描吗,就将该扫描吗和它所对应的字符吗(ASCII吗)送入内存中的BIOS键盘缓冲区;如果是控制键(如Ctrl)和切换键(如CapsLock)的扫描吗,则将其转变为状态字节(用二进制位记录控制键和切换键状态的字节)写入内存中存储的状态字节单元

(3)对键盘系统进行相关的控制。比如,相相关芯片发出应答信息。


3. 修改int 9 中断


先实现,在屏幕中间间隔显示‘a’ ~ ‘z‘ 字符,要实现间隔显示,就要有延时,用循环非常多的次数来延时。

实现代码:

assume cs:code

code segment

start:
	mov ax,0b800h
	mov es,ax
	mov al,'a'
s:	
	mov es:[160*12+40*2],al
	call delay  ;循环10000000次,用来延时
	inc al
	cmp al,'z'
	jna s
	
	mov ax,4c00h
	int 21h;
	
delay:
	push ax
	push dx
	mov dx,1000h   ;外层循环1000h次,内层循环100000h次
	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
	

code ends

end start


再实现按下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]
	pop ds:[0]        ;将原来的int 9 中断例程的入口保存到 ds:0、ds:2中
	push es:[9*4+2]
	pop ds:[2]  
	
	mov word ptr es:[9*4],offset int9   ;在中断向量表中设置新的int 9*4中断例程的入口地址
	mov es:[9*4+2],cs
	
	
	mov ax,0b800h
	mov es,ax
	mov al,'a'
s:	
	mov es:[160*12+40*2],al
	call delay  ;循环10000000次,用来延时
	inc al
	cmp al,'z'
	jna s
	
	mov ax,0
	mov es,ax
	push ds:[0]
	pop es:[9*4]
	push ds:[2]
	pop es:[9*4+2]
	
	mov ax,4c00h
	int 21h;
	
delay:
	push ax
	push dx
	mov dx,1000h   ;外层循环1000h次,内层循环100000h次
	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 bx
	push es
	
	in al,60h
	
	pushf       
	pushf
	pop bx
	and bh,11111110b   ;设置IF=0.TF=0
	push bx
	popf
	call dword ptr ds:[0]   ;模拟调用原来的int 9*4中断例程
	
	cmp al,1   ;1就是ESC的键盘扫描码
	jne int9ret
	
	mov ax,0b800h
	mov es,ax
	inc byte ptr es:[160*12+40*2+1]  ;每次按下ESC键加1,来改变颜色属性
	
int9ret:
	pop es
	pop bx
	pop ax
	iret
	
	

code ends

end start






汇编入门学习笔记 (十三)—— 外中断