处理器与外设的数据通信,一般有三种方式:程序直接I/O 、中断以及DMA 方式。外设一般包含3 种类型的寄存器,他们是数据寄存器、状态寄存器和控制寄存器。数据寄存器是用来传送数据的,状态寄存器用于查询设备状态,而控制器存器用来发送命令控制外设工作。程序直接I/O ,意味着程序中需要直接同这三类寄存器进行交互。程序需要去查询设备的状态,这样不能充分的利用CPU 。而DMA 方式则是DMA 控制器向CPU 发出总线使用的请求,CPU 将总线的控制权交给DMA 控制器,由此,DMA 可以对数据进行整块的传送,在没有CPU 干预的情况下。对于中断方式,是当某种外设准备好后,通过中断控制器将中断请求送CPU ,由CPU 确定是否对中断请求进行响应。中断可分为软中断和硬中断,其中硬中断又叫做外部中断,他又分为可屏蔽和非可屏蔽中断。可屏蔽中断可以利用状态标志位的IF 来开放和关闭这种类型的中断。
下面介绍8259A 中断控制器的一些细节:
8259A 中断控制器又2 种寄存器组成:中断屏蔽寄存器(IMR )和命令寄存器。
中断屏蔽寄存器为一个8 位寄存器,他的I/O 端口是21H ,而命令寄存器的I/O 端口是20H 。
中断屏蔽寄存器每一位代表一种外设:
0 定时器
1 键盘
2 保留
3 串口1
4 串口2
5 硬盘
6 软盘
7 打印机
命令寄存器每一位表示如下:
0 L0
1 L1
2 L2
3 0
4 0
5 EOI
6 SL
7 R
EOI 表示中断结束命令。当中断处理程序完成后,必须显式的向中断控制器发送接触命令,如:
MOV AL ,00100000B
OUT 21H ,AL
中断程序如何工作:
1. 计算出中断向量的地址,中断类型号N ,中断向量地址为:(N*4 ,N*4+2 )
2. 保存状态标志寄存器、代码段寄存器,指令指针寄存器的内容。并将中断响应许可标志位关闭,单步执行标志位关闭。
3. 转入中断处理程序。
4. 恢复状态标志寄存器,代码段寄存器和指令指针寄存器的内容。
一个自定义中断的例子:(响应定时器中断)
DATA_SEG SEGMENT
MSG DB 'TIMEOUT!' , 0DH , 0AH , '$'
DATA_SEG ENDS
SUB_FUNC_CODE SEGMENT
ASSUME CS:SUB_FUNC_CODE , DS:DATA_SEG
ALARM PROC FAR
PUSH DS
PUSH AX
PUSH DX
STI
MOV AX , DATA_SEG
MOV DS , AX
MOV DX , OFFSET MSG
MOV AH , 09H
INT 21H
POP DX
POP AX
POP DS
IN AL , 20H
OR AL , 00100000B
OUT 20H , AL
CLI
IRET
ALARM ENDP
SUB_FUNC_CODE ENDS
MAIN_CODE SEGMENT
ASSUME CS:MAIN_CODE
MAIN PROC FAR
START:
MOV AH , 35H
MOV AL , 1CH
INT 21H
PUSH ES
PUSH BX
MOV BX , SEG ALARM
MOV DS , BX
MOV DX , OFFSET ALARM
MOV AH , 25H
MOV AL , 1CH
INT 21H
IN AL , 21H
AND AL , 11111110B
OUT 21H , AL
STI
MOV CX , 50000
OUTTER:
PUSH CX
MOV CX , 50000
INNER:
LOOP INNER
POP CX
LOOP OUTTER
POP DX
POP DS
MOV AH , 25H
MOV AL , 1CH
INT 21H
MOV AH , 4CH
INT 21H
MAIN ENDP
MAIN_CODE ENDS
END START
下面介绍8259A
8259A
中断屏蔽寄存器为一个8
中断屏蔽寄存器每一位代表一种外设:
0
1
2
3
4
5
6
7
命令寄存器每一位表示如下:
0 L0
1 L1
2 L2
3 0
4 0
5 EOI
6 SL
7 R
EOI
MOV AL
OUT 21H
中断程序如何工作:
1.
2.
3.
4.
一个自定义中断的例子:(响应定时器中断)
DATA_SEG SEGMENT
MSG DB 'TIMEOUT!' , 0DH , 0AH , '$'
DATA_SEG ENDS
SUB_FUNC_CODE SEGMENT
ASSUME CS:SUB_FUNC_CODE , DS:DATA_SEG
ALARM PROC FAR
PUSH DS
PUSH AX
PUSH DX
STI
MOV AX , DATA_SEG
MOV DS , AX
MOV DX , OFFSET MSG
MOV AH , 09H
INT 21H
POP DX
POP AX
POP DS
IN AL , 20H
OR AL , 00100000B
OUT 20H , AL
CLI
IRET
ALARM ENDP
SUB_FUNC_CODE ENDS
MAIN_CODE SEGMENT
ASSUME CS:MAIN_CODE
MAIN PROC FAR
START:
MOV AH , 35H
MOV AL , 1CH
INT 21H
PUSH ES
PUSH BX
MOV BX , SEG ALARM
MOV DS , BX
MOV DX , OFFSET ALARM
MOV AH , 25H
MOV AL , 1CH
INT 21H
IN AL , 21H
AND AL , 11111110B
OUT 21H , AL
STI
MOV CX , 50000
OUTTER:
PUSH CX
MOV CX , 50000
INNER:
LOOP INNER
POP CX
LOOP OUTTER
POP DX
POP DS
MOV AH , 25H
MOV AL , 1CH
INT 21H
MOV AH , 4CH
INT 21H
MAIN ENDP
MAIN_CODE ENDS
END START
![](https://i-blog.csdnimg.cn/blog_migrate/2f60c0bc47d4178ac5e2b807936153ff.gif)