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

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

参考: 《汇编语言》 王爽 第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
时间: 2024-10-11 10:02:03

汇编入门学习笔记 (十三)—— 外中断的相关文章

汇编入门学习笔记 (十二)—— int指令、port

疯狂的暑假学习之  汇编入门学习笔记 (十二)--  int指令.port 參考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引发一个n号中断. 运行过程相当于: (1)取中断类型吗n. (2)标志寄存器入栈:设置IF=0,TF=0. (3)CS.IP入栈 (4)(IP)=(n*4),(CS)=(n*4+2) 样例1:编写.安装中断7ch.实现求一个word型数据的平方,用ax存放这个数据. assume cs:code code s

汇编入门学习笔记 (十一)—— 内中段

疯狂的暑假学习之  汇编入门学习笔记 (十一)--  内中段 参考: <汇编语言> 王爽 第12章 中断是指CPU在执行完当前指令后收到某种信息(中断信息),就不在接向下执行,而去对接收到的信息进行处理.中断信息可以来自CPU内部和外部,分内中断,外中断. 1. 内中断的产生 下面4中情况会产生内中断: (1)除法错误.如:div除法溢出 (2)单步执行.如debug中的单步调试 (3)执行into指令. (4)执行int指令 2. 处理中断信息 中断信息中包含8位的中断类型吗,用来表示要执行

汇编入门学习笔记 (十二)—— int指令、端口

疯狂的暑假学习之  汇编入门学习笔记 (十二)--  int指令.端口 参考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引发一个n号中断. 执行过程相当于: (1)取中断类型吗n. (2)标志寄存器入栈:设置IF=0,TF=0. (3)CS,IP入栈 (4)(IP)=(n*4),(CS)=(n*4+2) 例子1:编写.安装中断7ch,实现求一个word型数据的平方,用ax存放这个数据. assume cs:code code seg

汇编入门学习笔记 (八)—— 转移指令

疯狂的暑假学习之  汇编入门学习笔记 (八)--  转移指令 參考: <汇编语言> 王爽 第9章 能够改动ip或者同一时候改动cs和ip的指令统称为转移指令. 8086CPU转移行为分为: 段内转移:仅仅改动ip 段间转移:同一时候改动cs和ip 段内转移按ip改动的范围可分为: 短转移:ip改动范围 -128~127 近转移:ip改动范围 -32768~32767 转移指令分为: 无条件转移指令.如 jmp 条件转移指令 循环指令.如 loop 过程. 中断. 1. offset,nop指令

汇编入门学习笔记 (三) —— 第一个程序

疯狂的暑假学习之  汇编入门学习笔记 (三)-- 第一个程序 参考:<汇编语言> 王爽  第四章 1.一个源程序从写到执行的过程 第一步:编写汇编源程序 第二步:对源程序进行编译连接 第三步:在操作系统中执行 2.源程序 代码: assume cs:first first segment start: mov ax,2 add ax,ax add ax,ax mov ax,4C00H int 21H first ends end start 代码解释: assume .segment.ends

汇编入门学习笔记 (六)—— si、di,双重循环

疯狂的暑假学习之  汇编入门学习笔记 (六)-- si.di,双重循环 参考: <汇编语言> 王爽 第7章 1. and和or指令,与[bx+idata] and和or,就不多说了. [bx+idata] 这样写是可以的,某些情况下,比较方便. [bx+idata] 也可以写成 idata[bx] 直接见例子: 把'ABcde' 跟 'fGHig' 都改成大写(ASCII中大写字母与小写字母二进制中,只有第五位不同,大写字母是0,小写字母是1) assume cs:code,ds:data d

汇编入门学习笔记 (十四)—— 直接定址表

疯狂的暑假学习之  汇编入门学习笔记 (十四)-- 直接定址表 参考: <汇编语言> 王爽 第16章 1. 描述单元长度的标号 普通的标号:a,b assume cs:code code segment a:db 1,2,3,4,5,6,7,8 b:dw 0 start: mov si,offset a mov di,offset b mov ah,0 mov cx,8 s: mov al,cs:[si] add cs:[di],ax inc si loop s mov ax,4c00h in

汇编入门学习笔记 (四)—— [BX] 和 loop指令

疯狂的暑假学习之  汇编入门学习笔记 (四)-- [BX]  和 loop指令 参考:<汇编语言> 王爽 第5章 1.[BX] mov al,[1] 在debug中,会把bs:1 中数据赋给al,但在在masm中不会把bs:1 中数据赋给al,而是把 [1] 认为是 1 赋给al. 如果要实现在debug中的mov al,[1],在masm中就需要[bx] 如: mov bx,1 mov al,[bx] 还可以用 bs:[1] 的方式 如: mov al,bs:[1] 2.loop 循环 要使

汇编入门学习笔记 (七)—— dp,div,dup

疯狂的暑假学习之  汇编入门学习笔记 (七)--  dp,div,dup 参考: <汇编语言> 王爽 第8章 1. bx.si.di.和 bp 8086CPU只有4个寄存器可以用 "[...]" 中进行单元寻址. bp:除了默认的段地址是ss,其他与bx一样. 它们所有正确的组合 mov ax,[bx] mov ax,[si] mov ax,[di] mov ax,[dp] mov ax,[bx+si] mov ax,[bx+di] mov ax,[bp+si] mov a