博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
获取编译学习笔记 (十三)—— 外部中断
阅读量:6201 次
发布时间:2019-06-21

本文共 2265 字,大约阅读时间需要 7 分钟。

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

參考: 《汇编语言》 王爽 第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机键盘的处理过程

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

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

    int 9 中断例程主要工作:

(1)读出60hport的扫描吗

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

(3)对键盘系统进行相关的控制。

比方,相相关芯片发出应答信息。

3. 改动int 9 中断

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

实现代码:

assume cs:codecode segmentstart:	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,0s1:	sub ax,1	sbb dx,0	cmp ax,0	jne s1	cmp dx,0	jne s1	pop dx	pop ax	ret	code endsend start

再实现按下ESC键后。改变显示字符的颜色

assume cs:codestack segment	db 128 dup(0)stack endsdata segment	dw 0,0data endscode segmentstart:	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,0s1:	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 endsend start

版权声明:本文博客原创文章。博客,未经同意,不得转载。

你可能感兴趣的文章
C#学习常用类--DataRow类
查看>>
lua中关于table的处理
查看>>
Objective-C 入门(三)内存管理
查看>>
MongoDB文档更新(二)
查看>>
docker删除镜像
查看>>
Sharepoint Server 2010安装部署
查看>>
Tomcat 源码分析(-)启动过程分析
查看>>
ndk中使用native Socket及jni异常处理
查看>>
bash的算术运算和条件测试语句
查看>>
MySQL -- INSERT 中ON DUPLICATE KEY UPDATE的使用
查看>>
HTTP缓存控制
查看>>
mysql 函数之 字符串函数
查看>>
陈松松:选择适合视频营销暴利产品的4大标准
查看>>
2017年最值得关注的设计趋势
查看>>
Netscaler 10.5 VPX与XenApp XenDesktop 集成配置系列之二申请域根证书颁发机构签发的服务器证书...
查看>>
使用Fuel部署openstack私有云
查看>>
CentOS安装一
查看>>
Day1_HTML_图像标记
查看>>
关于touch的一些小记录
查看>>
构建vsftpd文件传输服务器
查看>>