第 5章 输入输出和中断
第 5章 输入输出和中断
?5.1 I/O设备数据传送方式
?5.2 中断传送方式
?5.3 BIOS中断调用方式
?5.4 综合举例
开 始
第 5章 输入输出和中断
5.1 I/O设备数据传送方式
? 5.1.1 端口寻址方式
? 5.1.2 CPU与外设的传送方式
返回本章目录
第 5章 输入输出和中断
5.1.1 端口寻址方式
接口芯片 实际占用的
端口数目
端口号( 16
进制)
8237DMA控制器 16 00~0F
8259A中断控制器 2 20~21
8255并行接口 4 60~63
DMA 页面寄存器
( 74LS670) 4 80~83
NMI寄存器 1 A0
8253计数器 /定时器 4 40~43

5.
1I
BM
-PC












返回本节
第 5章 输入输出和中断
5.1.2 CPU与外设的传送方式
控制信息:是由 CPU发送给外部设备的, 命令其
处于某种方式或执行某种操作 。
状态信息:从接口输入的状态信息表示 I/O设备当
前的状态 。
数据信息则是 I/O设备和 CPU真正要交换的信息 。
数据信息可分为三种类型:数字量, 模拟量和开关
量 。
第 5章 输入输出和中断
各种外设的工作速度相差很大, 根据其工
作状态, 大致可分为三类:
l 外设的工作状态是可以确定的 。
l 外设的工作状态是不能确定的 。
l 高速的外设与计算机进行数据交换 。
第 5章 输入输出和中断
CPU与外设之间传输数据的控制方式有三
种:即程序方式, 中断方式和 DMA方式 。
1.程序方式
( 1)无条件传输方式,如图 5.1所示。
【 例 5.1】 用一个 8位输出锁存器控制 8个
发光二极管,使发光管从上向下依次一个
一个地闪亮,每个发光管亮一段规定的时
间。设输出锁存器的地址为 84H。
第 5章 输入输出和中断
图 5.1 用无条件传送方式的例子
第 5章 输入输出和中断
控制程序如下:
START,MOV AL,01H ;控制代码 01H→AL
NEXT,OUT84H,AL; ( AL) → 84H
CALL DELAY ;延时一定时间
ROL AL,1 ;控制代码循环左移 1位
JMP NEXT ;无条件转 NEXT继续程序循环
DELAY,PROC ;定义延时子程序 DELAY
PUSH AX
MOV AX,COUNT
TIME,DEC AX
第 5章 输入输出和中断
( 2)条件传送方式
JNZ TIME
POP AX
RET ;返回调用程序
DELAY ENDP ;子程序调用结束
【 例 5.2】 假设从某输入设备上输入一组数据送缓
冲区,接口电路如图 5.2所示:
第 5章 输入输出和中断
程序如下:
DATA SEGMENT
MESSI DB,BUFFEROVERFLOW”,“$”
BUFF DB 60 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS,CODE,DS,DATA
START,MOV AX,DATA
MOV DS,AX
第 5章 输入输出和中断
MOV BX,OFFSET BUFF ;送缓冲区指针
MOV CX,60 ;送计数初值
OUT 0FCH,AL ;启动设备
WAIT,IN AL,0FAH;查询状态, READY=0,则等待
TEST AL,01H
JZ WAIT
WAIT,IN AL,0FAH;查询状态 READY=0,则等待
TEST AL,01H
JZ WAIT
第 5章 输入输出和中断
IN AL,0F8H;输入数据
MOV [BX],AL
INC BX
LOOP WAIT ;检测缓冲区是否满, 不满再输入
MOV DX,OFFSET MESSI;缓冲区满,
输出标志字符串 。
MOV AH,09H INT 21H
MOV AH,4CH INT 21H
CODE ENDS END START
第 5章 输入输出和中断
图 5.2 查询式输入接口电路
第 5章 输入输出和中断
C
P
U









DB
STB
BUSY
CB
DB
AB
图 5.3 打印机连接示意图
【 例 5.3】 向打印机输出字符。
第 5章 输入输出和中断

5.
4[

5.
3]





第 5章 输入输出和中断
源程序:

MOV BX,OFFSET,BUFFER;置缓冲区偏移量
MOV CX,CHRTL ;置输出字符计数器
BG,MOV AL,[BX];取字符
MOV DX,378H;输出字符到控制器
OUT DX,AL
MOV DX,379H;读打印机状态
第 5章 输入输出和中断
WT,IN AL,DX
TEST AL,80H ;判 ‘ 忙 ’ 否?
JZ WT ;忙, 重查询
MOV DX,37AH ;形成选通信号
MOV AL,0DH ;令打印机打印字符
OUT DX,AL MOVAL,0CH
OUT DX,AL
INC BX ;指向下一输出字符
LOOP BG

第 5章 输入输出和中断
2.中断方式
当外设需要与 CPU进行数据交换时, 由外
设向 CPU发出中断请求, 当外部设备完成
一次输入或输出操作后, 主动向 CPU报告
( 即中断请求 ), 请求 CPU为它服务 。 允
许 CPU启动多个外设工作, 即允许 CPU与
多个外设同时工作 。
第 5章 输入输出和中断
3.直接存储器存取方式( DMA)方式
DMA方式,主要是利用 DMA控制器来管理数
据的输入输出操作。如图 5.5,5.6所示。由
DMA控制器向地址总线发出存储器地址信号,
并给出存储器读或写命令,就可以把存储器中
读出的数据送到外部设备或者把外部设备输出
的数据写入存储器中。
DMA主要是利用程序实现对 DMA控制器的初
始化(置控制字),然后由 DMA控制器管理数
据传送。
第 5章 输入输出和中断







C
P
U
DMA
请求
DMA
响应
HOLD
HLDA
DMA



图 5.5 DMA控制器与 CPU关系图
第 5章 输入输出和中断

5.
6DM
A







返回本节
第 5章 输入输出和中断
5.2 中断传送方式
?5.2.1 概述
?5.2.2 8086/ 8088的中断系统
返回本章目录
第 5章 输入输出和中断
5.2.1 概述
?1,中断, 中断源及中断系统
?2,中断的作用
( 1) 并行操作
( 2) 实时处理
( 3) 故障处理
第 5章 输入输出和中断
3.中断源种类及中断类型
( 1) 中断源的种类
l 硬件故障 l输入 /输出设备 l外部事件
( 2) 中断类型
根据是否可屏蔽, 分为不可屏蔽中断和可屏蔽中断 。
根据位置不同分为内中断和外中断 。
根据处理程序入口的方法, 分为向量中断和非向量
中断 。
根据产生中断的原因, 又分为软件中断和硬件中断 。
第 5章 输入输出和中断
4,中断优先级和中断嵌套
IBM-PC规定中断的优先级次序为:
优先级高 内中断 ( 语法错, INT0,INT)
非屏蔽中断 ( NMI)
可屏蔽中断 ( INTR)
低 单步中断
第 5章 输入输出和中断
图 5.7中断嵌套程序执行过程 。


主程序 高级中断程序 更高级中断程序
高级中断程序
低级中断程序
第 5章 输入输出和中断
5,中断处理过程
微型机在运行程序的过程中, 若出现中断
申请时, CPU及时地择优响应, 立即停止
现行程序的执行, 并保护现场, 接着进行
相应的中断服务 。 服务完毕之后, 立即恢
复被中断的现场, 返回被中断程序的断点,
继续往下执行 。 中断处理大致包括如下过
程:中断请求, 中断响应, 中断处理及中
断返回 。
返回本节
第 5章 输入输出和中断
5.2.2 8086/ 8088的中断系统
1,中断源
8086/ 8088系统设有如下的中断源:
l 外部中断:包括可屏蔽中断 INTR和不可
屏蔽中断 NMI。
l 内部中断:包括除法错中断, 溢出中断,
软中断, 和单步中断 。
其中断源间的关系如图 5.8所示。
第 5章 输入输出和中断
图 5.8 8086/8088的中断源
第 5章 输入输出和中断
( 1) 内部中断
内部中断简称内中断, 又称软件中断 。 它不需要
外部硬件支持 。 并且不受中断标志位状态的影响 。
8086/8088内部中断有以下 5种:
l 除数为0中断 ——类型 0中断
l 单步中断 ——类型 1中断
l 断点中断 ——类型 3中断
l 溢出中断 ——类型 4中断
l 中断指令 ——指令 INTn中断
第 5章 输入输出和中断
( 2)外部中断
l 不可屏蔽中断:常用于紧急故障处理或
紧迫事件处理中 。
l 可屏蔽中断:可屏蔽中断的设置主要是
为了实现多中断的处理和中断嵌套的应用 。
第 5章 输入输出和中断
2.中断向量和中断向量表

5.
9
80
86/
80
88








第 5章 输入输出和中断

5.
2










第 5章 输入输出和中断
3.设置中断向量
用指令来为中断类型 N设置中断向量:
MOV AX,0
MOV ES,AX
MOV BX,N*4;中断入口地址
MOV AX,OFFSET INTHAND
MOV ES,WORD PRT[BX],AX ;设置中断处理程
序 INTHAND
MOV AX,SEG INTHAND ;的入口地址
MOV ES,WORD PRT[BX+2],AX
第 5章 输入输出和中断

INTHAND,;中断处理程序

IRET
【 例 5.4】 使用 DOS功能调用存取中断向量。

MOV AL,N
MOV AH,35H;调用 DOS功能 35H
第 5章 输入输出和中断
INT 21H
PUSH ES ;保存原中断向量
PUSH BX
PUSH DS
MOV AX,SEG INTHAND
MOV DS,AX;置用户定义的中断处理
MOV DX,OFFSET INTHAND;程序 INTHAND的入口
MOV AL,N ;地址 ( 段地址和偏移地址 )
MOV AH,25H ;设置新的中断向量
第 5章 输入输出和中断
INT 21H POP DS
POP DX ;恢复原中断向量
POP DS MOV AL,N
MOV AH,25H INT 21H
RET
INTHAND,;中断处理程序

IRET
第 5章 输入输出和中断
4.中断过程
当中断发生时, 由硬件自动完成下列动作:
( 1) 取中断类型号 N。
( 2) 标志寄存器 ( PSW) 内容入栈 。
( 3) 当前代码段寄存器 ( CS) 内容入栈 。
( 4) 当前指令计数器 ( IP) 内容入栈 。
( 5) 禁止外部中断和单步中断 ( IF=0,TF=0) 。
( 6) 从中断向量表中取 4*N的字节内容送 IP,取
4*N+2的字节内容送 CS。
( 7)转中断处理程序。
第 5章 输入输出和中断

5.
10






第 5章 输入输出和中断
5,8259A可编程中断控制器
例如, 只允许打印机中断, 可设置如下中断字:
MOV AL,01111111B OUT 21H,AL
如果系统要新增设打印机中断, 则可用下列指令实现:
IN AL,21H AND AL,01111111B
OUT 21H,AL
结束外中断用下面的指令:
MOV AL,20H OUT 20H,AL
第 5章 输入输出和中断
6.中断处理程序

5.
11















第 5章 输入输出和中断
下面是主程序为中断所做的准备工作和硬件,
(包括 CPU和外设接口)自动完成的动作。
( 1) 设置中断和向量 。
( 2) 设置设备的中断屏蔽位 。
( 3) 设置 CPU的中断允许位 IF( 开中断 ) 。
( 4) 外设接口送中断请求给 CPU。
第 5章 输入输出和中断
( 5) 当前指令执行完成后, CPU送响应
信号给外设接口 。
( 6) CPU接收中断类型号 。
( 7) 当前的 PSW,CS和 IP保存入栈 。
( 8) 清除 IF,TF。
( 9) 中断向量送 IP和 CS。
第 5章 输入输出和中断
编写中断处理子程序的步骤, 请注意与子程序编写
的一些不同之处 。
( 1) 保存寄存器内容 。
( 2) 如允许中断嵌套, 则开中断 ( STI) 。
( 3) 处理中断 。
( 4) 关中断 。
( 5) 送中断结束命令 ( EOI) 给中断命令寄存器 。
( 6) 恢复寄存器内容 。
( 7) 返回被中断的程序 ( IRET) 。
第 5章 输入输出和中断
【 例 5.5】 编一段中断处理程序,在主程序运行的
过程中,每隔 10秒钟响铃一次,同时在屏幕上显示
,The bell is ring!”。
编程如下:
DATA SEGMENT
COUNT DW 1
MESS DB ?The bell is ring!?,0DH,0AH,?$?
DATA ENDS
CODESEGMENT
ASSUME CS,CODE,DS,DATA,ES:
第 5章 输入输出和中断
DATA
MAIN PROC FAR
START,PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV AL,1CH;取中断向量
MOV AH,35H
第 5章 输入输出和中断
INT 21H
PUSH ES ;存原中断向量段址
PUSH BX ;存原中断向量偏移量
PUSH DS
MOV DX,OFFSET RING ;新偏移量送 DX
MOV AX,SEG RING
MOV DS,AX;新段址送 DS
MOV AL,1CH
第 5章 输入输出和中断
MOV AH,25H
INT 21H ;写入新的中断向量
POP DS
IN AL,21H;读取中断屏蔽字
AND AL,11111110B;允许定时器中断
OUT 21H,AL
STI;开中断
MOV DI,2000
DELAY,MOV SI,3000;延时
第 5章 输入输出和中断
DELAY1,DEC SI
JNZ DELAY1
DEC DI
JNZ DELAY
POP DX ;恢复原中断向量
POP DS
MOV AL,1CH
MOV AH,25H
INT 21H
第 5章 输入输出和中断
RET
MAIN ENDP
RING,PROC NEAR
PUSH DS ;各工作寄存器内容入栈
PUSH AX
PUSH CX
PUSH DX
MOV AX,DATA
MOV DS,AX
第 5章 输入输出和中断
STI
DEC COUNT ;计秒值
JNZ EXIT
MOV DX,OFFSET MESS
MOV AH,09H
INT 21H
MOV DX,100
IN AL,61H
AND AL,0FCH
第 5章 输入输出和中断
SOUND,XOR AL,02
OUT 61H,AL;扬声器发声
MOV CX,140H
WAIT1,LOOP WAIT1;延时等待
DEC DX
JNE SOUND
MOV COUNT,182
第 5章 输入输出和中断
EXIT,CLI;关中断
POP DX
POP CX
POP AX
POP DS
IRET ;中断返回
RING ENDP
CODE ENDS
END START
返回本节
第 5章 输入输出和中断
5.3 BIOS中断调用方式
?5.3.1 概述
?5.3.2 常用 BIOS功能调用
?5.3.3 图形显示程序设计
返回本章目录
第 5章 输入输出和中断
5.3.1 概述
BIOS使用的中断类型号为 10H ~ 1FH。 下
面给出 BIOS中断调用表 ( 见表 5-3) 。
BIOS中断调用方法:调用 BIOS程序模块,
需要给出入口参数 ( 有的调用无入口参
数 ) 。 然后通过跟有中断类型号的软中断
指令调用, 经中断向量表取出调用模块的
入口地址, 就可自动地转入相应的 BIOS处
理模块中去了 。
第 5章 输入输出和中断
表 5.3 BIOS中断调用表
返回本节
第 5章 输入输出和中断
5.3.2 常用 BIOS功能调用
1,键盘 I/O中断调用 ( 16H中断调用 )
16H中断调用有三个功能, 功能号为 0~2。
( 1) AH=0本功能为从键盘读字符到 AL寄存器中 。
( 2) AH=1 本功能为读键盘缓冲区字符到 AL寄存器
中, 并置 ZF标志位 。
( 3) AH=2 本功能为读取特殊功能键的状态 。
第 5章 输入输出和中断
2.打印机 I/O中断调( 17H中断调用)
17H中断调用有三个功能, 功能号为 0~2。
( 1) AH=0 本功能为把 AL中指定的字符在打印机
上打印出来 。
( 2) AH=1 本功能为对指定的打印机初始化 。
( 3) AH=2 本功能为读取打印机的状态信息 。
第 5章 输入输出和中断
MOV DX,0;用 0号机打印机
MOV AL,’ A? ;输出 ‘ A?字符
MOV AH,0 ; 0号功能
INT 17H ;调用 17H中断
TEST AH,08H ;判 I/O错否
JNZ IOER ;有错, 转错误处理

JOER:
【 例 5.6】 打印机输出一字符,判 I/O错否。如错,
转错误处理程序段。
第 5章 输入输出和中断
3.时钟中断调用( 1AH中断调用)
1AH中断调用有二个功能 。 功能号为 0和 1。
( 1) AH=0 本功能为读取时钟计数器的当
前值 。
( 2) AH=1 本功能为设置时钟计数器的当
前值 。
第 5章 输入输出和中断
【 例 5.7】 计算程序执行时间。
图 5.12给出有关程序段流程图 。

执行测试程序段 T DB 0 ;时单元
M DB 0 ;分单元
S DB 0 ;秒单元
取时间计数器值 TN EQU 65520 ;小时运算数
MN EQU 1092 ;分钟运算数
第 5章 输入输出和中断
计算执行时间为时、分、秒 SN EQU 18;
秒运算数

转换为 BCD时间 MOV CX,0;置时钟计数器
MOV DX,0;初值为 0
显示时间 MOV AH,1
INT 1AH
第 5章 输入输出和中断;被测程序段,..
MOV AH,0 ;取时钟计数器当前值
INT 1AH
CALL TDIV ;计算当前执行时间子程序
CALL TBCD ;转为 BCD数子程序
CALL TDISP;显示执行时间子程序
被测程序段.
..
..
.
..
.;其他处理
第 5章 输入输出和中断

5.
12[

5-
7]






第 5章 输入输出和中断
【 例 5.8】 生成随机数程序。
源程序:
RANDPROC
PUSH CX
PUSH DX
PUSH AX
STI
MOV AH,0 ;读时钟计数器值 INT
1AH
MOV AX,DX ;清高 6位
AND AH,3
第 5章 输入输出和中断
MOV DL,101;除 101,产生 0~100余数
DIV DL
MOV BL,AH;余数存 BX,作随机数
POP AX
POP DX
POP CX
RET
RANDENDP
返回本节
第 5章 输入输出和中断
5.3.3 图形显示程序设计
10H中断调用共有 16个功能 。 功能号为 0~15。
( 1) 设置显示方式 ( 0号功能 )
入口参数,AH=0( 功能号 ), AL=设置方式 ( 0~7) 。
出口参数:无 。
( 2)设置光标类型( 1号功能)
入口参数,AH=1(功能号),CH=光标开始行,CL=光
标结束行。
出口参数:无 。 根据 CX给出光标的大小 。
第 5章 输入输出和中断
AL 显示方式
0 40× 25黑白文本方式
1 40× 25彩色文本方式
2 80× 25黑白文本方式
3 80× 25彩色文本方式
4 320× 200彩色图形方式
5 320× 200黑白图形方式
6 640× 200黑白图形方式
7 80× 25黑白文本方式(单色显示卡)
第 5章 输入输出和中断
( 3) 设置光标位置 ( 2号功能 )
入口参数,AH=2( 功能号 ), BH=页号, DH=
行号, DL=列号 。
出口参数:无 。 根据 DX确定了光标位置 。
( 4) 读当前光标位置 ( 3号功能 )
入口参数; AH=3( 功能号 ), BH=页号 。
出口参数,DH=行号, DL=列号, CX=光标大小 。
( 5) 初始窗口或向上滚动 ( 6号功能 )
入口参数,AH=6,AL=上滚行数, CX=上滚窗口
左上角的行, 列号 。 DX=上滚窗口右下角的行,
第 5章 输入输出和中断
列号 。 BH=空白行的属性 。
出口参数:无 。 当滚动后, 底部为空白输入行 。
( 6)初始窗口或向下滚动( 7号功能)
入口参数,AH=7,AL=下滚行数, CX=下滚窗口
左上角的行, 列号 。 DX=下滚窗口右下角的行, 列
号 。 BH=空白行的属性 。
出口参数:无 。 当滚动后, 顶部为空白输入行 。
( 7) 读当前光标位置的字符与属性 ( 8号功能 )
入口参数,AH=08H,BH=页号 。
出口参数,AL为读出的字符, AH为字符属性 。
第 5章 输入输出和中断
表 5.4 黑白方式显示属性字节
第 5章 输入输出和中断
表 5.5 彩色文本方式显示属性字节
位号 7 6 5 4 3 2 1 0
属性
字节
BL R G B I R G B
闪烁选择 背景颜色 前景颜色
第 5章 输入输出和中断
110 棕
RGB 颜色
000 黑
001 蓝
010 绿
011 青
100 红
101 品红
111 白

5.
6






第 5章 输入输出和中断
IRGB 颜色 IRGB 颜色
0000 黑 1000 灰
0001 蓝 1001 浅蓝
0010 绿 1010 浅绿
0011 青 1011 浅青
0100 红 1100 浅红
0101 品红 1101 浅品红
0110 棕 1110 黄
0111 白 1111 强度白

5.
7





第 5章 输入输出和中断
( 8) 在当前光标位置写字符和属性 ( 9号功能 )
入口参数,AH=9,BH=页号, AL=字符的 ASCII
码, BL=字符属性, CX=写入字符数 。
出口参数:无 。
( 9) 在当前光标位置写字符 ( 10号功能 )
入口参数,AH=0AH,BH=页号, AL=字符的
ASCII码, CX=写入字符数 。
出口参数:无 。
( 10) 设置彩色组或背景颜色 ( 11号功能 )
第 5章 输入输出和中断
入口参数,AH=0BH,BH=0或 1,BH为 0时, 设
置背景颜色 。 当 BH=1时, 可设置彩色组, 即为
显示的像素点确定颜色组 。
出口参数:无 。 背颜色与对应值见表 5.8。
( 11) 写像素 ( 12号功能 )
入口参数,AH=0CH,DX=行数, CX=列数,
AL=彩色值 ( AL的 D7为 1,则彩色值与当前点内
容作 ‘ 异或 ’ 运算 ) 。
出口参数:无 。
( 12) 读像素 ( 13号功能 )
第 5章 输入输出和中断
BL IRGB 颜色 BL IRGB 颜色
0 0000 黑 8 1000 灰
1 0001 蓝 9 1001 浅蓝
2 0010 绿 10 1010 浅绿
3 0011 青 11 1011 浅青蓝
4 0100 红 12 1100 浅红
5 0101 品红 13 1101 浅品红
6 0110 棕 14 1110 黄
7 0111 亮灰 15 1111 白

5.
8







第 5章 输入输出和中断
表 5.9 彩色分组
第 5章 输入输出和中断
入口参数,AH=0DH,DX=行数, CX=列数 。
出口参数,AL=彩色值 。
( 13) 写字符并移光标位置 ( 14号功能 )
入口参数,AH=0EH,AL=写入字符, BH=页号,
BL=前景颜色 ( 图形方式 ) 。
出口参数:无 。
( 14) 读当前显示状态 ( 15号功能 )
入口参数,AH=0FH。
出口参数,AL=当前显示方式, BH=页号, AL=屏
幕上字符列数 。
第 5章 输入输出和中断
【 例 5.9】 在屏幕 10行 20~24列处显示五朵梅花,
颜色各异,且要求中间一个朵能够闪烁。
源程序:
DATA SEGMENT
ATRI DB 6EH,52H,94H,52H,6EH
DATA ENDS
STACK SEGMENT PARA STACK ?STACK?
DB 200 DUP( 0)
STACK ENDS
CODESEGMENT
第 5章 输入输出和中断
ASSUME CS,CODE,DS,DATA,SS,STACK
ST,MOV AX,DATA
MOV DS,AX
MOV AH,0 ;设置 80× 25彩色文本方式
MOV AL,3
INT 10H
LEN SI,ATRI;属性字节值表首址存 SI
MOV DI,5 ;显示 5个字符
第 5章 输入输出和中断
MOV DX,0A13H ;显示位置
MOV AH,15;取当前页号
INT 10H LP,MOVAH,2;置光标位置
INC DL
INT 10H
MOV AL,5;显示梅花形字符
MOV BL,[SI]
MOV CX,1
第 5章 输入输出和中断
MOV AH,9
INT 10H
INC SI,;指向下一属性字节
DEC DI;判显示完否
JNZ LP;未完转 LP再显示
MOV AH,4CH;完, 返回 DOS
INT 21H
CODEENDS
END ST
返回本节
第 5章 输入输出和中断
5.4 综合举例
?【 例 5.10】
?【 例 5.11】
?【 例 5.12】
?【 例 5.13】
?【 例 5.14】
?【 例 5.15】
返回本章目录
第 5章 输入输出和中断
【 例 5.10】
下面给出一个利用键盘 I/O功能的程序例 。 用 INT
16H( AH=0) 调用实现键盘输入字符 。
DATA SEGMENT
BUFF DB 100 DUP(?)
MESSDB ?NO CHARACTER!?,0DH,0AH,‘ $?
DATA ENDS
CODESEGMENT
ASSUME CS,CODE,DS,DATA
第 5章 输入输出和中断
START,MOV AX,DATA
MOVDS,AX
MOVCX,100
MOVBX,OFFSETBUFF ;内存缓冲区首址
LOP1,MOV AH,1
PUSH CX
MOVCX,0
MOVDX,0
INT 1AH ;设置时间计数器值为 0
第 5章 输入输出和中断
LOP2,MOV AH,0
INT 1AH ;读时间计数值
CMP DL,100
NZ LOP2 ;定时时间未到, 等待
MOV AH,1
INT 16H ;判有无键入字符
JZ DONE;无键输入, 则结束
MOV AH,0
INT 16H ;有键输入, 则读出键的 ASCII码
第 5章 输入输出和中断
MOV BX,AL ;存入内存缓冲区
INC BX
POP CX
LOOP LOP1 ; 100个未输完
JMP EN
DONE,MOV DX,OFFSET MESS
MOV AH,09H
INT 21H ;显示提示信息
EN,MOV AH,4CH INT 21H
CODEENDS END START
返回本节
第 5章 输入输出和中断
【 例 5.11】 利用 8253-5演奏乐曲。
图 5.13 钢琴上的部分音符对应频率
第 5章 输入输出和中断
程序如下:
EXTRN NEW--,FAR
DATA SEGMENT
FTANBLE DW 262,190,220,190,220,262,220,
262,294,0
TTABLE DW 40,40,40,0,10,40,20,80
DATA ENDS
STACK SEGMENT DW 100 DUP(?)
STACK ENDS
第 5章 输入输出和中断
CODE SEGMENT
ASSUME CS, CODE,DS, DATA,SS:
STACK
SING PROCFAR
MOV AX,DATA
MOV DS,AX
MOV SI,OFFSET FTABLE
LEA BP,TTABLE
CALL PLAY
MOV AX,4C00H
第 5章 输入输出和中断
INT 21H
RET
SING ENDP
PLAY PROC
PUSH BX
PUSH DI
PUSH SI
PUSH BP
AGAIN,MOV DI,[SI];取音调频率
CMP DI,0 ;是否演奏完
第 5章 输入输出和中断
JE END-PLAY
MOV BX,DS,[BP];取持续时间
CALL NEW-BEEP ;演奏一个音符
ADD SI,2
ADD BP,2 ;修改指针
JMP AGAIN
POP DI
POP BX
RET
第 5章 输入输出和中断
PLAY ENDP
NEW-BEEP PROC NEAR
PUSH AX
PUSH CX
PUSH DX
PUSH DI
MOV AL,0B6H
OUT 43H,AL; 8253-5通道 2设置方式 3
MOV DX,12H; 16位, 二进制计数
MOV AX,34DAH
第 5章 输入输出和中断
DIV DI;计算时间常数
OUT 42H,AL
MOV AL,AH
OUT 42H,AL;送时间常数
MOV AL,03H
OUT 61H,AL;使与门打开, GETE2有效, 扬
声器响
DELAY2,MOV CX,12500
DELAY1,OOP ELAY1;延时 10ms,使声音维持
DEC BX
第 5章 输入输出和中断
JNZ DELAY2;根据 BX的内容延迟
MOV AL,00H OUT 61H,AL;关闭扬声器
POP DI POP DX
POP CX POP AX
RET
NEW-BEEP ENDP
CODEENDS
END SING
返回本节
第 5章 输入输出和中断
【 例 5.12】 使用 0AH系统功能从键盘中接收一个
以回车符结尾的字符串。
程序如下:
STACK SEGMENT PARA STACK ?STACK?
DB 64 DUP( ‘ STACK… ?)
STACK ENDS
DATA SEGMENT PARA PUBLIC ?DATA?
KBUFL DB 255
KBUFC DB?
KBUFF DB 255 DUP(?)
第 5章 输入输出和中断
DATA ENDS
CODE SEGMENT PARA PUBLIC ?CODE?
ASSUME CS,CODE,SS,STACK,DS:
DATA
PRNTYP PROC FAR
PUSH DS ;保存旧的数据段
SUB AX,AX
PUSU AX
MOV AX,DATA
MOV DS,AX
第 5章 输入输出和中断
MOV AH,0FH ;重建显示模式以清屏
INT 10H
MOV AH,0
INT 10H
MOV DX,0000H ;设定光标为 0行 0列
MOV BH,0 ; 0页
MOV AH,2
INT 10H
MOV DX,1码 ; 1号打印机接口
MOV AH,1 ;初始化打印机
第 5章 输入输出和中断
INT 17H
PRT1,MOV DX,OFFSET KBUFL; DS:
DX指向输入缓冲区
MOV AH,0AH;用键盘向缓冲区输入字符串
INT 21H
MOV CL,KBUFC
CMP CL,0 ;若键入回车符则退出
JE EXIT
MOV CH,0;使 CX为串长 ( 不包括结尾回车符 )
LEA SI,KBUFF
第 5章 输入输出和中断
MOV DX,1 ; 1号打印机接口
PRT2,LODSB;以 DS,SI为指针取 1字符至 AL
MOV AH,0 ;向打印机送此字符
INT 17H
TEST AH,01H;打印机超时否?
JNZ EXIT;是, 结束程序
LOOP PRT2; CX减 1,不为 0再送下一字符
MOV AL,ODH;字符串打印完毕, 打印机回车换行
MOV AH,0
第 5章 输入输出和中断
INT 17H
MOV AL,0AH
MOV AH,0
INT 17H
MOV BH,0 ;读 0页光标当前位置
MOV AH,3
INT 10H
INC DH ;光标下移一行
MOV DL,0 ;并移至左端
返回本节
第 5章 输入输出和中断
【 例 5.13】 键盘输入 0~9间任一数,分别显示内定
的一串字符。
程序如下:
STACK SEGMENT PARA STACK
?STACK?
DB 256 DUP( 0)
STACK ENDS
DATA SEGMENT PARA PUBLIC
?DATA?
THIRTY DB 30
PARM DB 128 DUP( 0
第 5章 输入输出和中断
MSG0 DB ?I LIKE IBM PC………… ?
MSG1 DB ?8080 PROGRAMMING IS FUN………… ?
MSG2 DB ?TIME TO BUY MOUY DISKETTES…………?
MSG3 DB ?THIS PROGRAM WORKS………… ?
MSG4 DB ?TURN OFF THAT PRINTER! ………… ?
MSG5 DB ?I HAVE MORY ME MORY THEN
YOU ………… ?
MSG6 DB ?THE PSP CAN BE USEFUL………… ?
第 5章 输入输出和中断
MSG7 DB ?BASIC WAS EASIER THEN
THIS………… ?
MSG8 DB ?DOS IS INDISPENSABLE………
MSG9 DB ?LSAT MESSAGE OF THE DAY………… ?
ERRMSG DB ?ERROR!INVALID PARAMETER!!!?
DATA ENDS
CODE SEGMENT PARA PUBLIC ?CODE?
STARTPROC FAR
第 5章 输入输出和中断
ASSUME CS,CODE
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV ES,AX
ASSUME ES,DATA
MOV DS,AX
ASSUME DS,DATA
第 5章 输入输出和中断
MOV AH,0 ;功能号为 0
INT 16H ;键盘入, 字符在 AL
SUB AL,?0?;减去字符 ‘ 0?的 ASCII码
JC ERROR;键入字符编码小于 30H则转移
CMP AL,9;是 9吗?
JA ERROR;大于 9转移, 否则顺序
MOV BX,OFFSET MSG0 ; MSG0 位移送 BX
MUL THIRTY;键入字符之二进制数 30
ADD BX,AX;计算输出信息在表中位移
第 5章 输入输出和中断
CALL DISPLAY ;转子显示信息
RET ;返回
ERROR,MOV BX,OFFSET ERRMSG;出
错显示信息位移送 BX
CALL DISPLAY;转子显示信息
RET;返回
DISPLAY PROC NEAR
MOV CX,30 ;显示的字符总数
DISP,MOV AL,[BX];取字符送 AL
CALL DISPCHAR;转子显示字符
第 5章 输入输出和中断
INC BX ;指向下一字符
LOOP DISP
MOV AL,0DH ;回车符送 AL
CALL DISPCHAR ;转子显示
MOV AL,0AH ;换行符送 AL
CALL DISPCHAR ;显示
RET ;返回
DISPLAY ENDP
DISPCHAR PROC NEAR
第 5章 输入输出和中断
PUSH BX ;保护 BX
MOV BX,0 ; 0送 BX
MOV AH,14 ;功能调用输出字符
POP BX ;恢复 BX
RET ;返回
DISPCHAR ENDP
START ENDP
CODEENDS
END START
返回本节
第 5章 输入输出和中断
【 例 5.14】 在屏幕上显示包括隐含文件在内的所
有文件目录
程序如下:
STACK SEGMENT PARA STACK ?STACK?
DB 256 DUP( 0) ; ; 256个字节栈
STACK ENDS
DATA SEGMENT PARA PUBLIC ?DATA?
DIRECTORY DB 3584 DUP( 0) ;存放盘目录区域
NAME COUNT DB 0;文件名计数
ERRMSG DB ?DISK ACCESS ERROR!!!?
第 5章 输入输出和中断
DATA ENDS
CODE SEGMENT PARA PUBLIC ?CODE?
START PROC FAR
ASSUME CS,CODE
PUSH DS ;保留 PSP段址
MOV AX,0
PUSH AX ;保留返回地址偏移
MOV AX,DATA
MOV DS,AX ;建立数据段可寻址性
ASSUME DS,DATA
第 5章 输入输出和中断
MOV ES,AX;建立特别段可寻址性
ASSUME ES,DATA
MOV CX,3 ;读盘次数
RETRY,PUSH CX ;保留再试计
MOV BX,OFFSET DIRECTORY ;指向内
存目录存放区
MOV DL,0 ;驱动器号 A
MOV DH,0 ;盘的 0面
MOV CH,0 ; 0道
MOV CL,6 ; 6个扇区
第 5章 输入输出和中断
MOV AL,7 ;从第 7扇区开始
MOV AH,2 ;读盘功能号
INT 13H ; BIOS 读盘
POP CX ;恢复计数值
JNC READOK; CF=0读盘成功转 READOK
MOV AH,0 ; CF=1置 AH=0
INT 13H ;复位磁盘 BIOS调用
LOOP RETRY;不够三次转 RETRY再试
ERROR,MOV BX,OFFSET ERRMSG;够三
次不成功取出错信息位移
第 5章 输入输出和中断
CALL DISPLAY;转子显示错信息
RET;返回
READOK,MOV CX,112 ;双面双密软盘目录数
NEXT,CMP BYTE PTR[BX],0E5H;是空目录标志 E5H吗
JZ EMPTY;是转
PUSH BX ;不是保护 BX
MOV DL,8 ;文件名主名长度
PNAME,MOV AL,[BX] ;取文件名字符
CALL DISPCHAR ;显示
第 5章 输入输出和中断
INC BX ;下一字符
DEC DL;字符数减 1
JNZ PNAME ;不够 8个转 PNAME,够顺序执行
MOV AL,?.?
CALL DISPCHAR ;显示主名与扩展名之间的分隔符 ’,?
MOV DL,3 ;扩展名长度
ENAME,MOV AL,[BX] ;取扩展名字符
CALL DISPCHAR ;显示
INC BX
第 5章 输入输出和中断
DEC DL
JNZ ENAME
POP BX ;恢复 BX
MOV DL,8 ;空格数
BLANK,MOV AL,??
CALL DISPCHAR ;显示文件名间的
DEC DL ; 8个空格
JNZ BLANK
INC NAMECOUNT ;文件名计数增 1
CMP NAMECOUNT,92 ;满屏吗?
第 5章 输入输出和中断
JNZ EMPTY ;若不,转
MOV AH,0 ;读键盘功能号
INT 16H ; BIOS键盘入,用户击键后继续
MOV NAMECOUNT,0 ;复原计数初值
EMPTY,ADD BX,32 ;指向下一目录项,每项 32个字节
LOOP NEXT ;不够 112个转, 够顺序执行
RET ;返回 DOS
DISPLAY PROC NEAR ;显示信息子程序
MOV CX,30 ;显示字符数
DISP1,MOV AL,[BX] ;取字符
第 5章 输入输出和中断
CALL DISPCHAR ;转子显示
INC BX
LOOP DISP1 ;做 30次
MOV AL,0DH ;回车
CALL DISPCHAR
MOV AL,0AH ;换行
CALL DISPCHAR
RET ;返回
DISPLAY ENDP
DISPCHAR PROC NEAR ;显示字符子程序
第 5章 输入输出和中断
PUSH BX ;保护 BX
MOV BX,0
MOV AH,14 ;写功能号
INT 10H ; BIOS 视频功能调用
POP BX ;恢复 BX
RET ;返回
DISPCHAR ENDP
START ENDP
CODEENDS
END START
返回本节
第 5章 输入输出和中断
【 例 5.15】 采用直接对显示卡的寄存器和显示缓冲
区编程的方法,在 VGA图形模式 13H(即 320× 200,
256色)下作图,画一条彩色的线。
DATA SEGMENT
SCR-LINE DW 0
SCR-COL DW 0
CUR-COLOR DD 0h
DATA ENDS
CODESEGMENT
ASSUME CS,CODE,DS,DATA
MAIN PROC FAR
第 5章 输入输出和中断
STAR,PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV AH,0
MOV AL,13H
INT 10H ;设置为模式 13H
AGAIN,MOV BL,CUR-COLOR
MOV DX,SCR-COL ; DX为像素点的 y坐标
第 5章 输入输出和中断
MOV CX,SCR-LINE ; CX为像素点的 x坐标
CALL DRAW-POINT ;在 ( x,y) 处画点
MOV DX,SCR-COL
MOV CX,SCR-LINE
CALL READ-POINT ;将 ( x,y) 处像素值读出
MOV DX,SCR-COL
MOV CX,SCR-LINE
ADD DX,4 ; x+4为新点的 x坐标
CALL DRAW-POINT ;在 ( x+4,y) 处画点
INC SCR-LINE ;指向下一行
第 5章 输入输出和中断
INC SCR-COL ;指向右边的下一个点
INC CUR-COLOR ;指向下一种颜色
CMP SCR-LINE,200 ; 200列做完了吗?
JE ENDLINE ;做完了, 结束
JMP AGAIN ;没做完则重复
ENDLINE,RET
MAIN ENDP
DRAW-POINT PROC NEAR
PUSH ES
CALL GET-ADDR ;计算偏移量, 存在 DI中
第 5章 输入输出和中断
MOV DX,0A000H ;显示缓冲区首址的段地址
MOV ES,DX
MOV DX,3CDH
MOV AL,01000000B
OUT DX,AL ;设显示缓冲区为线性内存结构
MOV ES,[DI],BL ;往显示缓冲区写数据
POP ES
RET
DRAW-POINT ENDP
READ-POINT PROC NEAR
第 5章 输入输出和中断
PUSH ES
CALL GET-ADDR ;计算偏移量, 存在 DI中
MOV DX,0A000H
MOV ES,DX;设显示缓冲区首址的段地址
MOV DX,3CDH
MOV AL,01000000B
OUT DX,AL;设显示缓冲区为线性内存结构
MOV BL,ES,[DI] ;从显示缓冲区读值
POP ES
RET
第 5章 输入输出和中断
READ-LINT ENDP
GET-ADDR PROC NEAR
PUSH AX
PUSH DX
MOV AX,320 ;每行 320个点
MUL CX ;乘以行号即 y× 320
POP DX
ADD AX,2X;即计算地址偏移量为 y× 320+x
MOV DI,AX ;偏移量送 DI
POP AX
第 5章 输入输出和中断
RET
GET-ADDR ENDP
CODE ENDS
END STAR
MOV AH,2
INT 10H
JMP PRT1 ;再输入, 再打印
EXIT,RET PRNTY ENDP
CODE ENDS
END PRNTYP
返回本节