第一章基础知识第八章输入与输出程序设计第八章输入与输出程序设计第一章基础知识第八章输入与输出程序设计第一章基础知识第八章输入与输出程序设计第一节: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就是通过不同的端口号来选择外部设备的第一章基础知识第八章输入与输出程序设计端口数量:在IBMPC中,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位置零。第一章基础知识第八章输入与输出程序设计程序:soundprogramsegmentassumecs:soundprogrammainprocfarstart:movbx,0f350hmovdx,2300hinal,61hmovah,alandal,11111100b;关断定时器通道2的门控sound:xoral,2;触发61H端口第1位out61h,almovcx,dx;(dx)=控制脉宽的计数值wait1:loopwait1;延时循环decbx;(bx)=脉冲持续的时间jnzsoundmoval,ahout61h,al;恢复61H端口movax,4c00hint21hmainendpsoundprogramendsendstart第一章基础知识第八章输入与输出程序设计例COMM程序基本原理这是一个关于INS8250串行通讯口I/O的例子。它的数据寄存器的端口地址是03F8H,状态寄存器的端口地址是03FDH。其中0位是输入数据准备位,5位是输出数据准备位。下列是串行口输入输出程序。输出子过程:读取子过程:第一章基础知识第八章输入与输出程序设计以上CPU与外部设备交换信息的方式称为查询方式或等待方式。造成CPU必须查询等待的主要原因是许多外设的工作速度比较低.如磁盘、打印机等,它们通过按键或打印头的机械动作输入或输出一个数据,其速度是很慢的,而OUT执行指令的速度是它的几千倍乃至上万倍,所以则在接收或发送数据之前必须要了解外设的状态,看外设是否已经准备好。当外没还没有准备好以前,CPU就要等待,不能做别的操作。为了提高CPU的工作效率,我们可采用中断方式传送数据。关于中断,我们将在下一节中做详细介绍。第一章基础知识第八章输入与输出程序设计第三节:中断传送方式什么是中断:中断是一种使CPU中止正在执行的程序而转去处理特殊事件的操作。什么是中断源:引起中断的事件。中断的优点:避免因反复查询外部设备的状态而浪费时问,从而提高了CPU的效率。外中断:由外设控制器或协处理器(8087/80287)引起的中断一般称为外中断。内中断:中断指令INT产生的中断,或由CPU的某些错误结果产生的中断称为内中断8086/8088的中断源如下图所示:第一章基础知识第八章输入与输出程序设计第一章基础知识第八章输入与输出程序设计非屏蔽中断:是为电源错、内存或I/O总线的奇偶错等异常事件的中断保留的。外部设备的中断是通过Inter8259A可编程中断控制器(PIC)连到主机上。CPU通过一组I/O端口控制8259A,而8259A则通过INTR管脚给CPU传送中断信号。这种外中断类型的分配由硬件连线实现.中断20H到3FH用于调用DOS功能例行程序,其它中断号小于20H或大于3FH的中断,用于调用IBMPCROMBIOS或一些应用软件一、中断向量表我们给每种中断都安排一个中断类型号。IBMPC中断系统能处理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指令的下一条指令第一章基础知识第八章输入与输出程序设计第一章基础知识第八章输入与输出程序设计二、设量中断向量下表列出了IBMPC各类中断的地址分配:用户可以利用保留的中断类型号扩充自己需要的中断功能,对新增加的中断功能要在中断向量表中建立相应的中断向量。第一章基础知识第八章输入与输出程序设计指令来为中断类型N设置中断向量:;段地址为0;设置偏移地址;要设置的中断子过程;设置新中断向量(地址)注意:如果新的中断功能只供自己使用,或用自己编写的中断处理程序代替系统中的中断处理功能时,要注意保存原中断向量,在设置自己的中断向量时,应先保存原中断向量再设置新的中断向量,在程序结束之前恢复原中断向量。第一章基础知识第八章输入与输出程序设计在实际编程过程中,在检查或设置任何中断向量时,总是避免直接使用中断向量的绝对地址,而是使用DOS功能调用(21H)存取中断向量。第一章基础知识第八章输入与输出程序设计三、中断过程当今断发生时,由硬件自动完成下列动作:1.取中断类型号N2.标志寄存器(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总会响应的,所以非