您好、欢迎来到现金彩票网!
当前位置:2019跑狗图高清彩图 > 向量屏蔽 >

汇编(三十三)——输入输出程序设计二

发布时间:2019-07-25 09:37 来源:未知 编辑:admin

  采用查询方式进行I/O操作,是由处理器主动执行程序实现的。如果处理器没有查询外设,即使外设准备好数据,交换也无法进行。对于需要及时交换数据的外设,可以变被动为主动,采用中断请求向处理器提出要求;这时处理器执行事先设计好的中断服务程序,在中断服务程序中实现数据交换,这就是程序中断输入输出方式。

  8086可以处理256种中断,分为内部、外部两种(参见)其中外部可屏蔽中断用于与外设进行数据交换。但是从8086 CPU获得中断向量号开始到进入中断服务程序的过程,不同类型的中断时没有差别的。

  主程序通过中断调用指令INT n执行内部中断服务程序,其实质相当于子程序调用。所以编写内部中断服务程序与编写子程序雷同,都是利用过程定义伪指令PROC/ENDP。不同的是,进入中断服务程序后通常都要执行STI指令开放可屏蔽中断,最后执行IRET指令返回调用程序。内部中断通常采用寄存器传递参数。

  主程序在调用内部中断程序之前,必须修改中断向量(在中断向量表中设置中断服务程序的入口地址),使其指向相应的中断服务程序。修改中断向量可以自编一个这样的程序段或利用DOS功能调用:

  中断服务程序如果只被某个应用程序使用,那么应用程序返回DOS前,也要修改中断向量,使系统恢复原状态。这只要在设置中断向量之前,首先读取并保存元中断向量即可。可编程实现或利用DOS功能调用:

  分析:修改中断向量号80H的服务程序,显示一段信息。.model small

  该程序首先读取并保存中断80H的原中断向量,然后设置新中断向量。当程序不再需要这个中断服务程序,就将保存的原中断向量恢复,这样该程序返回DOS后没有改变系统状态。

  用户的中断服务程序如果要让其他程序使用,必须驻留在系统主存中。这就形成驻留TSR(Terminate and Stay Resident)程序。实现程序驻留并不难,利用DOS功能调用31h代替4ch终止程序并返回DOS:

  分析:将上面的INT 80H内部中断服务程序驻留。小型驻留程序一般写成COM格式程序,驻留部分要写在前面。.model tiny

  该程序执行后,驻留的中断服务程序常驻内存,而起安装作用的主程序从内存中消失。

  外设采用中断方式与处理器交换信息是利用外部可屏蔽中断实现的,在8086CPU系统中,可屏蔽中断还需要借助中断控制器(如Intel 8259A)管理。所以,可屏蔽中断才是真正意义上的“中断”;编程可屏蔽中断就具有一定的特殊性。需要注意如下几点:

  可屏蔽中断服务程序在执行中断返回指令前,应向中断控制器发送中断结束EOI命令;否则,以后将屏蔽对同级中断和低级中断的响应。方法如下:

  外部中断是随时发生的。所以系统进入服务程序时,除CS和IP寄存器外,当前的运行状态,包括其他寄存器都是不可知的,想通过寄存器传递参数显然不行。但是,为了中断处理结束后能正确返回断点执行被中断的主程序,必须保存好中断服务程序中使用的所有寄存器,在结束前恢复。

  外部中断可能引起子程序的重入。DOS内核是不可重入的,所以不能使用DOS系统调用。中断服务程序若要控制I/O设备,最好调用ROM-BIOS功能或者对I/O接口直接编程。

  外部中断的实时性很强,应主要处理较急迫的事物,因此中断服务程序时间应该尽量短,能放在主程序完成的任务,就不要由中断服务完成。这样可以避免干扰其他中断设备的工作,例如:PC机上影响系统日时钟计时的准确性。

  可屏蔽中断的响应受中断标志控制,程序中通过关中断指令CLI禁止可屏蔽中断,而通过开中断指令STI允许可屏蔽中断。当不需要可屏蔽中断或程序不能被外部中断时,就必须关中断,防止不可预测的后果,而其他时间则要开中断,以便及时响应中断,为外设提供服务。

  例如,设置好可屏蔽中断服务程序之前和为屏蔽中断服务程序提供初始值等时间,不能响应中断,关中断。在此之后,要开中断,另外进入中断服务程序后,要马上开中断,以允许较高级的中断。

  可屏蔽中断还通过中断控制寄存器管理,所以某个可屏蔽中断的响应与否还受控于中断屏蔽寄存器。CPU的中断标志IF是控制所有可屏蔽中断的,而屏蔽控制寄存器是分别控制某个可屏蔽中断源的。在PC微机中,中断屏蔽寄存器的端口地址是21h,中断屏蔽寄存器某位Di为0时,就允许相应的中断IRQi,例如:

  在主程序和中断服务程序中都可以通过控制中断屏蔽寄存器的有关位,随时允许或禁止对应的中断。同样,为了应用程序返回后,恢复原状态,在修改IMR前,要保护,程序退出前,要恢复。

  PC微机中,键盘采用中断方式向系统提供按键的扫描码。每当用户按下一个键时,键盘就向系统申请键盘中断(对应IRQ1,中断向量号9)。在中断服务程序中,通过数据端口60H读取该键的接通扫描码,然后通过控制端口61h(还记得吧?上一篇讲述程序直接控制输入输出中在讲到定时电路讲到过)的最高位D7应答键盘。而当放开按下的键时,键盘也要产生9号可屏蔽中断,只是读取的是断开扫描码。如果一直按着某个键,则键盘以一个固定频率产生中断,不断提供接通扫描码。

  PC微机中当然有9号中断调用,还有为程序员使用的ROM-BIOS功能调用(INT 16H)和DOS功能调用(如01H和0AH字功能)。现在我们编写一个09号可屏蔽中断服务程序,实现显示每个按键的扫描码。

  分析:为了能够返回DOS,程序设计当按下ESC键时退出。这里采用固定存储单元在主程序和中断服务程序之间传递参数。.model small

http://bluecaleel.com/xiangliangpingbi/274.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有