输入输出程序设计

本文详细介绍了输入输出程序设计中的两种主要控制方式:直接存储器存取(DMA)和中断传送方式。DMA方式允许高速设备与存储器直接交换数据,而中断方式则是CPU与外部设备高效交互的机制,包括软件中断和硬件中断,其中中断向量表用于存储中断处理程序的地址。
 
输入输出程序设计
1、I/O设备的数据传送方式
1.1、CPU与外设
每种输入输出设备都要通过一个硬件接口或控制器和CPU相连,这些接口和控制器都能支持输入输出指令IN,OUT与外部设备交换信息。这些信息包括控制、状态和数据三种不同性质的信息,它们必须按不同的端口地址分别传送
控制信息输出到I/O端口,通知接口和设备要做什么动作
状态信息从I/O接口输入到CPU,表示I/O设备当前所处的状态
数据信息是I/O设备和CPU真正要交换的信息。外设和接口之间的数据信息可以是串行的,也可以是并行的,相应地要使用串行接口或并行接口
1.2、直接存储器存取(DMA)方式
DMA方式主要是用于一些高速的I/O设备,如磁带、磁盘、模数转换器等设备。DMA方式能使I/O设备直接和存储器进行成批数据的快速传送。每个字节一到达端口就直接从接口送到存储器,同样,接口和它的DMA控制器也能直接从存储器取出字节并把它送到I/O设备中
DMA控制器一般包括四个寄存器:控制寄存器、状态寄存器、地址寄存器和字节寄存器,这些寄存器在信息传送之前应进行初始化,即系统程序在地址寄存器中设置要传送的数据块的首地址,在字节寄存器中设置要传送的数据长度,在状态控制寄存器中设置控制字,指出数据是输入还是输出,并启动DMA操作。每个字节传送后,地址寄存器增1,字节寄存器减1
系统完成DMA传送的主要步骤如下:
DMA控制器向CPU发出HOLD信号,请求使用总线
CPU发出响应信号HOLD给DMA控制器,并把总线让出,这时CPU放弃了对总线的控制,而DMA控制器获得了总线控制权
传输数据的存储器地址(在地址寄存器中)通过地址总线发出
传输的数据字节通过数据总线进行传送
地址寄存器增1,以致向下一个要传送的字节
字节计数器减1
如字节计数器非0,转向第3步
否则,DMA控制器撤销总线请求信号HOLD,结束传送
2、程序直接控制I/O方式
2.1、I/O端口
计算机的外部设备和大容量存储设备都是通过接口连接到系统上,每个接口由一组寄存器组成,这些寄存器都分配有一个称为I/O端口的地址编码。计算机的CPU和内存就是通过这些端口和外部设备进行通信的
I/O接口部件中一般有三种寄存器:一是用作数据缓冲的数据寄存器,而是用来保存设备和接口的状态信息,供CPU对外设进行测试的状态寄存器;三是用来保存CPU发出的命令以控制接口和设备的操作的命令寄存器。这些寄存器都分配有各自的端口号,CPU就是通过不同的端口号来选择各种外部设备的
在80x86微机中,I/O端口地址在一个独立的地址空间中,这个I/O空间允许设置64K个8位端口或32K个16位端口
2.2、I/O指令
对于一个I/O和存储器分离的地址空间系统,80x86有专门的I/O指令与端口进行通信。
IN AL,PORT ;(AL)<——(PORT)
IN AX,DX ;(AX)<——(PORT+1:PORT)
IN AL,DX ;(AL)<——((DX))
IN AX,DX ;(AX)<——((DX)+1,(DX))
OUT PORT,AL ;(PORT)<——(AL)
OUT PORT,AX ;(PORT+1:PORT)<——AX
OUT DX,AL ;((DX))<——(AL)
OUT DX,AX ;((DX)+1,(DX))<——(AX)
用IN指令可以从一个数据寄存器输入数据或从状态寄存器输入接口和外设的状态
用OUT指令可以数据数据或给一个指定的I/O端口传送命令信息
I/O指令是CPU与外部设备进行通信的最基本途径,即使使用DOS功能调用或者BIOS例行程序,其例行程序本身也是用IN和OUT指令与外部设备进行数据交换的
3、中断传送方式
中断是CPU和外部设备进行I/O的有效方法,可以避免因反复查询外部设备的状态而浪费时间,从而提高了CPU的效率
中断是一种使CPU中止正在执行的程序而转去处理特殊时间的操作。这些引起中断的事件称为中断源,它们可能是来自外部设备的I/O请求,也可能是计算机的一些异常事故或其他内部原因。由外设控制器或协处理器引起的中断一般称为硬件中断或外中断,由程序中安排的中断指令INT产生的中断,或由CPU的某些错误结果产生的中断称为软中断或内中断
连接到CPU的非屏蔽中断(NMI)为电源错、内存或I/O总线的奇偶等异常事件的中断保留的,它不受中断允许标志IF的屏蔽,而且在整个系统中只能由一个非屏蔽中断,其中断类型号为2
外部设备的中断是通过Intel 8259A可编程中断控制器(IPC)连接到主机上的。CPU通过一组I/O端口控制8259A,而8259A则通过INTR管脚给CPU传送中断信号。
3.1、8086的中断分类
3.1.1、软件中断
软件中断又称为内中断,它通常由三种情况引起:
(1)中断指令INT引起的内中断
CPU执行完一条INT n指令后,会立即产生中断,并且调用系统中相应得中断处理程序来完成中断功能,中断指令的操作数n给出中断类型号
(2)处理CPU某些错误的中断
CPU在执行程序时,还会发现一些运算中出现的错误,为了能及时处理这些错误,CPU就以中断的方式中止正在运行的程序,待程序员改正错误后,重新运行程序
(3)为调试程序设置的中断
单步中断:当标志位TF置为1时,每条指令执行后,CPU自动产生类型号为1的中断——单步中断。
断点中断:断点可以设置在程序的任何地方,设置断点实际上是把一条断点指令INT 3插入程序中,CPU每执行到断点处的INT 3指令便产生一个中断
3.1.2、硬件中断
硬件中断来自处理机的外部条件,如I/O设备或其他处理机等,以完全随机的方式中断现行程序而转向另一个处理程序。硬件中断又称为外中断
硬件中断主要有两种来源:一种是非屏蔽中断(NMI),另一种是来自各种外部设备的中断。由外部设备的请求引起的中断也称为可屏蔽中断。外部设备通过8259A可编程中断控制器和CPU相连。8259A可编程中断控制器可接受来自外设的中断请求信号,并把中断源的中断类型号送CPU,如果CPU响应该外设的中断请求,就自动转入相应的中断处理程序。从外设发出的中断请求到CPU响应中断,有两个控制条件是起决定性作用的,一是该外设的中断请求是否屏蔽,另一个是CPU是否允许响应中断。这两个条件分别由8259A的中断屏蔽寄存器(IMR)和标志寄存器(FLAGS)中的中断允许位IF控制
中断屏蔽寄存器的I/O端口地址是21H,它的8位对应控制8个外部设备,通过设置这些寄存器的某些位为0或为1来允许或禁止某外部设备的中断。某位为0表示允许某种外设中断请求,某位为1表示某种外设的中断请求被屏蔽
外部设备向CPU发出中断请求,CPU是否响应还与标志寄存器中的标志位IF有关,如果IF=0,CPU就禁止响应任何外设的中断,也就是说,CPU将不会产生中断来处理外设的请求。如果IF=1,则允许CPU响应外设的中断请求。下面的指令设置和清除IF位
STI:设置中断允许位(IF=1)
CLI:清除中断允许位(IF=0)
有一种特殊的硬件中断和IF标志位无关,这就是非屏蔽中断。非屏蔽中断的类型号为2,CPU不能禁止非屏蔽中断
在一次中断处理结束之前,还应给8259A可编程中断控制器的中断命令寄存器发出中断结束命令。中断命令寄存器的I/O端口地址为20H,它的各个控制位可动态的控制中断处理过程,其中L2~L0三位指定中断屏蔽寄存器中IR0~IR7的具有最低优先级的中断请求。SL和R控制IR0~IR7的中断优先级的顺序。EOI是中断结束位,当EOI位为1时,当前正在处理的中断请求就被清除。所以在中断处理完成后,必须把中断结束位置为1,斗则以后将屏蔽同级中断和低级中断的处理。必要的时候,在中断处理程序中也可利用EOI命令清除当前的中断请求,使得在中断处理的过程中又能响应同级和低级中断
中断命令寄存器:
R:SL:EOI:0:0:L2:L1:L0
3.2、中断向量表
每种中断都给安排一个中断号,80x86中断系统能处理256种类型的中断,类型号为0~0FFH。每种类型的中断都由相应的中断处理程序来处理,中断向量表就是个类型中断处理程序的入口地址表
存储器最低的1KB,地址从0000~3FFH存放中断向量。中断向量表中的256项中断向量对应256种中断类型,每项占用四个字节。其中两个字节存放中断处理程序的段地址,另两个字节存放偏移地址。各处理程序的段地址和偏移地址在中断向量表中按中断类型号顺序存放,每类中断向量的地址可由中断类型号乘以4计算出来
以BIOS中断INT 4AH为例,中断操作的5个步骤:
取中断类型号
计算中断向量地址
取中断向量,偏移地址送IP,段地址送CS
转入中断处理程序
中断返回到INT指令的下一条指令
3.3、中断过程
当中断发生时,由中断机构自动完成下列动作:
取中断类型号N
标志寄存器FLAGS内容入栈
当前代码段寄存器CS内容入栈
当前指令计数器IP内容入栈
禁止硬件中断和单步中断(IF=0,TF=0)
从中断向量表中取4*N的字内容送IP,取4*N+2中的字内容送CS
转中断处理程序
中断和子程序调用的区别:
在保护中断现场时,除了保存返回地址CS:IP之外,还保存标志寄存器FLAGS的内容。因为标志寄存器记录了中断发生时,程序指令运行的结果特征,当CPU处理完中断请求返回原程序时,要保证原程序工作的连续性和正确性,所以中断发生时的FLAGS内容也要保存起来。在中断发生时,CPU还自动清除了IF位和TF位,这样设计使CPU转入中断处理程序后,不允许再产生新的中断,如果在执行中断处理程序的过程中,还允许外部的中断,可通过STI指令再把IF置1 。中断程序返回时使用IRET指令,这条指令的工作步骤和中断发生时的工作步骤正好相反,它首先把IP,CS和FLAGS的内容出栈,然后返回到中断发生时紧接着的下一条指令
3.4、中断优先级和中断嵌套
给各种中断源事先安排一个中断优先级顺序,当多个中断源同时申请中断时,CPU先比较它们的优先级,然后从优先级高到优先级低的次序依次处理各个中断源的中断请求
8086规定中断的优先级次序为:
软件中断(除法错,INTO,INT)
非屏蔽中断
可屏蔽中断
单步中断
可屏蔽中断的优先权又分为8级,在正常优先级方式下,优先级次序是:
IR0,IR1,IR2,IR3,IR4,IR5,IR6,IR7
8259A 的中断命令寄存器的6位和7位能控制各中断请求端的优先次序。在发出一个EOI命令时,7位(R)和6位(SL)有四种组合:
00:正常优先级方式
01:各中断优先级依次左循环一个位置
11:各中断优先级依次循环到由L2~L0指定的中断请求到达最低优先级位置上
一个正在执行的中断处理程序,在开中断(IF=1)的情况下,能被优先级高于它的中断源中断,但如果要被同级或低级的中断源中断,则必须发出EOI命令,清除正在执行的中断请求,才能响应同级或低级的中断
3.5、中断处理程序
主程序:
设置中断向量
设置设备的中断屏蔽位
设置CPU的中断允许位IF(开中断)
硬件:
外设接口送中断请求给CPU
当前指令执行完后,CPU送响应信号给外设接口
CPU接受中断类型号
当前的FLAGS,CS和IP保存入栈
清除IF和TF
中断向量送IP和CS
至此,CS和IP寄存器取得了中断处理程序的段地址和偏移地址,CPU就把控制转给中断处理程序
中断处理程序:
保存寄存器的内容
如允许中断嵌套,则开中断(STI)
处理中断
关中断(CLI)
送中断结束命令(EOI)给中断命令寄存器
恢复寄存器的内容
返回被中断的程序(IRET)
 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值