文档介绍:第八章输入输出程序设计
CPU
MEM
I/O设备
总线
I/O接口
1
查询方式
(程序控制方式)
中断方式
DMA方式
(直接存储器存取方式/成组传送方式)
1. I/O 设备的数据传送方式
2
I/O 指令是主机与外设进行通信的最基本途径。DOS 功能调用和BIOS例行程序中的输入/输出功能也是由IN和OUT指令完成的。
例:循环测试某状态寄存器的第2位是否为1
AGAIN: IN AL, STATUS_PORT
TEST AL, 00000100B
JZ AGAIN
2. 程序直接控制 I/O 方式
读I/O状态
准备好?
传送数据
N
Y
IN AL,DATA_PORT
3
I/O 指令是主机与外设进行通信的最基本途径。DOS 功能调用和BIOS例行程序中的输入/输出功能也是由IN和OUT指令完成的。
例:循环测试某状态寄存器的第2位是否为1
AGAIN: IN AL, STATUS_PORT
TEST AL, 00000100B
JZ AGAIN
2. 程序直接控制 I/O 方式
读I/O状态
准备好?
传送数据
N
Y
MOV AL, DATA
OUT DATA_PORT, AL
4
轮流查询几种I/O设备:
DEV1: IN AL, STAT1
TEST AL, STAT1_BIT
JZ DEV2
CALL FAR PTR PROC1
DEV2: IN AL, STAT2
TEST AL, STAT2_BIT
JZ DEV3
CALL FAR PTR PROC2
DEV3: IN AL, STAT3
TEST AL, STAT3_BIT
JZ DEV1
CALL FAR PTR PROC3
优:程序安排或修改设备的优先次序
缺:查询等待浪费CPU大量有效时间
5
设备控制寄存器( 61h )
1/0 0
控制其它外部设备
与门
放大器
2号定时器门控
1 0
例:Sound 程序1
……
mov dx, 100
in al, 61h
and al, 11111100b
sound: xor al, 2
out 61h, al
mov cx, 140h
wait1: loop wait1
dec dx
jne sound
……
6
.model tiny
.code
.startup
call speaker_on
mov ah, 1
int 21h
call speaker_off
.exit 0
speaker_on proc
push ax
in al, 61h
or al, 3 
out 61h, al
pop ax
ret
speaker_on endp
 
speaker_off proc
push ax
in al, 61h
and al, 0fch
out 61h, al
pop ax
ret
speaker_off endp
end
例:Sound 程序2
7
print proc near
push ax
push dx
mov dx, 378h ; 数据寄存器
out dx, al
mov dx, 379h ; 状态寄存器
again: in al, dx
test al, 80h ; (dx)7 = busy
je again ; =0,打印机忙
mov dx, 37ah ; 控制寄存器
mov al, 0dh
out dx, al ; 送选通信号
jmp $+2 ; 展宽选通信号
mov al, 0ch
out dx, al
pop dx
pop ax
ret
print endp
例:打印机查询输出子程序
0 0 0 0 1 1 0 1
选通位
自动换行
初始化
选择位
中断位
37AH
8
中断源:引起中断的事件
外中断(硬中断):
外设的 I/O 请求——可屏蔽中断
电源掉电/ 奇偶错——非屏蔽中断
内中断(软中断):
INT 指令/ CPU 错(除法错、溢出)/
为调试程序设置的中断
3. 中断传送方式
9
非屏蔽中断请求
中断逻辑
INT n
INTO
除法错
单步
n 4 0 1
CPU
2 NMI
8259A
可编程中断控制器
(PIC)
IR0 系统定时器
IR1 键盘
IR2 彩色/图形接口
IR3 保留
IR4 串行通讯口
IR5 保留
IR6 软盘
IR7 打印机
INTR
08
09
0A
0B
0C
0D
0E
0F
80x86 中断源:
10