第八章 输入 / 输出程序设计

23
第第第 第第 / 第第第第第第 8.1 I/O 第第第第第 第第第 I/O 第第第第第 (CPU 第第第第 ) 第第第第第第第第第第第第第 第第 第第 第第 第第第第第第第IN/OUT 第第第第第第第第第第第第 第第第第第第第 () CPU 第第第第第第第第 I/O 第第第 第第 I/O 第第第 第第第第第 / 第第 第第 CPU 第第第第第第第第 第第第第第第第第 ,。 第第第第 CPU 第第第第第第第第第第第 I/O 第第第第第第第第 第第 I/O 第第第第第 第第第 第 第 (), I/O 第第 CPU 第第第第第第第第第 第第第第 I/O 第第第第第 第第第第第第第 第第第第第第DMA 第第 第第第第第第第第第 / 第第 第第第第 第第第第第第第 I/O 第第 第第第第 第 (), CPU 第 I/O 第第第第第第第第 第第第 第第第第第第第第第), I/O 第第第第第第第第第第第第第第第第第

Upload: brigit

Post on 27-Jan-2016

157 views

Category:

Documents


0 download

DESCRIPTION

第八章 输入 / 输出程序设计. 8.1 I/O 设备的数据传送方式 I/O 设备与主机 (CPU 和存储器 ) 的通信是通过外设接口进行的,传送 控制、状态、数据 三种不同的信息, IN/OUT 指令执行这些操作。 查询方式(程序控制方式) CPU 利用指令反复查询 I/O 的状态,直到 I/O 准备好,才进行输入 / 输出。此间 CPU 处于循环等待状态,未做有效的工作。 中断方式 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第八章   输入 / 输出程序设计

第八章 输入 / 输出程序设计8.1 I/O 设备的数据传送方式 I/O 设备与主机 (CPU 和存储器 ) 的通信是通过外设接口进行的,传送控制、状态、数据三种不同的信息, IN/OUT 指令执行这些操作。查询方式(程序控制方式) CPU 利用指令反复查询 I/O 的状态,直到 I/O 准备好,才进行输入 / 输出。此间 CPU 处于循环等待状态,未做有效的工作。中断方式 CPU 在执行程序的同时兼顾对 I/O 设备的控制或数据传送。当 I/O 设备准备好(空闲),由 I/O 通知 CPU 暂停正在运行的程序,转而处理 I/O 设备的请求,处理完即返回主程序继续执行。DMA 方式(直接存储器存取方式 / 成组传送方式) 主要适用于高速 I/O 设备(如磁盘), CPU 向 I/O 接口提供控制信息(如数据块的首地址及字节数), I/O 设备直接和存储器进行成批数据的快速传送。

Page 2: 第八章   输入 / 输出程序设计

8.2 程序直接控制 I/O 方式

外设接口由一组寄存器(数据寄存器 / 状态寄存器 / 命令寄存器)组成,每个寄存器有一个端口地址 ( 端口号 ) 80X86 微机, I/O 端口编址在一个独立的地址空间中,I/O 地址空间可达 64K(0000~FFFFH) ,允许设置 64K ( 65536 )个 8 位端口或 32K ( 32768 )个 16 位端口。

例:测试某状态寄存器(端口号 27H )的第 2 位是否为 1IN AL, 27HTEST AL, 00000100BJNZ ERROR

I/O 指令是主机与外设进行通信的最基本途径。 DOS功能调用和 BIOS 例行程序中的输入 / 输出功能也是由 IN和 OUT 指令完成的。

Page 3: 第八章   输入 / 输出程序设计

输入指令( I/O CPU ) 长格式: IN AL, PORT (AL) (PORT) (字节) IN AX, PORT (AX) (PORT+1, PORT) (字) 短格式: IN AL, DX (AL) ( (DX) ) (字节) IN AX, DX (AX) ( (DX)+1, (DX) ) (字)

输出指令( CPU I/O )

长格式: OUT PORT, AL (PORT) (AL) (字节) OUT PORT, AX (PORT+1, PORT) (AX) (字) 短格式: OUT DX, AL ( (DX) ) (AL) (字节) OUT DX, AX ( (DX)+1, (DX) ) (AX) (字)

Page 4: 第八章   输入 / 输出程序设计

例 8.1 Sound 程序 mov dx, 100 ;声音延时 in al, 61h and al, 11111100b ;后两位清零sound: xor al, 2 ;第一位取反 out 61h, al mov cx, 140h ;控制 0/1 转换的间隔wait1: loop wait1 dec dx jne sound

设备控制寄存器端口 61H 1 / 0 0

控制其它外部设备

与门 放大器

2 号定时器相连

1 0

Page 5: 第八章   输入 / 输出程序设计

例 8.3 CPU 要从 3 个设备轮流输入数据,设备 1,2,3 的状态寄存器 端口号分别用 STAT1,STAT2,STAT3 表示,设备 1,2,3 的数据输入程序为 PROC1 、 PROC2 、 PROC3 ,第 5 位是输入准备位。

INPUT: IN AL, STAT1 TEST AL, 20H JZ DEV2 CALL FAR PTR PROC1DEV2: IN AL, STAT2 TEST AL, 20H JZ DEV3 CALL FAR PTR PROC2DEV3: IN AL, STAT3 TEST AL, 20H JZ NO_INPUT CALL FAR PTR PROC3NO_INPUT: ……

Page 6: 第八章   输入 / 输出程序设计

这种 CPU 与外部设备交换信息的方式为查询方式或等待方式。

查询方式的优点: 可以用程序安排几个输入 / 输出设备的先后次序,最先查询的设备,其优先级也最高。

查询方式的缺点: 造成 CPU 的查询等待(原因是外设的工作速度比较低),而且由查询转向相应的处理程序的时间较长,尤其在设备教多的时候。

Page 7: 第八章   输入 / 输出程序设计

8.3 中断传送方式中 断: CPU 中止正在执行的程序而转去处理特殊事件的操作中断源:引起中断的特殊事件

软件中断(内中断)

由中断指令 INT引起

格式: INT N ; N 的取值范围 0 ~ 0FFH

由于 CPU 的某些错误引起

除法错中断、溢出中断 为调试程序( DEBUG )设置的中断

单步中断、断点中断

Page 8: 第八章   输入 / 输出程序设计

硬件中断非屏蔽中断( NMI ):电源掉电、内存或 I/O总线的奇偶错

NMI特点:不受中断允许标志 IF 的屏蔽,而且在整个系统中只能有一个非屏蔽中断。 可屏蔽中断( INMI ):外设的 I/O 请求

外部设备通过 8259A 可编程中断控制器和 CPU 相连。

从外设发出的中断请求到 CPU响应中断,有两个控制条件是起决定作用的。

1) 该外设的中断请求是否被屏蔽

(由 8259A 的中断屏蔽寄存器 IMR 控制)

2) CPU 是否允许响应中断

(由标志寄存器 FLAGS 的中断允许位 IF 控制)

STI (开中断)、 CLI (关中断)

Page 9: 第八章   输入 / 输出程序设计

非屏蔽中断请求

中断逻辑

INT n INTO 除法错 单步 n 4 0 1

CPU

2 NMI

8259A

可编程中断控制

(PIC)

IR0 系统定时器IR1 键盘IR2 彩色 /图形接口IR3 串行通讯IR4 串行通讯口IR5 LPT2

IR6 软盘IR7 LPT1

INTR

08

09

0A

0B

0C

0D

0E

0F

7 6 5 4 3 2 1 0

定时器

打印机

中断屏蔽寄存器 21H

7 6 5 4 3 2 1 0

中断命令寄存器 20H

EOIMOV AL, 20H

OUT 20H, AL

0 :允许中断

1 :禁止中断

(八个外部设备)

( EOI 中断结束命令)

Page 10: 第八章   输入 / 输出程序设计

中断向量表 80X86 中断系统能处理 256 种类型的中断,类型号为 0~0FFH

。中断向量表是各种中断处理程序的入口地址表( 0000~03FFH )。

中断操作的 5 个步骤:(1) 取中断类型号(2) 计算中断向量地址(3) 取中断向量,偏移地址送 IP ,段地址送 CS

(4) 转入中断处理程序(5) 中断返回到 INT 指令的下一条指令

例: BIOS 中断 INT 4AH 4AH4 = 128H 4AH4+2 = 12AH (128H) IP (12AH) CS

Page 11: 第八章   输入 / 输出程序设计

用户可利用保留的中断类型号扩充自己需要的中断功能。 例:为中断类型 N 设置中断向量

MOV AX, 0

MOV ES, AX

MOV BX, N*4

MOV AX, OFFSET INTHAND

MOV ES: WORD PTR[BX], AX ; 偏移地址 (N*4)

MOV AX, SEG INTHAND

MOV ES: WORD PTR[BX+2], AX ; 段地址 (N*4+2)

……

INTHAND: ……

IRET

Page 12: 第八章   输入 / 输出程序设计

DOS 功能调用( 21H )存取中断向量

设置中断向量:AH=25H入口参数: AL= 中断类型号 DS:DX= 中断向量INT 21H

取中断向量:AH=35H入口参数: AL= 中断类型号INT 21H出口参数: ES:BX= 中断向量

Page 13: 第八章   输入 / 输出程序设计

例 8.4 用 DOS 功能调用存取中断向量 MOV AL, N MOV AH, 35H INT 21H ; 取原中断向量 PUSH ES PUSH BX ; 保存原中断向量 PUSH DS

MOV AX, SEG INTHANDMOV DS, AX MOV DX, OFFSET INTHANDMOV AL, NMOV AH, 25HINT 21H ; 设置新的中断向量POP DS……POP DXPOP DSMOV AL, NMOV AH, 25HINT 21H ; 恢复原中断向量RET

;INTHAND: …… IRET

Page 14: 第八章   输入 / 输出程序设计

设置 CPU 中断允许位 FLAGS 中的 IF 位 =1 允许中断 ( STI 开中断) =0 禁止中断 ( CLI 关中断)设置中断屏蔽位 非屏蔽中断(类型号为 2 ):一种特殊的外部中断,与 IF位的设置情况无关, CPU 不能禁止此类中断。 21H 中断屏蔽寄存器 中断屏蔽位 =0 允许中断 =1 禁止中断中断过程(中断机构自动完成下列动作) 取中断类型号 N FLAGS 的内容入栈 当前的 CS 的内容入栈 当前的 IP 的内容入栈 设置 IF 和 TF 从中断向量表中取出4个单元的内容送给 IP 和 CS 转中断处理程序

Page 15: 第八章   输入 / 输出程序设计

中断优先级

优先级:高 软件中断(除法错、 INT 、 INTO )

非屏蔽中断 NMI

可屏蔽中断 INMI

低 单步中断

其中可屏蔽中断的优先级又分为八个级别: 7 6 5 4 3 2 1 0

中断屏蔽寄存器 21H

优先级: IR7 …… IR0

<<

Page 16: 第八章   输入 / 输出程序设计

7 6 5 4 3 2 1 0

中断命令寄存器 I/0 端口号为 20H

EOI R SL 0 0 L2 L1 L0

   8259A 的中断命令寄存器的6位和7位能控制各可屏蔽中断请求的优先次序。 R  SL

0 0 正常优先级方式

0 1 清除由 L2~L0 指定的中断请求

1 0 各中断优先级左循环一个位置

1 1 各中断优先级循环移位

使 L2~L0 指定的中断请求到达最低优先级位置

Page 17: 第八章   输入 / 输出程序设计

例 : 优先级高 低

;之前优先级为 IR0 IR1 IR2 IR3 IR4 IR5 IR6 IR7

MOV AL 11100100B

OUT 20H AL

;优先级为: IR5 IR6 IR7 IR0 IR1 IR2 IR3 IR4

MOV AL 10100000B

OUT 20H AL

;优先级为: IR6 IR7 IR0 IR1 IR2 IR3 IR4 IR5

7 6 5 4 3 2 1 0

中断命令寄存器 I/0 端口号为 20H

EOI R SL 0 0 L2 L1 L0

Page 18: 第八章   输入 / 输出程序设计

中断处理程序的编写步骤:主程序: (1) 设置中断向量

(2) 设置 CPU 中断允许位 (3) 设置中断屏蔽位

中断处理子程序: (1) 中断处理功能 (2) IRET 中断返回

中断嵌套:正在运行的中断处理程序,又被其它中断源中断

条件:在开中断( IF =1 )的情况下 可以被高于它的中断源中断 如果要被同级或低级的中断源中断,则必须发出 EOI 命令,清除正在执行的中断请求,才能响应同级或低级的中断。

Page 19: 第八章   输入 / 输出程序设计

例 8.5 编写一个中断处理程序,要求在主程序运行期间,每隔 10秒响铃一次,同时显示‘ The bell is ring!’

dseg segment count dw 1 mess db 'The bell is ring!',0ah,0dh,'$'dseg ends

cseg segmentmain proc far assume cs:cseg, ds:dseg, es:dsegstart: push ds mov ax, ax push ax mov ax, dseg mov ds, ax

Page 20: 第八章   输入 / 输出程序设计

mov al, 1ch mov ah, 35h int 21h ; 取原中断向量 push es push bx ; 保存原中断向量 push ds mov dx, offset ring mov ax, seg ring mov ds, ax mov al, 1ch mov ah, 25h int 21h ; 设置新的中断向量 pop ds in al, 21h and al, 11111110b out 21h, al ; 设置中断屏蔽位 , 允许定时器中断 sti ; 开中断

Page 21: 第八章   输入 / 输出程序设计

mov di, 2000delay: mov si, 3000delay1: dec si jnz delay1 dec di jnz delay ; 主程序工作时间

pop dx pop ds mov al, 1ch mov ah, 25h int 21h ; 恢复原中断向量 retmain endp

Page 22: 第八章   输入 / 输出程序设计

ring proc far push ds push ax push cx push dx

mov ax, dseg mov ds, ax

sti ; 开中断 , 允许更高级的中断 dec count jnz exit mov dx, offset mess mov ah, 09 int 21h ; 显示‘ The bell is ring!’

Page 23: 第八章   输入 / 输出程序设计

mov dx, 100 in al, 61h and al, 11111100bsound: xor al, 2 out 61h, al mov cx, 140hwait1: loop wait1 dec dx jne sound ; 响铃 mov count, 182exit: cli ; 关中断 pop dx pop cx pop ax pop ds iretring endpcseg ends end start