1 / 23

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

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

brigit
Télécharger la présentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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设备直接和存储器进行成批数据的快速传送。

  2. 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指令完成的。

  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) (字)

  4. 设备控制寄存器 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

  5. 例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: • ……

  6. 这种CPU与外部设备交换信息的方式为查询方式或等待方式。这种CPU与外部设备交换信息的方式为查询方式或等待方式。 查询方式的优点: 可以用程序安排几个输入/输出设备的先后次序,最先查询的设备,其优先级也最高。 查询方式的缺点: 造成CPU的查询等待(原因是外设的工作速度比较低),而且由查询转向相应的处理程序的时间较长,尤其在设备教多的时候。

  7. 8.3中断传送方式 中 断:CPU中止正在执行的程序而转去处理特殊事件的操作 中断源:引起中断的特殊事件 软件中断(内中断) • 由中断指令INT引起 格式:INT N ;N的取值范围0 ~ 0FFH • 由于CPU的某些错误引起 除法错中断、溢出中断 • 为调试程序(DEBUG)设置的中断 单步中断、断点中断

  8. 硬件中断 • 非屏蔽中断(NMI):电源掉电、内存或I/O总线的奇偶错 NMI特点:不受中断允许标志IF的屏蔽,而且在整个系统中只能有一个非屏蔽中断。 • 可屏蔽中断(INMI):外设的I/O请求 外部设备通过8259A可编程中断控制器和CPU相连。 从外设发出的中断请求到CPU响应中断,有两个控制条件是起决定作用的。 1) 该外设的中断请求是否被屏蔽 (由8259A的中断屏蔽寄存器IMR控制) 2) CPU是否允许响应中断 (由标志寄存器FLAGS的中断允许位IF控制) STI(开中断)、CLI(关中断)

  9. 非屏蔽中断请求 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中断结束命令)

  10. 中断向量表 80X86中断系统能处理256种类型的中断,类型号为0~0FFH。中断向量表是各种中断处理程序的入口地址表(0000~03FFH)。 中断操作的5个步骤: (1) 取中断类型号 (2) 计算中断向量地址 (3) 取中断向量,偏移地址送IP,段地址送CS (4) 转入中断处理程序 (5) 中断返回到INT指令的下一条指令 • 例:BIOS中断 INT 4AH • 4AH4 = 128H • 4AH4+2 = 12AH • (128H)  IP • (12AH)  CS

  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

  12. DOS功能调用(21H)存取中断向量 • 设置中断向量: • AH=25H • 入口参数:AL=中断类型号 • DS:DX=中断向量 • INT 21H • 取中断向量: • AH=35H • 入口参数:AL=中断类型号 • INT 21H • 出口参数:ES:BX=中断向量

  13. 例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

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

  15. 7 6 5 4 3 2 1 0 中断屏蔽寄存器21H 中断优先级 优先级:高 软件中断(除法错、INT、INTO) 非屏蔽中断NMI 可屏蔽中断INMI 低 单步中断 其中可屏蔽中断的优先级又分为八个级别: 优先级: IR7 …… IR0 < <

  16. 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指定的中断请求到达最低优先级位置

  17. 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

  18. 中断嵌套:正在运行的中断处理程序,又被其它中断源中断中断嵌套:正在运行的中断处理程序,又被其它中断源中断 条件:在开中断(IF =1)的情况下 • 可以被高于它的中断源中断 • 如果要被同级或低级的中断源中断,则必须发出EOI命令,清除正在执行的中断请求,才能响应同级或低级的中断。 • 中断处理程序的编写步骤: • 主程序:(1) 设置中断向量 • (2) 设置CPU中断允许位 • (3) 设置中断屏蔽位 • 中断处理子程序: • (1) 中断处理功能 • (2) IRET中断返回

  19. 例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

  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 ; 开中断

  21. 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

  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!’

  23. 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

More Related