230 likes | 389 Views
第八章 输入 / 输出程序设计. 8.1 I/O 设备的数据传送方式 I/O 设备与主机 (CPU 和存储器 ) 的通信是通过外设接口进行的,传送 控制、状态、数据 三种不同的信息, IN/OUT 指令执行这些操作。 查询方式(程序控制方式) CPU 利用指令反复查询 I/O 的状态,直到 I/O 准备好,才进行输入 / 输出。此间 CPU 处于循环等待状态,未做有效的工作。 中断方式
E N D
第八章 输入/输出程序设计 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设备直接和存储器进行成批数据的快速传送。
8.2 程序直接控制I/O方式 • 外设接口由一组寄存器(数据寄存器/状态寄存器/命令寄存器)组成,每个寄存器有一个端口地址(端口号) • 80X86微机, I/O端口编址在一个独立的地址空间中,I/O地址空间可达64K(0000~FFFFH),允许设置64K(65536)个8位端口或32K(32768)个16位端口。 • 例:测试某状态寄存器(端口号27H)的第2位是否为1 • IN AL, 27H • TEST AL, 00000100B • JNZ ERROR • I/O指令是主机与外设进行通信的最基本途径。DOS功能调用和BIOS例行程序中的输入/输出功能也是由IN和OUT指令完成的。
输入指令(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) (字)
设备控制寄存器 1 0 端口61H 1 / 0 0 2号定时器相连 控制其它外部设备 与门 放大器 例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
例8.3CPU要从3个设备轮流输入数据,设备1,2,3的状态寄存器例8.3CPU要从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 PROC1 • DEV2: IN AL, STAT2 • TEST AL, 20H • JZ DEV3 • CALL FAR PTR PROC2 • DEV3: IN AL, STAT3 • TEST AL, 20H • JZ NO_INPUT • CALL FAR PTR PROC3 • NO_INPUT: • ……
这种CPU与外部设备交换信息的方式为查询方式或等待方式。这种CPU与外部设备交换信息的方式为查询方式或等待方式。 查询方式的优点: 可以用程序安排几个输入/输出设备的先后次序,最先查询的设备,其优先级也最高。 查询方式的缺点: 造成CPU的查询等待(原因是外设的工作速度比较低),而且由查询转向相应的处理程序的时间较长,尤其在设备教多的时候。
8.3中断传送方式 中 断:CPU中止正在执行的程序而转去处理特殊事件的操作 中断源:引起中断的特殊事件 软件中断(内中断) • 由中断指令INT引起 格式:INT N ;N的取值范围0 ~ 0FFH • 由于CPU的某些错误引起 除法错中断、溢出中断 • 为调试程序(DEBUG)设置的中断 单步中断、断点中断
硬件中断 • 非屏蔽中断(NMI):电源掉电、内存或I/O总线的奇偶错 NMI特点:不受中断允许标志IF的屏蔽,而且在整个系统中只能有一个非屏蔽中断。 • 可屏蔽中断(INMI):外设的I/O请求 外部设备通过8259A可编程中断控制器和CPU相连。 从外设发出的中断请求到CPU响应中断,有两个控制条件是起决定作用的。 1) 该外设的中断请求是否被屏蔽 (由8259A的中断屏蔽寄存器IMR控制) 2) CPU是否允许响应中断 (由标志寄存器FLAGS的中断允许位IF控制) STI(开中断)、CLI(关中断)
非屏蔽中断请求 8259A 08 IR0 系统定时器 09 可编程中断控制器 IR1 键盘 2 NMI 0A IR2 彩色/图形接口 INTR 0B 中断逻辑 IR3 串行通讯 CPU 0C IR4 串行通讯口 0D IR5 LPT2 n 4 0 1 0E IR6 软盘 INT n INTO 除法错 单步 0F IR7 LPT1 (PIC) 7 6 5 4 3 2 1 0 中断屏蔽寄存器21H 打印机 键 盘 定时器 7 6 5 4 3 2 1 0 EOI 中断命令寄存器20H 0:允许中断 1:禁止中断 (八个外部设备) MOV AL, 20H OUT 20H, AL (EOI中断结束命令)
中断向量表 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
用户可利用保留的中断类型号扩充自己需要的中断功能。用户可利用保留的中断类型号扩充自己需要的中断功能。 • 例:为中断类型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
DOS功能调用(21H)存取中断向量 • 设置中断向量: • AH=25H • 入口参数:AL=中断类型号 • DS:DX=中断向量 • INT 21H • 取中断向量: • AH=35H • 入口参数:AL=中断类型号 • INT 21H • 出口参数:ES:BX=中断向量
例8.4 用DOS功能调用存取中断向量 • MOV AL, N • MOV AH, 35H • INT 21H ; 取原中断向量 • PUSH ES • PUSH BX ; 保存原中断向量 • PUSH DS • MOV AX, SEG INTHAND • MOV DS, AX • MOV DX, OFFSET INTHAND • MOV AL, N • MOV AH, 25H • INT 21H ; 设置新的中断向量 • POP DS • …… • POP DX • POP DS • MOV AL, N • MOV AH, 25H • INT 21H ; 恢复原中断向量 • RET • ; • INTHAND: …… • IRET
设置CPU中断允许位 • FLAGS中的IF位=1 允许中断 (STI 开中断) • =0 禁止中断 (CLI 关中断) • 设置中断屏蔽位 • 非屏蔽中断(类型号为2):一种特殊的外部中断,与IF位的设置情况无关,CPU不能禁止此类中断。 • 21H 中断屏蔽寄存器 • 中断屏蔽位=0 允许中断 • =1 禁止中断 中断过程(中断机构自动完成下列动作) • 取中断类型号N • FLAGS的内容入栈 • 当前的CS的内容入栈 • 当前的IP的内容入栈 • 设置IF和TF • 从中断向量表中取出4个单元的内容送给IP和CS • 转中断处理程序
7 6 5 4 3 2 1 0 中断屏蔽寄存器21H 中断优先级 优先级:高 软件中断(除法错、INT、INTO) 非屏蔽中断NMI 可屏蔽中断INMI 低 单步中断 其中可屏蔽中断的优先级又分为八个级别: 优先级: IR7 …… IR0 < <
R SL 0 0 L2 L1 L0 7 6 5 4 3 2 1 0 EOI 中断命令寄存器 I/0端口号为20H 8259A的中断命令寄存器的6位和7位能控制各可屏蔽中断请求的优先次序。 RSL 0 0 正常优先级方式 0 1 清除由L2~L0指定的中断请求 1 0 各中断优先级左循环一个位置 1 1 各中断优先级循环移位 使L2~L0指定的中断请求到达最低优先级位置
R SL 0 0 L2 L1 L0 7 6 5 4 3 2 1 0 EOI 中断命令寄存器 I/0端口号为20H 例:优先级高 低 ;之前优先级为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
中断嵌套:正在运行的中断处理程序,又被其它中断源中断中断嵌套:正在运行的中断处理程序,又被其它中断源中断 条件:在开中断(IF =1)的情况下 • 可以被高于它的中断源中断 • 如果要被同级或低级的中断源中断,则必须发出EOI命令,清除正在执行的中断请求,才能响应同级或低级的中断。 • 中断处理程序的编写步骤: • 主程序:(1) 设置中断向量 • (2) 设置CPU中断允许位 • (3) 设置中断屏蔽位 • 中断处理子程序: • (1) 中断处理功能 • (2) IRET中断返回
例8.5编写一个中断处理程序,要求在主程序运行期间,每隔 10秒响铃一次,同时显示‘The bell is ring!’ • dseg segment • count dw 1 • mess db 'The bell is ring!',0ah,0dh,'$' • dseg ends • cseg segment • main proc far • assume cs:cseg, ds:dseg, es:dseg • start: • push ds • mov ax, ax • push ax • mov ax, dseg • mov ds, ax
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 ; 开中断
mov di, 2000 delay: mov si, 3000 delay1: dec si jnz delay1 dec di jnz delay; 主程序工作时间 pop dx pop ds mov al, 1ch mov ah, 25h int 21h; 恢复原中断向量 ret main endp
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!’
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; 响铃 mov count, 182 exit: cli ; 关中断 pop dx pop cx pop ax pop ds iret ring endp cseg ends end start