slide1
Download
Skip this Video
Download Presentation
第八章 输入 / 输出程序设计

Loading in 2 Seconds...

play fullscreen
1 / 23

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


  • 126 Views
  • Uploaded on

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

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about '第八章 输入 / 输出程序设计' - brigit


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
slide1
第八章 输入/输出程序设计

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

slide2
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指令完成的。
slide3
输入指令(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) (字)

slide4
设备控制寄存器

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

slide5
例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:
          • ……
slide6
这种CPU与外部设备交换信息的方式为查询方式或等待方式。

查询方式的优点:

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

查询方式的缺点:

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

slide7
8.3中断传送方式

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

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

软件中断(内中断)

  • 由中断指令INT引起

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

  • 由于CPU的某些错误引起

除法错中断、溢出中断

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

单步中断、断点中断

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

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

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

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

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

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

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

2) CPU是否允许响应中断

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

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

slide9
非屏蔽中断请求

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

slide10
中断向量表

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
slide11
用户可利用保留的中断类型号扩充自己需要的中断功能。
  • 例:为中断类型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
slide12
DOS功能调用(21H)存取中断向量
      • 设置中断向量:
      • AH=25H
      • 入口参数:AL=中断类型号
      • DS:DX=中断向量
      • INT 21H
      • 取中断向量:
      • AH=35H
      • 入口参数:AL=中断类型号
      • INT 21H
      • 出口参数:ES:BX=中断向量
slide13
例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
slide14
设置CPU中断允许位
  • FLAGS中的IF位=1 允许中断 (STI 开中断)
  • =0 禁止中断 (CLI 关中断)
  • 设置中断屏蔽位
  • 非屏蔽中断(类型号为2):一种特殊的外部中断,与IF位的设置情况无关,CPU不能禁止此类中断。
  • 21H 中断屏蔽寄存器
  • 中断屏蔽位=0 允许中断
  • =1 禁止中断

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

  • 取中断类型号N
  • FLAGS的内容入栈
  • 当前的CS的内容入栈
  • 当前的IP的内容入栈
  • 设置IF和TF
  • 从中断向量表中取出4个单元的内容送给IP和CS
  • 转中断处理程序
slide15
7 6 5 4 3 2 1 0

中断屏蔽寄存器21H

中断优先级

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

非屏蔽中断NMI

可屏蔽中断INMI

低 单步中断

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

优先级: IR7 …… IR0

<

<

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

slide17
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

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

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

  • 可以被高于它的中断源中断
  • 如果要被同级或低级的中断源中断,则必须发出EOI命令,清除正在执行的中断请求,才能响应同级或低级的中断。
  • 中断处理程序的编写步骤:
    • 主程序:(1) 设置中断向量
        • (2) 设置CPU中断允许位
        • (3) 设置中断屏蔽位
    • 中断处理子程序:
    • (1) 中断处理功能
    • (2) IRET中断返回
slide19
例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
slide20
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 ; 开中断

slide21
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

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

ad