第八章 输入输出程序设计

32
1 第第第 第第第第第第第第 CPU MEM I/O 第第 第第 I/O 第第

Upload: chad

Post on 16-Mar-2016

77 views

Category:

Documents


9 download

DESCRIPTION

第八章 输入输出程序设计. 总线. CPU. MEM. I/O 接口. I/O 设备. 1. I/O 设备的数据传送方式. 查询方式 ( 程序控制方式 ) 中断方式 DMA 方式 ( 直接存储器存取方式 / 成组传送方式 ). 2. 程序直接控制 I/O 方式. I/O 指令 是主机与外设进行通信的最基本途径。 DOS 功能调用和 BIOS 例行程序中的输入 / 输出功能也是由 IN 和 OUT 指令完成的。 例:循环测试某 状态寄存器 的第 2 位是否为 1 AGAIN: IN AL, STATUS_PORT - PowerPoint PPT Presentation

TRANSCRIPT

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

1

第八章 输入输出程序设计

CPU MEM

I/O 设备

总线I/O 接口

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

2

查询方式(程序控制方式)中断方式DMA 方式(直接存储器存取方式 /成组传送方式)

1. I/O 设备的数据传送方式

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

3

I/O 指令是主机与外设进行通信的最基本途径。 DOS 功能调用和 BIOS 例行程序中的输入 /输出功能也是由 IN 和 OUT 指令完成的。例:循环测试某状态寄存器的第 2 位是否为 1

AGAIN: IN AL, STATUS_PORT TEST AL, 00000100B JZ AGAIN

2. 程序直接控制 I/O 方式

读 I/O 状态准备好?

传送数据

N

YIN AL,DATA_PORT

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

4

I/O 指令是主机与外设进行通信的最基本途径。 DOS 功能调用和 BIOS 例行程序中的输入 /输出功能也是由 IN 和 OUT 指令完成的。例:循环测试某状态寄存器的第 2 位是否为 1

AGAIN: IN AL, STATUS_PORT TEST AL, 00000100B JZ AGAIN

2. 程序直接控制 I/O 方式

读 I/O 状态

准备好?

传送数据

N

YMOV AL, DATAOUT DATA_PORT, AL

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

5

轮流查询几种 I/O 设备:DEV1: IN AL, STAT1

TEST AL, STAT1_BIT

JZ DEV2

CALL FAR PTR PROC1

DEV2: IN AL, STAT2

TEST AL, STAT2_BIT

JZ DEV3

CALL FAR PTR PROC2

DEV3: IN AL, STAT3

TEST AL, STAT3_BIT

JZ DEV1

CALL FAR PTR PROC3

优:程序安排或修改 设备的优先次序缺:查询等待浪费 CPU 大量有效时间

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

6

设备控制寄存器 ( 61h )1/0 0

控制其它外部设备与门 放大器

2 号定时器门控1 0

例: Sound 程序1

…… mov dx, 100 in al, 61h and al, 11111100bsound: xor al, 2 out 61h, al mov cx, 140hwait1: loop wait1 dec dx jne sound ……

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

7

.model tiny.code.startupcall speaker_onmov ah, 1int 21hcall speaker_off.exit 0

speaker_on proc push ax in al, 61h or al, 3 out 61h, al pop ax retspeaker_on endp speaker_off proc push ax in al, 61h and al, 0fch out 61h, al pop ax retspeaker_off endpend

例: Sound 程序2

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

8

print proc near push ax push dx mov dx, 378h ; 数据寄存器 out dx, al mov dx, 379h ; 状态寄存器again: in al, dx test al, 80h ; (dx)7 = busy je again ; =0, 打印机忙 mov dx, 37ah ; 控制寄存器 mov al, 0dh out dx, al ; 送选通信号 jmp $+2 ; 展宽选通信号 mov al, 0ch out dx, al pop dx pop ax retprint endp

例:打印机查询输出子程序

0 0 0 0 1 1 0 1选通位自动换行初始化

选择位中断位

37AH

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

9

中断源:引起中断的事件外中断(硬中断): 外设的 I/O 请求 —— 可屏蔽中断 电源掉电 / 奇偶错 —— 非屏蔽中断内中断(软中断): INT 指令 / CPU 错(除法错、溢出)/ 为调试程序设置的中断

3. 中断传送方式

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

10

非屏蔽中断请求

中断逻辑

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

CPU

2 NMI

8259A可编程中断控制

(PIC)

IR0 系统定时器IR1 键盘IR2 彩色 / 图形接口IR3 保留IR4 串行通讯口IR5 保留IR6 软盘IR7 打印机

INTR

08

09

0A

0B

0C

0D

0E

0F

80x86 中断源:

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

11

设置 CPU 中断允许位: FLAGS 中的 IF 位 = 1 允许中断 ( STI ) = 0 禁止中断 ( CLI )设置中断屏蔽位: 中断屏蔽寄存器的中断屏蔽位 = 0 允许 I/O 设备请求中断 = 1 禁止 I/O 设备请求中断 7 6 5 4 3 2 1 0

定时器键 盘

打印机

中断屏蔽寄存器 21H

7 6 5 4 3 2 1 0中断命令寄存器 20H

EOIMOV AL, 20H

OUT 20H, AL

8259A

中断的条件:

IN AL, 21HAND AL,0FDH OUT 21H,AL

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

12

类型 0 的 (IP)

类型 0 的 (CS)

类型 1 的 (IP)

类型 1 的 (CS)

类型 N 的 (IP)

类型 N 的 (CS)

类型 255 的 (IP) 类型 255 的(CS)

00000

00004

4*N

003FC

中断向量—中断处理程序的入口 地址(段址) :(偏址)

中断向量表

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

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

13

CPU 中断过程:( 1 )取中断类型: CPU ← type N

( 2 )保护现场: FLAGS 、 CS 、 IP 入栈( 3 ) IF=0, TF=0

( 4 )取中断向量:( 4×N )→ IP

( 4×N + 2 )→ CS

( 5 )转中断处理程序

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

14

例:为中断类型 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 15: 第八章   输入输出程序设计

15

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

AH = 25HAL = 中断类型号DS : DX = 中断向量INT 21H

取中断向量:AH = 35HAL = 中断类型号INT 21H返回时送 ES : BX = 中断向量

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

16

MOV AL, NMOV AH, 35HINT 21H ; 取原中断向量PUSH ESPUSH BX ; 保存原中断向量PUSH DSMOV AX, SEG INTHANDMOV DS, AX MOV DX, OFFSET INTHANDMOV AL, NMOV AH, 25HINT 21H ; 设置新的中断向量 POP DS……POP DXPOP DSMOV AL, NMOV AH, 25HINT 21H ; 恢复原中断向量……INTHAND: ; 中断处理程序……IRET

例:用 DOS 功能调用存取中断向量

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

17

中断程序的编写步骤:主程序:

(1)设置中断向量(2)设置 CPU 的中断允许位 IF(3)设置设备的中断屏蔽位

中断处理子程序:(1)保存寄存器内容(2)如允许中断嵌套,则开中断 ( STI )(3)中断处理功能(4)关中断(5)送中断结束命令 ( EOI ) 给中断命令寄存器(6)恢复寄存器内容(7) IRET 中断返回

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

18

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

定时器 中断18.2 次 /SEC

; INT_TIMER

   ∶   ∶  INT 1CH

∶   ∶ IRET

INT_1CH PROC

IRET

INT_ICH ENDP

RING PROC

1. 计数 182(10秒 )

2. 显示字符串 IRET

RING ENDP

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

19

例:编写一个中断处理程序,要求在主程序运行期间, 每隔 10 秒响铃一次,并显示 ‘ bell’

.model small.stack.datacnt dw 1mes db 'bell',0ah,0dh,'$' .codemain proc farstart: mov ax, @data mov ds, ax

mov al, 1chmov ah, 35hint 21hpush espush bxpush dsmov dx, offset ringmov ax, seg ringmov ds, axmov al, 1chmov ah, 25hint 21hpop ds in al, 21hand al, 11111110bout 21h, alsti

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

20

mov di, 30000dly: mov si, 60000dly1: dec si jnz dly1 dec di jnz dly ; 主程序 pop dx pop ds mov al, 1ch mov ah, 25h int 21h mov ax, 4c00h int 21hmain endp

ring proc near …… ; 保存寄存器 mov ax, @data mov ds, ax sti ; 开中断 dec cnt jnz exit mov dx, offset mes mov ah, 09 int 21h call sound mov cnt,182exit: cli ; 关中断 …… ; 恢复寄存器 iretring endp end start

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

21

例:键盘模拟程序字符码:采用 ASCII 码表示字母、数字、专用字符和一些 非打印字符,键盘上的控制键和功能键的 ASCII 码为 0,必须用扫描码来识别。扫描码:键盘上的每个键都对应一个扫描码,扫描码是按 键的位置来排列的。data segment scatab db 0,0,'1234567890-=',8,0 db 'qwertyuiop[]',0dh,0 db 'asdfghjkl;',0,0,0,0 db 'zxcvbnm,./',0,0,0 db ' ',0,0,0,0,0,0,0,0,0,0,0,0,0 db '789-456+1230',0data ends

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

22

main proc far …… lea bx, scatabkey_in: in al, 60h test al, 80h ; 通码? jnz key_in push ax in al, 61h or al, 80h ; 置应答位 out 61h, al and al, 7fh out 61h, al; 复位应答位 pop ax cmp al, 01 jz exit ; 按 Esc 退出 xlatb cmp al, 0 jz no_disp call disp_charno_disp: jmp key_inexit: ……main endp

disp_char proc near mov ah, 2 mov dl, al int 21h retdisp_char endp

7 6 5 4 3 2 1 0

设备控制寄存器 61H

键盘

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

23

例:从键盘接收字符,同时对 32 字节的输入缓冲区进行 测试;如缓冲区已满,将键盘挂起,由打印机输出 一个提示信息

MAIN

BUFFER 满 CALL

CALL

IRETN

KBD中断32 次

TYP中断17 次

KBINT

IRET

PRINT

RET

DISP

RET

INTIP

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

24

例:从键盘接收字符,同时对 32 字节的输入缓冲区进行 测试;如缓冲区已满,将键盘挂起,由打印机输出 一个提示信息 程序包括以下几个部分:

main 初始化部分kbint 键盘中断处理程序intip 初始化打印机prtint 打印机中断处理程序disp 用十六进制显示 al 中的内容

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

25

dseg segment addr dw ? ;缓冲区指针 count dw ? buffer db 20h dup (' ') prompt db 'please input:',0dh,0ah,'$' message db 'buffer overflow',0dh,0ah save_ip9 dw ? save_cs9 dw ? save_ipf dw ? save_csf dw ?dseg endsmain proc far …… mov addr, offset buffer mov count, 0

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

26

mov al, 09 ; 键盘mov ah, 35hint 21h mov save_ip9, bxmov save_cs9, es mov dx, offset kbintpush dsmov ax, seg kbintmov ds, axmov al, 09mov ah, 25hint 21h pop ds in al, 21hand al, 0fdhout 21h, al

mov al, 0fh ; 打印机mov ah, 35hint 21h mov save_ipf, bxmov save_csf, es mov dx, offset prtintpush dsmov ax, seg prtintmov ds, axmov al, 0fhmov ah, 25hint 21h pop ds mov ah, 9lea dx, promptint 21h

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

27

sti mov di, 8000hdly: mov si, 9000hdly1: dec si jnz dly1 dec di jnz dly mov ah, 2 mov dl, '$' int 21h cli push ds mov dx, save_ip9 mov ax, save_cs9 mov ds, ax mov al, 09 mov ah, 25h int 21h pop ds

push dsmov dx, save_ipfmov ax, save_csfmov ds, axmov al, 0fhmov ah, 25hint 21h pop dsin al, 21hand al, 0fdhout 21h, al sti……main endp

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

28

kbint proc near push ax push bx in al, 60h push ax in al, 61h mov ah, al or al, 80h out 61h, al ; 送键盘应答信号 xchg ah, al out 61h, al ; 复位键盘 pop ax test al, 80h jnz ret1 ; 通码时处理通码: (60h)7=0

断码: (60h)7=1

mov bx, addr mov [bx], al call disp inc bx inc count mov addr, bxcheck: cmp count,32 jb ret1 ; 判断是否溢出 in al, 21h or al, 02 ; 屏蔽键盘中断 and al, 7fh out 21h,al ; 允许打印机中断 call intipret1: cli mov al, 20h out 20h,al ; 结束键盘中断 pop bx pop ax iretkbint endp

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

29

intip proc near push ax push bx push dx cli mov bx, offset message mov addr, bx mov dx, 378h mov al, 0dh out dx, al ; 输出回车 mov dx, 37ah mov al, 1dh out dx, al ; 送选通信号 jmp $+2 ; 展宽选通信号 mov al, 1ch out dx, al pop dx pop bx pop ax  retintip endp

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

30

prtint proc near push ax push bx push dx mov bx, addr mov al, [bx] mov dx, 378h out dx, al push ax mov dx, 37ah mov al, 1dh out dx, al jmp $+2 mov al, 1ch out dx, al pop ax

inc bx mov addr, bx cmp al, 0ah jnz ret2 in al, 21h or al, 80h out 21h, al ; 屏蔽打印机中断ret2: mov al, 20h out 20h, al ; 结束打印机中断 pop dx pop bx pop ax iretprtint endp

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

31

disp proc near ; 显示扫描码 push ax push cx push dx mov ch, 2 mov cl, 4nextb: rol al, cl push ax mov dl, al and dl, 0fh or dl, 30h cmp dl, 3ah jl dispit add dl, 7dispit: mov ah, 2 int 21h pop ax dec ch jnz nextb

mov ah, 2 mov dl, ',' int 21h pop dx pop cx pop ax retdisp endp

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

32

第八章作业Page 313 8.2 8.5 8.6