第一章 基础知识第八章 输入与输出程序设计第八章 输入与输出程序设计第一章 基础知识第八章 输入与输出程序设计第一章 基础知识第八章 输入与输出程序设计第一节,I/ O设备的数据传送方式输入输出设备都通过一个硬件接口或控制器和 CPU相连。例如软磁盘通过软盘控制器和 CPU连接起来;终端显示器通过数据接口和 CPU连接起来。这些接口和控制器都能支持输入输出 IN,OUT与外部设备交换信息。这些信息 包括控制、状态和数据 三种不同性质的信息,它们必须按不同的端口地址分别传送。
控制信息输出到 I/ O接口,告诉接口和设备要做什么工作状态信息 的读取,表示 I/O设备当前的状态数据信息的传输,是 I/ O设备和 CPU真正要交换的信息。
常用的输入/输出方式,
1、查询输入输出; 2、中断输入输出 ; 3,DMA方式
DMA方式,也称为成组数据传送方式。主要适用于 — 些高速的 I/ O设备,如磁带、磁盘、模数转换器等设备。 DMA方式能使 I/ O设备直接和存储器进行成批数据的快速传送。每个字节一到达端口,就直接从接口送到存储器,同样,
接口和它的 DMA控制器也能直接从存储器取出字节并把它送到 I/ O设备中去。
第一章 基础知识第八章 输入与输出程序设计第一章 基础知识第八章 输入与输出程序设计第二节,程序直接控制 I/ O方式
I/ O端口的地址编码,计算机的外部设备和大容量存储设备都是通过接口连接到系统上,每个端口由一组寄存器组成,这些寄存器都分配有一个地址编码,
该编码称为 I/ O端口的地址编码 。 计算机的 CPU和内存就是通过这些端口和外部设备进行通讯的。
I/ O接口中有用作数据缓冲的 数据寄存器,有用做保存设备和接口的状态信息,供 CPU对外设进行测试的 状态寄存器 ;还有用来保存 CPU发出的命令以控制接口和设备的操作的命令寄存器 。它们都分配有各自的端口号,CPU就是通过不同的端口号来选择外部设备的第一章 基础知识第八章 输入与输出程序设计端口数量:
在 IBM PC中,1M空间的低 16位地址线有效,因此这个 I/O空间允许设置
64K (65536) 个 8位端口或 32K(32768)个 16位端口 。
PC机的部分端口地址 (16进制 )
第一章 基础知识第八章 输入与输出程序设计一,I/O指令
PC机的 I/ O指令 IN和 OUT,这两条指令既可以传送字节也可以传送字,并且都有直接端口寻址和间接端口寻址两种方式。 如下所示:
直接端口寻址方式,端口地址 PORT是一个 8位的立即数,其范围是 0一 255。
间接寻址方式,端口地址在 DX中,其范围为 0一 65535 。
另外要注意的是,I/O指令中使用的寄存器必须是 AL或 AX。
第一章 基础知识第八章 输入与输出程序设计用 IN指令可以从一个数据寄存器输入数据或从状态寄存器输入接口和外没的状态。
例如 下面两条指令能把一个字从端口地址 0028和 0029传送到存储器的
DATA_WORD单元中。
例 测试某状态寄存器 (端口地址为 27H)的第 2位是否为 1,若为 1,则转移到 ERROR进行处理。
OUT指令用来输出数据或给一个指定的 I/ O端口传送命令信息。
例 某接口的命令寄存器 (端口地址为 126H)
的第 7位控制成组数据传送 。
注意,DOS功能调用或 BIOS例行程序,
其例行程序本身也是用 IN和 OUT指令与外部设备进行数据交换的。
第一章 基础知识第八章 输入与输出程序设计二,I/O直接数据传输举例例 SOUND程序 (发声程序)
基本原理:
程序通过 I/ O指令使设备控制寄存器 (I/ O端口地址为 61H)的第 1位交替为 0和 l,
而端口 6lH的第 1位和扬声器的脉冲门相连,当第 1位由 0变为 1,延迟一会又由 0变为 1时,
脉冲门就先打开后关闭,产生了一个脉冲电流。这个脉冲电流被放大后送到扬声器使之发出了声音。 61H端口的第 0位和一个振荡器 (2号定时器 )相连,现在不用振荡器产生声音,所以把第 0位置零。
第一章 基础知识第八章 输入与输出程序设计程序,soundprogram segment assume cs:soundprogram
main proc far
start:
mov bx,0f350h
mov dx,2300h
in al,61h
mov ah,al
and al,11111100b;关断定时器通道 2的门控
sound,xor al,2;触发 61H端口第 1位
out 61h,al
mov cx,dx;(dx)=控制脉宽的计数值
wait1,loop wait1;延时循环
dec bx; (bx)=脉冲持续的时间
jnz sound
mov al,ah
out 61h,al;恢复 61H端口
mov ax,4c00h
int 21h
main endp
soundprogram ends
end start
第一章 基础知识第八章 输入与输出程序设计例 COMM程序基本原理这是一个关于 INS8250串行通讯口 I/ O的例子。它的数据寄存器的端口地址是
03F8H,状态寄存器的端口地址是 03FDH。其中 0位是输入数据准备位,5位是输出数据准备位。下列是串行口输入输出程序。
输出子过程:读取子过程:
第一章 基础知识第八章 输入与输出程序设计以上 CPU与外部设备交换信息的方式称为查询方式或等待方式 。
造成 CPU必须查询等待的主要原因是许多外设的工作速度比较低,如磁盘,打印机等,它们通过按键或打印头的机械动作输入或输出一个数据,其速度是很慢的,而 OUT执行指令的速度是它的几千倍乃至上万倍,所以则在接收或发送数据之前必须要了解外设的状态,看外设是否已经准备好 。 当外没还没有准备好以前,
CPU就要等待,不能做别的操作 。 为了提高 CPU的工作效率,我们可采用中断方式传送数据 。 关于中断,我们将在下一节中做详细介绍 。
第一章 基础知识第八章 输入与输出程序设计第三节:中断传送方式什么是中断,中断是一种使 CPU中止正在执行的程序而转去处理特殊事件的操作。
什么是中断源,引起中断的事件 。
中断的优点,避免因反复查询外部设备的状态而浪费时问,从而提高了 CPU的效率。
外中断,由外设控制器或协处理器( 8087/80287)引起的中断一般称为外中断 。
内中断,中断指令 INT产生的中断,或由 CPU的某些错误结果产生的中断称为内中断
8086/ 8088的中断源如下图所示,
第一章 基础知识第八章 输入与输出程序设计第一章 基础知识第八章 输入与输出程序设计非屏蔽中断,是为电源错、内存或 I/ O总线的奇偶错等异常事件的中断保留的。
外部设备的中断 是通过 Inter 8259A可编程中断控制器 (PIC)连到主机上。 CPU通过一组 I/
O端口控制 8259A,而 8259A则 通过 INTR管脚给 CPU传送中断信号 。这种外中断类型的分配由硬件连线实现.
中断 20H到 3FH用于调用 DOS功能例行程序,其它中断号小于 20H或大于 3FH的中断,
用于调用 IBM PC ROM BIOS或一些应用软件一,中断向量表我们给每种中断都安排一个中断类型号。 IBM PC中断系统能处理 256
种类型的中断,类型号为 0— 0FFH。
每种类型的中断都由相应的中断处理程序来处理,中断向量表 就是各中断类型的处理程序的地址表。如左图所示:
第一章 基础知识第八章 输入与输出程序设计存储器的低 1.5K字节,地址从 0到 5FFH为系统占用,其中最低 1K字节,地址从 0到 3FFH存放中断向量。中断向量表中的 256项中断向量对应 256种中断类型,每项占用四个字节,其中两个字节存放中断处理程序的段地址( 16位),
另两个字节存放偏移地址 (16位 )。因为各处理程序的段地址和偏移地址在中断向量表中按中断类型号顺序存放,所以每类中断向量的地址可由中断类型乘以
4计算出来。例如,报警中断的中断类型为 4AH,它的中断向量地址为 4AH× 4
= 128H,即 128H,129H两字节存放的是报警中断处理程序的偏移地址,12AH,
l2BH两字节存放的是报警中断处理程序的段地址,取出段地址和偏移地址。
CPU就可转入中断处理程序。
中断操作的 5个步骤,
(1)取中断类型号
(2)计算中断向量地址
(3)取中断向量,偏移地址送 IP,段地址送 CS
(4)转入中断处理程序
(5)中断返回到 INT指令的下一条指令第一章 基础知识第八章 输入与输出程序设计第一章 基础知识第八章 输入与输出程序设计二,设量中断向量下表列出了 IBM PC各类中断的地址分配:
用户可以利用保留的中断类型号扩充自己需要的中断功能,对新增加的中断功能要在中断向量表中建立相应的中断向量。
第一章 基础知识第八章 输入与输出程序设计指令来为中断类型 N设置中断向量:;段地址为 0;设置偏移地址;要设置的中断子过程;设置新中断向量(地址)
注意:如果新的中断功能只供自己使用,或用自己编写的中断处理程序代替系统中的中断处理功能时,要注意保存原中断向量,在设置自己的中断向量时,应先保存原中断向量再设置新的中断向量,在程序结束之前恢复原中断向量。
第一章 基础知识第八章 输入与输出程序设计在实际编程过程中,在检查或设置任何中断向量时,总是避免直接使用中断向量的绝对地址,而是使用 DOS功能调用 (21H)存取中断向量。
第一章 基础知识第八章 输入与输出程序设计三,中断过程当今断发生时,由硬件自动完成下列动作:
1,取中断类型号 N
2,标志寄存器 ( PSW) 内容入栈
3,当前代码段寄存器 (cs)内容入栈
4,当前指令计数器 (IP)内容入栈
5,禁止外部中断和单步中断 (IF= 0,TF= 0)
6,从中断向量表中取 4× N的字节内容送 IP,取 4× N+2的字节内容送 CS。
转中断处理程序中断发生的过程很象我们所熟悉的子程序调用,不同的是在保护中断现场时,除了保存返回地址 CS,IP之外,还保存了标志寄存器 PSW的内容。因为标志寄存器记录了中断发生时,程序指令运行的结果特征。当 CPU处理完中断请求返回原程序时,要保证原程序工作的连续性和正确性。所以中断发生时,PSW的内容也要保存起来,另一个不同点是,在中断发生时,CPU还自动清除了 IF位和 TF位,这样设计的目的是使 CPU转入中断处理程序后,不允许再产生新的中断,如果在执行中断处理程序的过程中,还允许外部的中断,可以通过 STI指令再把 IF设置为 1。
第一章 基础知识第八章 输入与输出程序设计编写中断处理程序和编写子程序一样,所使用的汇编语言指令没有特殊限制,只是中断处理程序返回时使用 IRET指令 。这条指令的工作步骤相中断发生时的工作步骤正好相反。它首先把 IP,CS和 PWS的内容出栈,然后返回到中断发生时紧接着的下一条指令。
第一章 基础知识第八章 输入与输出程序设计四、内部 过程第一章 基础知识第八章 输入与输出程序设计五、外 过程外部中断主要有两种来源,一种 是非屏蔽中断 (NMl),另一种是来自各种外部设备的中断,由外部设备的请求引起的中断也称为 可屏蔽中断 。
但是从外设发出中断请求到 CPU响应中断,有两个控制条件是起决定作用,
一是该外设的中断请求是否屏蔽,一个是 CPU是否允许响应中断。 这两个条件分别由 8259A的中断屏蔽寄存器( IMR)和标志寄存器( PSW)中的中断允许位 IF控制。
中断屏蔽寄存器的 I/ O
端口地址是 21H,它的 8位对应控制 8个外部设备,如左图所示,
通过设置这个寄存器的某位为 0或为 1来允许或禁止某外部设备的中断。 某位为 0表示允许某种外设中断请求,
某位为 1表示某种外设的中断请求被屏蔽 (禁止 )。
第一章 基础知识第八章 输入与输出程序设计例如,只允许键盘中断,可设置如下中断屏蔽字:
如果系统中要新增设键盘中断,则可用下列指令实现:
注意,在编写中断程序时,应在主程序的初始化部分设置好中断屏蔽寄存器,以确定允许用中断方式工作的外部设备。外部设备向 CPU发出中断请求,CPU是否响应还与标志寄存器中的中断标志位 IF有关。 如果 IF = 0,CPU就禁止响应任何外设的中断 。
如果 IF= 1测允许 CPU响应外设的中断请求,有两条指令能设置或清除 IF位。
允许 CPU响应外设的中断请求 (IF= 1)也叫做 开中断,反之叫做 关中断 (1F= 0)。
第一章 基础知识第八章 输入与输出程序设计当任何类型的中断发生时,当前的 PSW要保存入栈,然后清除 IF位进入中断处理程序。如果允许在一个中断处理程序的执行过程中发生外中断,则必须用一条 STI指令开中断。当执行到中断返回指令 IRET,又取出 PSW先前的值,其中 IF为 1,CPU将允许外中断再次发生。
有一种特殊的外部中断和 IF标志位无关,这就是非屏蔽中断,非屏蔽中断的类型号为 2,CPU不能禁止非屏蔽中断,如果系统使用了这种类型的中断,那么 CPU总会响应的,
所以非屏蔽中断主要用于一些紧急的故障处理,如电源掉电等。另外计算机内部的实时钟希望能不停地计时,所以也可以把非屏蔽中断提供给实时钟。 。。
在一次外中断处理结束之前,还应给 8259A可编程中断控制器的中断命令寄存器发出中断结束命令 (EOI)。 中断命令寄存器的 I/ O端口地址为 20H,如下图所示 。
它的各控制位可动态地控制中断处理过程,其中 L2 - L0三位指定 IR0— IR7中具有 最低优先级 的中断请求 。 6位和 7位控制 IR 0一 IR 7的中断优先级的顺序 。 5位 (EOI)是中断结束位 。 当 EOI位为 1时,当前正在处理的中断请求就被清除,所以在中断处理完成后,必须把中断结束位置为 1,否则以后将屏蔽掉对同级中断或低级中断的处理 。 当然在必要的时候,在中断处理程序中也可利用 EOI命令清除当前的中断请求,使得在中断处理的过程中又能响应同级或低级中断 。 结束外中断用下面的指令:
第一章 基础知识第八章 输入与输出程序设计六,中断优先级和中断嵌套中断源事先安排一个中断优先级次序,当多个中断源同时申请中断时,CPU先比较它们的优先级,然后从优先级高到低的次序来依次处理各个中断源的中断请求。
IBMPC规定中断的优先级次序为:
可屏蔽中断的优先权又分为八级,在正常的优先级方式下,优先级次序是
8259A的中断命令寄存器的 6位和 7位能控制各中断请求端的优先级次序。在发出一个
EOI命令时,7位 (R)和 6位 (SL)有四种组合,其含义如下:
第一章 基础知识第八章 输入与输出程序设计外中断的优先级次序一般在正常优先级方式下( R= 0,SL= 0),但在必要的情况下,设置中断命令寄存器能改变 IR0— IR7的优先级次序。
例如,IR0— IR7原为正常的优先级次序,现在要使 IR4成为最低级的中断请求,
则给端口 21H送命令码,11100100.即 R= l,SL= 1,EOI= 1,L2L1L0= 100,
这样,各中断优先级就依次右循环到 IR4为最低优先级的位置上:
如果再送一个命令码,10100000,则优先级次序再向左循环一个位置,成为正在运行的中断处理程序,又被其它中断源中断,这种情况叫做 中断嵌套 。
IBMPC机没有规定中断嵌套的深度 (中断程序又被中断的层次 ),但在实际使用时,多重的中断嵌套要受到堆栈容量的限制,所以在编写中断程序时,一定要考虑有足够的堆栈单元来保存多次中断的断点及各寄存器的内容。
第一章 基础知识第八章 输入与输出程序设计注意,一个正在执行的中断处理程序,在开中断 (IF= 1)的情况下,能被优先级高于它的中断源中断,但如果要被同级或低级的中断源中断,则必须发出 EOI命令,清除正在执行的中断请求,才能响应同级或低级的中断。
假定在主程序的执行过程中,IR2和 IR4的中断请求同时发生,而后 IR1的中断请求又到达,最后 IR3的中断请求也到达 。 中断执行次序如下:
首先,CPU响应优先级高的 IR2.转去执行 IR2的中断处理程序。进入 IR2处理程序后,IF被置为 1。当
IRl的中断请求到达后,因
IRl的优先级高于 IR2,
CPU就立即中断 IR2的程序,
转去执行 IRl的处理程序。
在 IR1处理程序中 CPU指令发出了 EOI命令,结束了 IR1的中断请求。返回 IR2处理程序后,
同样由于发出 EOI命令清除了 IR2的中断请求,所以在较低级的中断请求 ER4到达后,即转向处理 IR4的中断请求。在 IR4处理程序的执行过程中,IR3的中断请求到达,当判断 IF
已被置为 1,则又中断了 IR4的程序,转去执行 IR3的程序。在 IR3程序中,也发出了开中断指令 (STI)和中断结束命令 (EOI),最后 IRET指令使其返回到 IR4程序,IR4在返回 IR2
之前也发出了 EOI命令,结束了 IR4的中断请求。 IR2中断请求在前面已被清除,所以 IR4
执行完后,IR2继续执行直到返回主程序。
第一章 基础知识第八章 输入与输出程序设计七,中断处理程序对于外部中断过程,主程序为中断所做的准备工作和硬件 (包括 CPU和外设接口 )自动完成的动作,
对一般指令,只要一条指令的 执行周期结束 即可响应中断。对以下指令特殊控制:
1,对加重复前缀的串指令 (如 REP MOVSB)要作为一条指令处理,但不是把串操作全部重复执行完,而是执行一次重复后,串指令即可响应中断。 2,对于 MOV指令和 POP指令,
如果处理对象为段寄存器时,那么本指令执行完后,执行完下一条执行才能响应中断请求。 3,对于开中断指令 STI和中断返回指令,也要在这些指令执行完后,再执行一条指令才响应中断。
第一章 基础知识第八章 输入与输出程序设计中断处理子程序的步骤,
(1)保存寄存器内容
(2)如允许中断嵌套,则开中断 (STI)
(3)处理中断
(4)关中断
(5)送中断结束命令 (EOI)给中断命令寄存器
(6)恢复寄存器内容
(7)返回被中断的程序 (IRET)
八,中断处理程序举例例 编写一个中断处理程序,要求在主程序运行的过程中,每隔 10秒钟响铃一次,同时在屏幕上显示出信息,The bell is ring”,连续响 5次退出。
原理,在系统定时器 (中断类型为 8)的中断处理程序中,有一条中断指令 INT 1CH,时钟中断每发生一次 (约每秒中断 l8,2次 ),都要调用一次中断类型 1CH的处理程序。在
ROM BIOS中,1CH的处理程序只有一条 IRET指令,实际上它并没有做任何工作,只是为用户提供了一个中断类型号。如果用户有某种定时周期性的工作需要完成,就可利用系统定时器的中断间隔,用自己设计的处理程序来代替原有的 1C程序。
第一章 基础知识第八章 输入与输出程序设计程序,dseg segmentcount dw 5 ;控制连续响铃 5次
mess db 'the bell is ring',0dh,0ah,'$' ;在屏幕上显示的字符串
dseg ends
cseg segment
assume cs:cseg,ds:dseg
main proc far
start:
mov ax,dseg
mov ds,ax
mov al,1ch ;保存 1Ch原中断向量进入堆栈中
mov ah,35h
int 21h
push es
push bx
push ds;把响铃过程设置为 1Ch中断向量
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 ;允许 CPU响应中断
mov di,20000 ;主过程的时间延迟,以便在该时间延迟内进行定时中断处理
delay1:
mov si,30000
delay2:
dec si
jnz delay2
cmp di,0
jz exit
dec di
jnz delay1
pop dx;恢复原来的中断向量
pop ds
mov al,1ch
mov ah,25h
int 21h
mov ax,4c00h
int 21h
main endp
第一章 基础知识第八章 输入与输出程序设计
ring proc near
push ds;保存寄存器内容
push ax
push cx
push dx
mov ax,dseg
mov ds,ax
sti;允许 CPU响应中断
cmp count,0
jz exit
dec count
mov dx,offset mess;显示字符串信息,字符串必须以 ’ $’结束
mov ah,09h
int 21h
mov dx,100;发声控制
in al,61h
and al,11111100b
sound:
xor al,02h
out 61h,al
第一章 基础知识第八章 输入与输出程序设计
mov cx,1400
wait1:
loop wait1
dec dx
jnz sound
exit:
cli
pop dx
pop cx
pop ax
pop ds
iret
ring endp
cseg ends
end start
IBM PC系列计算机的键盘是一个智能键盘,键盘内有一片 Intel
8048(或 8049)单片机(处理器),负责对整个键盘上的字符键、
功能键、控制键和组合键进行管理。
键盘 I/O
敲键
8048 向 8259A发出 IRQ1中断请求将所敲键的扫描码送 8255 60H端口
( IF=1)主机响应 IRQ1
调用 09中断类型服务程序,从 8255 60H
端口 接收扫描码 并转换为 ASCII码键盘缓冲区键盘中断响应流程用户程序利用 DOS功能调用
BIOS中断调用当在键盘上,按下,或,放开,一个键时,如果这时允许键盘发出中断请求并且 IF=1,就会产生 09H类型的硬件中断,
CPU将执行 INT 09H指令,转入 BIOS键盘中断服务程序处理用户的键盘输入 。
扫描码和 ASCII码
60H输入端口:
D7=1 按键已 放开,称为 断码
D7=0 键已 按下,称为 通码,D6-D0位 是按键的 扫描码 。
键盘上的每一个键都对应 惟一的扫描码,扫描码与键盘按键对应关系如表 5-5所示。
BIOS和 DOS键盘中断功能
BIOS中断调用( INT 16H)和 DOS系统调用( INT 21H)
都提供了键盘中断功能,从键盘缓冲区获取键入字符的扫描码或 ASCII码返回给用户应用程序。
第一章 基础知识第八章 输入与输出程序设计例 要求改变键盘中断向量,实现下列目的:
( 1) 从键盘上接收扫描码,并在屏幕上显示扫描码的十六进制;
( 2) 将扫描码存入缓冲区内,在有限时间内,当缓冲区满时,给出 buffer
overflow信息,当缓冲区不满时,给出 buffer not overflow信息,
( 3) 缓冲区的大小为 16字节 。
dseg segment
addr_point dw?
count dw?
buffer db 0fh dup(' ')
prompt db 'please enter the character,'
db 0dh,0ah,'$'
message db 'buffer overflow',0dh,0ah,'$'
messageb db 'buffer not overflow',0dh,0ah,'$'
save_ip9 dw?
save_cs9 dw?
dseg ends
cseg segment
assume cs:cseg,ds:dseg
第一章 基础知识第八章 输入与输出程序设计
main proc far
start:
mov ax,dseg
mov ds,ax
mov ax,offset buffer ;初始化缓冲区地址和缓冲区字符数量
mov addr_point,ax
mov count,0;********
mov al,09h ;保存 9h的中断向量
mov ah,35h
int 21h
mov save_ip9,bx
mov save_cs9,es
mov dx,offset kbint ;把过程 kbint地址设置成 09h的中断向量
push ds
mov ax,seg kbint
mov ds,ax
mov al,09h
mov ah,25h
int 21h
pop ds
第一章 基础知识第八章 输入与输出程序设计
in al,21h ;允许键盘中断
and al,0fdh
out 21h,al
mov ah,09h ; 屏幕上显示提示信息
lea dx,prompt
int 21h;*******
sti ;允许 CPU响应外部中断;*******
mov di,0f000h ;主过程等待键盘的输入和打印机的输出
mainp:
mov si,0f000h
mainp1:
dec si
jnz mainp1
dec di
jnz mainp;******
mov ah,02h ;屏幕上显示字符 $表示主程序结束
mov dl,'$'
int 21h
第一章 基础知识第八章 输入与输出程序设计;******
cli ;禁止许 CPU响应外部中;******
push ds ;恢复 09h中断向量
mov dx,save_ip9
mov ax,save_cs9
mov ds,ax
mov al,09h
mov ah,25h
int 21h
pop ds
cmp count,16
jnz ov
mov ah,09h ; 屏幕上显示提示信息
lea dx,message
int 21h
jmp endd
ov:
mov ah,09h ; 屏幕上显示提示信息
lea dx,messageb
int 21h
第一章 基础知识第八章 输入与输出程序设计
endd:
in al,21h ;允许键盘中断
and al,0fdh
out 21h,al;******
sti ;允许 CPU响应外部中
mov ax,4c00h
int 21h
main endp;--------------------------------------------------------------
kbint proc near
push ax
push bx
in al,60h
test al,80h ;测试按键还是释放键,参见课本 p231页
jnz cont
cmp count,16
jz cont
第一章 基础知识第八章 输入与输出程序设计
mov bx,addr_point
mov [bx],al
call disp
inc bx
inc count
mov addr_point,bx
cont:
cli
mov al,20h ;结束外中断
out 20h,al
pop ax
pop bx
iret
kbint endp;-------------------------------------------------------
disp proc near
push ax
push bx
push dx
第一章 基础知识第八章 输入与输出程序设计
mov ch,2
mov cl,4
nestb:
rol al,cl
push ax
mov dl,al
and dl,0fh
or dl,30h
cmp dl,3ah
jl dispit
add dl,7h
dispit:
mov ah,2
int 21h
pop ax
dec ch
jnz nestb
mov ah,2
mov dl,','
int 21h
pop dx
pop bx
pop ax
ret
disp endp;---------------------------------------------------------
cseg ends
end start
控制信息输出到 I/ O接口,告诉接口和设备要做什么工作状态信息 的读取,表示 I/O设备当前的状态数据信息的传输,是 I/ O设备和 CPU真正要交换的信息。
常用的输入/输出方式,
1、查询输入输出; 2、中断输入输出 ; 3,DMA方式
DMA方式,也称为成组数据传送方式。主要适用于 — 些高速的 I/ O设备,如磁带、磁盘、模数转换器等设备。 DMA方式能使 I/ O设备直接和存储器进行成批数据的快速传送。每个字节一到达端口,就直接从接口送到存储器,同样,
接口和它的 DMA控制器也能直接从存储器取出字节并把它送到 I/ O设备中去。
第一章 基础知识第八章 输入与输出程序设计第一章 基础知识第八章 输入与输出程序设计第二节,程序直接控制 I/ O方式
I/ O端口的地址编码,计算机的外部设备和大容量存储设备都是通过接口连接到系统上,每个端口由一组寄存器组成,这些寄存器都分配有一个地址编码,
该编码称为 I/ O端口的地址编码 。 计算机的 CPU和内存就是通过这些端口和外部设备进行通讯的。
I/ O接口中有用作数据缓冲的 数据寄存器,有用做保存设备和接口的状态信息,供 CPU对外设进行测试的 状态寄存器 ;还有用来保存 CPU发出的命令以控制接口和设备的操作的命令寄存器 。它们都分配有各自的端口号,CPU就是通过不同的端口号来选择外部设备的第一章 基础知识第八章 输入与输出程序设计端口数量:
在 IBM PC中,1M空间的低 16位地址线有效,因此这个 I/O空间允许设置
64K (65536) 个 8位端口或 32K(32768)个 16位端口 。
PC机的部分端口地址 (16进制 )
第一章 基础知识第八章 输入与输出程序设计一,I/O指令
PC机的 I/ O指令 IN和 OUT,这两条指令既可以传送字节也可以传送字,并且都有直接端口寻址和间接端口寻址两种方式。 如下所示:
直接端口寻址方式,端口地址 PORT是一个 8位的立即数,其范围是 0一 255。
间接寻址方式,端口地址在 DX中,其范围为 0一 65535 。
另外要注意的是,I/O指令中使用的寄存器必须是 AL或 AX。
第一章 基础知识第八章 输入与输出程序设计用 IN指令可以从一个数据寄存器输入数据或从状态寄存器输入接口和外没的状态。
例如 下面两条指令能把一个字从端口地址 0028和 0029传送到存储器的
DATA_WORD单元中。
例 测试某状态寄存器 (端口地址为 27H)的第 2位是否为 1,若为 1,则转移到 ERROR进行处理。
OUT指令用来输出数据或给一个指定的 I/ O端口传送命令信息。
例 某接口的命令寄存器 (端口地址为 126H)
的第 7位控制成组数据传送 。
注意,DOS功能调用或 BIOS例行程序,
其例行程序本身也是用 IN和 OUT指令与外部设备进行数据交换的。
第一章 基础知识第八章 输入与输出程序设计二,I/O直接数据传输举例例 SOUND程序 (发声程序)
基本原理:
程序通过 I/ O指令使设备控制寄存器 (I/ O端口地址为 61H)的第 1位交替为 0和 l,
而端口 6lH的第 1位和扬声器的脉冲门相连,当第 1位由 0变为 1,延迟一会又由 0变为 1时,
脉冲门就先打开后关闭,产生了一个脉冲电流。这个脉冲电流被放大后送到扬声器使之发出了声音。 61H端口的第 0位和一个振荡器 (2号定时器 )相连,现在不用振荡器产生声音,所以把第 0位置零。
第一章 基础知识第八章 输入与输出程序设计程序,soundprogram segment assume cs:soundprogram
main proc far
start:
mov bx,0f350h
mov dx,2300h
in al,61h
mov ah,al
and al,11111100b;关断定时器通道 2的门控
sound,xor al,2;触发 61H端口第 1位
out 61h,al
mov cx,dx;(dx)=控制脉宽的计数值
wait1,loop wait1;延时循环
dec bx; (bx)=脉冲持续的时间
jnz sound
mov al,ah
out 61h,al;恢复 61H端口
mov ax,4c00h
int 21h
main endp
soundprogram ends
end start
第一章 基础知识第八章 输入与输出程序设计例 COMM程序基本原理这是一个关于 INS8250串行通讯口 I/ O的例子。它的数据寄存器的端口地址是
03F8H,状态寄存器的端口地址是 03FDH。其中 0位是输入数据准备位,5位是输出数据准备位。下列是串行口输入输出程序。
输出子过程:读取子过程:
第一章 基础知识第八章 输入与输出程序设计以上 CPU与外部设备交换信息的方式称为查询方式或等待方式 。
造成 CPU必须查询等待的主要原因是许多外设的工作速度比较低,如磁盘,打印机等,它们通过按键或打印头的机械动作输入或输出一个数据,其速度是很慢的,而 OUT执行指令的速度是它的几千倍乃至上万倍,所以则在接收或发送数据之前必须要了解外设的状态,看外设是否已经准备好 。 当外没还没有准备好以前,
CPU就要等待,不能做别的操作 。 为了提高 CPU的工作效率,我们可采用中断方式传送数据 。 关于中断,我们将在下一节中做详细介绍 。
第一章 基础知识第八章 输入与输出程序设计第三节:中断传送方式什么是中断,中断是一种使 CPU中止正在执行的程序而转去处理特殊事件的操作。
什么是中断源,引起中断的事件 。
中断的优点,避免因反复查询外部设备的状态而浪费时问,从而提高了 CPU的效率。
外中断,由外设控制器或协处理器( 8087/80287)引起的中断一般称为外中断 。
内中断,中断指令 INT产生的中断,或由 CPU的某些错误结果产生的中断称为内中断
8086/ 8088的中断源如下图所示,
第一章 基础知识第八章 输入与输出程序设计第一章 基础知识第八章 输入与输出程序设计非屏蔽中断,是为电源错、内存或 I/ O总线的奇偶错等异常事件的中断保留的。
外部设备的中断 是通过 Inter 8259A可编程中断控制器 (PIC)连到主机上。 CPU通过一组 I/
O端口控制 8259A,而 8259A则 通过 INTR管脚给 CPU传送中断信号 。这种外中断类型的分配由硬件连线实现.
中断 20H到 3FH用于调用 DOS功能例行程序,其它中断号小于 20H或大于 3FH的中断,
用于调用 IBM PC ROM BIOS或一些应用软件一,中断向量表我们给每种中断都安排一个中断类型号。 IBM PC中断系统能处理 256
种类型的中断,类型号为 0— 0FFH。
每种类型的中断都由相应的中断处理程序来处理,中断向量表 就是各中断类型的处理程序的地址表。如左图所示:
第一章 基础知识第八章 输入与输出程序设计存储器的低 1.5K字节,地址从 0到 5FFH为系统占用,其中最低 1K字节,地址从 0到 3FFH存放中断向量。中断向量表中的 256项中断向量对应 256种中断类型,每项占用四个字节,其中两个字节存放中断处理程序的段地址( 16位),
另两个字节存放偏移地址 (16位 )。因为各处理程序的段地址和偏移地址在中断向量表中按中断类型号顺序存放,所以每类中断向量的地址可由中断类型乘以
4计算出来。例如,报警中断的中断类型为 4AH,它的中断向量地址为 4AH× 4
= 128H,即 128H,129H两字节存放的是报警中断处理程序的偏移地址,12AH,
l2BH两字节存放的是报警中断处理程序的段地址,取出段地址和偏移地址。
CPU就可转入中断处理程序。
中断操作的 5个步骤,
(1)取中断类型号
(2)计算中断向量地址
(3)取中断向量,偏移地址送 IP,段地址送 CS
(4)转入中断处理程序
(5)中断返回到 INT指令的下一条指令第一章 基础知识第八章 输入与输出程序设计第一章 基础知识第八章 输入与输出程序设计二,设量中断向量下表列出了 IBM PC各类中断的地址分配:
用户可以利用保留的中断类型号扩充自己需要的中断功能,对新增加的中断功能要在中断向量表中建立相应的中断向量。
第一章 基础知识第八章 输入与输出程序设计指令来为中断类型 N设置中断向量:;段地址为 0;设置偏移地址;要设置的中断子过程;设置新中断向量(地址)
注意:如果新的中断功能只供自己使用,或用自己编写的中断处理程序代替系统中的中断处理功能时,要注意保存原中断向量,在设置自己的中断向量时,应先保存原中断向量再设置新的中断向量,在程序结束之前恢复原中断向量。
第一章 基础知识第八章 输入与输出程序设计在实际编程过程中,在检查或设置任何中断向量时,总是避免直接使用中断向量的绝对地址,而是使用 DOS功能调用 (21H)存取中断向量。
第一章 基础知识第八章 输入与输出程序设计三,中断过程当今断发生时,由硬件自动完成下列动作:
1,取中断类型号 N
2,标志寄存器 ( PSW) 内容入栈
3,当前代码段寄存器 (cs)内容入栈
4,当前指令计数器 (IP)内容入栈
5,禁止外部中断和单步中断 (IF= 0,TF= 0)
6,从中断向量表中取 4× N的字节内容送 IP,取 4× N+2的字节内容送 CS。
转中断处理程序中断发生的过程很象我们所熟悉的子程序调用,不同的是在保护中断现场时,除了保存返回地址 CS,IP之外,还保存了标志寄存器 PSW的内容。因为标志寄存器记录了中断发生时,程序指令运行的结果特征。当 CPU处理完中断请求返回原程序时,要保证原程序工作的连续性和正确性。所以中断发生时,PSW的内容也要保存起来,另一个不同点是,在中断发生时,CPU还自动清除了 IF位和 TF位,这样设计的目的是使 CPU转入中断处理程序后,不允许再产生新的中断,如果在执行中断处理程序的过程中,还允许外部的中断,可以通过 STI指令再把 IF设置为 1。
第一章 基础知识第八章 输入与输出程序设计编写中断处理程序和编写子程序一样,所使用的汇编语言指令没有特殊限制,只是中断处理程序返回时使用 IRET指令 。这条指令的工作步骤相中断发生时的工作步骤正好相反。它首先把 IP,CS和 PWS的内容出栈,然后返回到中断发生时紧接着的下一条指令。
第一章 基础知识第八章 输入与输出程序设计四、内部 过程第一章 基础知识第八章 输入与输出程序设计五、外 过程外部中断主要有两种来源,一种 是非屏蔽中断 (NMl),另一种是来自各种外部设备的中断,由外部设备的请求引起的中断也称为 可屏蔽中断 。
但是从外设发出中断请求到 CPU响应中断,有两个控制条件是起决定作用,
一是该外设的中断请求是否屏蔽,一个是 CPU是否允许响应中断。 这两个条件分别由 8259A的中断屏蔽寄存器( IMR)和标志寄存器( PSW)中的中断允许位 IF控制。
中断屏蔽寄存器的 I/ O
端口地址是 21H,它的 8位对应控制 8个外部设备,如左图所示,
通过设置这个寄存器的某位为 0或为 1来允许或禁止某外部设备的中断。 某位为 0表示允许某种外设中断请求,
某位为 1表示某种外设的中断请求被屏蔽 (禁止 )。
第一章 基础知识第八章 输入与输出程序设计例如,只允许键盘中断,可设置如下中断屏蔽字:
如果系统中要新增设键盘中断,则可用下列指令实现:
注意,在编写中断程序时,应在主程序的初始化部分设置好中断屏蔽寄存器,以确定允许用中断方式工作的外部设备。外部设备向 CPU发出中断请求,CPU是否响应还与标志寄存器中的中断标志位 IF有关。 如果 IF = 0,CPU就禁止响应任何外设的中断 。
如果 IF= 1测允许 CPU响应外设的中断请求,有两条指令能设置或清除 IF位。
允许 CPU响应外设的中断请求 (IF= 1)也叫做 开中断,反之叫做 关中断 (1F= 0)。
第一章 基础知识第八章 输入与输出程序设计当任何类型的中断发生时,当前的 PSW要保存入栈,然后清除 IF位进入中断处理程序。如果允许在一个中断处理程序的执行过程中发生外中断,则必须用一条 STI指令开中断。当执行到中断返回指令 IRET,又取出 PSW先前的值,其中 IF为 1,CPU将允许外中断再次发生。
有一种特殊的外部中断和 IF标志位无关,这就是非屏蔽中断,非屏蔽中断的类型号为 2,CPU不能禁止非屏蔽中断,如果系统使用了这种类型的中断,那么 CPU总会响应的,
所以非屏蔽中断主要用于一些紧急的故障处理,如电源掉电等。另外计算机内部的实时钟希望能不停地计时,所以也可以把非屏蔽中断提供给实时钟。 。。
在一次外中断处理结束之前,还应给 8259A可编程中断控制器的中断命令寄存器发出中断结束命令 (EOI)。 中断命令寄存器的 I/ O端口地址为 20H,如下图所示 。
它的各控制位可动态地控制中断处理过程,其中 L2 - L0三位指定 IR0— IR7中具有 最低优先级 的中断请求 。 6位和 7位控制 IR 0一 IR 7的中断优先级的顺序 。 5位 (EOI)是中断结束位 。 当 EOI位为 1时,当前正在处理的中断请求就被清除,所以在中断处理完成后,必须把中断结束位置为 1,否则以后将屏蔽掉对同级中断或低级中断的处理 。 当然在必要的时候,在中断处理程序中也可利用 EOI命令清除当前的中断请求,使得在中断处理的过程中又能响应同级或低级中断 。 结束外中断用下面的指令:
第一章 基础知识第八章 输入与输出程序设计六,中断优先级和中断嵌套中断源事先安排一个中断优先级次序,当多个中断源同时申请中断时,CPU先比较它们的优先级,然后从优先级高到低的次序来依次处理各个中断源的中断请求。
IBMPC规定中断的优先级次序为:
可屏蔽中断的优先权又分为八级,在正常的优先级方式下,优先级次序是
8259A的中断命令寄存器的 6位和 7位能控制各中断请求端的优先级次序。在发出一个
EOI命令时,7位 (R)和 6位 (SL)有四种组合,其含义如下:
第一章 基础知识第八章 输入与输出程序设计外中断的优先级次序一般在正常优先级方式下( R= 0,SL= 0),但在必要的情况下,设置中断命令寄存器能改变 IR0— IR7的优先级次序。
例如,IR0— IR7原为正常的优先级次序,现在要使 IR4成为最低级的中断请求,
则给端口 21H送命令码,11100100.即 R= l,SL= 1,EOI= 1,L2L1L0= 100,
这样,各中断优先级就依次右循环到 IR4为最低优先级的位置上:
如果再送一个命令码,10100000,则优先级次序再向左循环一个位置,成为正在运行的中断处理程序,又被其它中断源中断,这种情况叫做 中断嵌套 。
IBMPC机没有规定中断嵌套的深度 (中断程序又被中断的层次 ),但在实际使用时,多重的中断嵌套要受到堆栈容量的限制,所以在编写中断程序时,一定要考虑有足够的堆栈单元来保存多次中断的断点及各寄存器的内容。
第一章 基础知识第八章 输入与输出程序设计注意,一个正在执行的中断处理程序,在开中断 (IF= 1)的情况下,能被优先级高于它的中断源中断,但如果要被同级或低级的中断源中断,则必须发出 EOI命令,清除正在执行的中断请求,才能响应同级或低级的中断。
假定在主程序的执行过程中,IR2和 IR4的中断请求同时发生,而后 IR1的中断请求又到达,最后 IR3的中断请求也到达 。 中断执行次序如下:
首先,CPU响应优先级高的 IR2.转去执行 IR2的中断处理程序。进入 IR2处理程序后,IF被置为 1。当
IRl的中断请求到达后,因
IRl的优先级高于 IR2,
CPU就立即中断 IR2的程序,
转去执行 IRl的处理程序。
在 IR1处理程序中 CPU指令发出了 EOI命令,结束了 IR1的中断请求。返回 IR2处理程序后,
同样由于发出 EOI命令清除了 IR2的中断请求,所以在较低级的中断请求 ER4到达后,即转向处理 IR4的中断请求。在 IR4处理程序的执行过程中,IR3的中断请求到达,当判断 IF
已被置为 1,则又中断了 IR4的程序,转去执行 IR3的程序。在 IR3程序中,也发出了开中断指令 (STI)和中断结束命令 (EOI),最后 IRET指令使其返回到 IR4程序,IR4在返回 IR2
之前也发出了 EOI命令,结束了 IR4的中断请求。 IR2中断请求在前面已被清除,所以 IR4
执行完后,IR2继续执行直到返回主程序。
第一章 基础知识第八章 输入与输出程序设计七,中断处理程序对于外部中断过程,主程序为中断所做的准备工作和硬件 (包括 CPU和外设接口 )自动完成的动作,
对一般指令,只要一条指令的 执行周期结束 即可响应中断。对以下指令特殊控制:
1,对加重复前缀的串指令 (如 REP MOVSB)要作为一条指令处理,但不是把串操作全部重复执行完,而是执行一次重复后,串指令即可响应中断。 2,对于 MOV指令和 POP指令,
如果处理对象为段寄存器时,那么本指令执行完后,执行完下一条执行才能响应中断请求。 3,对于开中断指令 STI和中断返回指令,也要在这些指令执行完后,再执行一条指令才响应中断。
第一章 基础知识第八章 输入与输出程序设计中断处理子程序的步骤,
(1)保存寄存器内容
(2)如允许中断嵌套,则开中断 (STI)
(3)处理中断
(4)关中断
(5)送中断结束命令 (EOI)给中断命令寄存器
(6)恢复寄存器内容
(7)返回被中断的程序 (IRET)
八,中断处理程序举例例 编写一个中断处理程序,要求在主程序运行的过程中,每隔 10秒钟响铃一次,同时在屏幕上显示出信息,The bell is ring”,连续响 5次退出。
原理,在系统定时器 (中断类型为 8)的中断处理程序中,有一条中断指令 INT 1CH,时钟中断每发生一次 (约每秒中断 l8,2次 ),都要调用一次中断类型 1CH的处理程序。在
ROM BIOS中,1CH的处理程序只有一条 IRET指令,实际上它并没有做任何工作,只是为用户提供了一个中断类型号。如果用户有某种定时周期性的工作需要完成,就可利用系统定时器的中断间隔,用自己设计的处理程序来代替原有的 1C程序。
第一章 基础知识第八章 输入与输出程序设计程序,dseg segmentcount dw 5 ;控制连续响铃 5次
mess db 'the bell is ring',0dh,0ah,'$' ;在屏幕上显示的字符串
dseg ends
cseg segment
assume cs:cseg,ds:dseg
main proc far
start:
mov ax,dseg
mov ds,ax
mov al,1ch ;保存 1Ch原中断向量进入堆栈中
mov ah,35h
int 21h
push es
push bx
push ds;把响铃过程设置为 1Ch中断向量
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 ;允许 CPU响应中断
mov di,20000 ;主过程的时间延迟,以便在该时间延迟内进行定时中断处理
delay1:
mov si,30000
delay2:
dec si
jnz delay2
cmp di,0
jz exit
dec di
jnz delay1
pop dx;恢复原来的中断向量
pop ds
mov al,1ch
mov ah,25h
int 21h
mov ax,4c00h
int 21h
main endp
第一章 基础知识第八章 输入与输出程序设计
ring proc near
push ds;保存寄存器内容
push ax
push cx
push dx
mov ax,dseg
mov ds,ax
sti;允许 CPU响应中断
cmp count,0
jz exit
dec count
mov dx,offset mess;显示字符串信息,字符串必须以 ’ $’结束
mov ah,09h
int 21h
mov dx,100;发声控制
in al,61h
and al,11111100b
sound:
xor al,02h
out 61h,al
第一章 基础知识第八章 输入与输出程序设计
mov cx,1400
wait1:
loop wait1
dec dx
jnz sound
exit:
cli
pop dx
pop cx
pop ax
pop ds
iret
ring endp
cseg ends
end start
IBM PC系列计算机的键盘是一个智能键盘,键盘内有一片 Intel
8048(或 8049)单片机(处理器),负责对整个键盘上的字符键、
功能键、控制键和组合键进行管理。
键盘 I/O
敲键
8048 向 8259A发出 IRQ1中断请求将所敲键的扫描码送 8255 60H端口
( IF=1)主机响应 IRQ1
调用 09中断类型服务程序,从 8255 60H
端口 接收扫描码 并转换为 ASCII码键盘缓冲区键盘中断响应流程用户程序利用 DOS功能调用
BIOS中断调用当在键盘上,按下,或,放开,一个键时,如果这时允许键盘发出中断请求并且 IF=1,就会产生 09H类型的硬件中断,
CPU将执行 INT 09H指令,转入 BIOS键盘中断服务程序处理用户的键盘输入 。
扫描码和 ASCII码
60H输入端口:
D7=1 按键已 放开,称为 断码
D7=0 键已 按下,称为 通码,D6-D0位 是按键的 扫描码 。
键盘上的每一个键都对应 惟一的扫描码,扫描码与键盘按键对应关系如表 5-5所示。
BIOS和 DOS键盘中断功能
BIOS中断调用( INT 16H)和 DOS系统调用( INT 21H)
都提供了键盘中断功能,从键盘缓冲区获取键入字符的扫描码或 ASCII码返回给用户应用程序。
第一章 基础知识第八章 输入与输出程序设计例 要求改变键盘中断向量,实现下列目的:
( 1) 从键盘上接收扫描码,并在屏幕上显示扫描码的十六进制;
( 2) 将扫描码存入缓冲区内,在有限时间内,当缓冲区满时,给出 buffer
overflow信息,当缓冲区不满时,给出 buffer not overflow信息,
( 3) 缓冲区的大小为 16字节 。
dseg segment
addr_point dw?
count dw?
buffer db 0fh dup(' ')
prompt db 'please enter the character,'
db 0dh,0ah,'$'
message db 'buffer overflow',0dh,0ah,'$'
messageb db 'buffer not overflow',0dh,0ah,'$'
save_ip9 dw?
save_cs9 dw?
dseg ends
cseg segment
assume cs:cseg,ds:dseg
第一章 基础知识第八章 输入与输出程序设计
main proc far
start:
mov ax,dseg
mov ds,ax
mov ax,offset buffer ;初始化缓冲区地址和缓冲区字符数量
mov addr_point,ax
mov count,0;********
mov al,09h ;保存 9h的中断向量
mov ah,35h
int 21h
mov save_ip9,bx
mov save_cs9,es
mov dx,offset kbint ;把过程 kbint地址设置成 09h的中断向量
push ds
mov ax,seg kbint
mov ds,ax
mov al,09h
mov ah,25h
int 21h
pop ds
第一章 基础知识第八章 输入与输出程序设计
in al,21h ;允许键盘中断
and al,0fdh
out 21h,al
mov ah,09h ; 屏幕上显示提示信息
lea dx,prompt
int 21h;*******
sti ;允许 CPU响应外部中断;*******
mov di,0f000h ;主过程等待键盘的输入和打印机的输出
mainp:
mov si,0f000h
mainp1:
dec si
jnz mainp1
dec di
jnz mainp;******
mov ah,02h ;屏幕上显示字符 $表示主程序结束
mov dl,'$'
int 21h
第一章 基础知识第八章 输入与输出程序设计;******
cli ;禁止许 CPU响应外部中;******
push ds ;恢复 09h中断向量
mov dx,save_ip9
mov ax,save_cs9
mov ds,ax
mov al,09h
mov ah,25h
int 21h
pop ds
cmp count,16
jnz ov
mov ah,09h ; 屏幕上显示提示信息
lea dx,message
int 21h
jmp endd
ov:
mov ah,09h ; 屏幕上显示提示信息
lea dx,messageb
int 21h
第一章 基础知识第八章 输入与输出程序设计
endd:
in al,21h ;允许键盘中断
and al,0fdh
out 21h,al;******
sti ;允许 CPU响应外部中
mov ax,4c00h
int 21h
main endp;--------------------------------------------------------------
kbint proc near
push ax
push bx
in al,60h
test al,80h ;测试按键还是释放键,参见课本 p231页
jnz cont
cmp count,16
jz cont
第一章 基础知识第八章 输入与输出程序设计
mov bx,addr_point
mov [bx],al
call disp
inc bx
inc count
mov addr_point,bx
cont:
cli
mov al,20h ;结束外中断
out 20h,al
pop ax
pop bx
iret
kbint endp;-------------------------------------------------------
disp proc near
push ax
push bx
push dx
第一章 基础知识第八章 输入与输出程序设计
mov ch,2
mov cl,4
nestb:
rol al,cl
push ax
mov dl,al
and dl,0fh
or dl,30h
cmp dl,3ah
jl dispit
add dl,7h
dispit:
mov ah,2
int 21h
pop ax
dec ch
jnz nestb
mov ah,2
mov dl,','
int 21h
pop dx
pop bx
pop ax
ret
disp endp;---------------------------------------------------------
cseg ends
end start