第八章
This presentation is the property of its rightful owner.
Sponsored Links
1 / 23

第八章 输入 / 输出程序设计 PowerPoint PPT Presentation


  • 81 Views
  • Uploaded on
  • Presentation posted in: General

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

Download Presentation

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

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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


3560397

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

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


3560397

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


  • 3560397

    输入指令(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) (字)


    3560397

    设备控制寄存器

    1 0

    端口61H

    1 / 0 0

    2号定时器相连

    控制其它外部设备

    与门

    放大器

    例8.1Sound程序

    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


    3560397

    • 例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:

      • ……


    3560397

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

    查询方式的优点:

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

    查询方式的缺点:

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


    3560397

    8.3中断传送方式

    中 断:CPU中止正在执行的程序而转去处理特殊事件的操作

    中断源:引起中断的特殊事件

    软件中断(内中断)

    • 由中断指令INT引起

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

    • 由于CPU的某些错误引起

      除法错中断、溢出中断

    • 为调试程序(DEBUG)设置的中断

      单步中断、断点中断


    3560397

    • 硬件中断

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

      NMI特点:不受中断允许标志IF的屏蔽,而且在整个系统中只能有一个非屏蔽中断。

    • 可屏蔽中断(INMI):外设的I/O请求

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

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

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

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

      2) CPU是否允许响应中断

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

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


    3560397

    非屏蔽中断请求

    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中断结束命令)


    3560397

    中断向量表

    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


    3560397

    • 用户可利用保留的中断类型号扩充自己需要的中断功能。

    • 例:为中断类型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


  • 3560397

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

      • 设置中断向量:

      • AH=25H

      • 入口参数:AL=中断类型号

      • DS:DX=中断向量

      • INT 21H

      • 取中断向量:

      • AH=35H

      • 入口参数:AL=中断类型号

      • INT 21H

      • 出口参数:ES:BX=中断向量


    3560397

    • 例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


  • 3560397

    • 设置CPU中断允许位

    • FLAGS中的IF位=1 允许中断 (STI 开中断)

    • =0 禁止中断 (CLI 关中断)

    • 设置中断屏蔽位

    • 非屏蔽中断(类型号为2):一种特殊的外部中断,与IF位的设置情况无关,CPU不能禁止此类中断。

    • 21H 中断屏蔽寄存器

    • 中断屏蔽位=0 允许中断

    • =1 禁止中断

      中断过程(中断机构自动完成下列动作)

    • 取中断类型号N

    • FLAGS的内容入栈

    • 当前的CS的内容入栈

    • 当前的IP的内容入栈

    • 设置IF和TF

    • 从中断向量表中取出4个单元的内容送给IP和CS

    • 转中断处理程序


    3560397

    7 6 5 4 3 2 1 0

    中断屏蔽寄存器21H

    中断优先级

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

    非屏蔽中断NMI

    可屏蔽中断INMI

    低 单步中断

    其中可屏蔽中断的优先级又分为八个级别:

    优先级: IR7 …… IR0

    <

    <


    3560397

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


    3560397

    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

    MOVAL11100100B

    OUT20HAL

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

    MOVAL10100000B

    OUT20HAL

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


    3560397

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

      条件:在开中断(IF =1)的情况下

    • 可以被高于它的中断源中断

    • 如果要被同级或低级的中断源中断,则必须发出EOI命令,清除正在执行的中断请求,才能响应同级或低级的中断。

    • 中断处理程序的编写步骤:

      • 主程序:(1) 设置中断向量

        • (2) 设置CPU中断允许位

        • (3) 设置中断屏蔽位

    • 中断处理子程序:

    • (1) 中断处理功能

    • (2) IRET中断返回


    3560397

    • 例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


    3560397

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


    3560397

    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


    3560397

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


    3560397

    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


  • Login