1新编汇编语言程序设计2第八章输入输出与中断8.1输入/输出8.2中断8.3.COM文件习题八3输入输出:计算机系统必须有信息的输入输出。中断:中断是一种计算机非常常用而且重要的工作方式。48.1输入/输出8.1.1外部设备和接口8.1.2输入/输出指令8.1.3程序控制输入/输出5接口:•计算机与外部设备的信息交换是通过“接口(Interface)”电路间接实现的。总线:•计算机与接口之间通过“总线(BUS)”连接。8.1.1外部设备和接口61.CPU与接口之间的信号CPU与接口之间传送三种类型的信号:(1)数据信号(2)状态信号(3)控制信号72.端口端口:为了使CPU能对接口电路内部寄存器进行读写,这些寄存器都分配到一个专用的地址,这种分配了地址的寄存器称为“端口(Port)端口的种类:(1)数据输入端口(2)数据输出端口(3)状态端口(输入)(4)控制端口(输出)8•IN和OUT指令的共同特点是:必须使用累加器AL、AX或EAX进行数据的传送。•输入时,IN指令把端口的数据/状态信息读入AL(8位)、AX(16位)或EAX(32位)中。•输出时,要输出的数据/命令先放人AL(8位)、AX(16位)或EAX(32位)中,然后执行OUT指令,将AL、AX或EAX中信息向端口输出8.1.2输入/输出指令(IN/OUT)91.IN/OUT(输入/输出)指令(1)IN(输入)指令•指令格式:INACC,PORTINACC,DX•操作:AL/AX/EAX←(PORT)AL/AX/EAX←(DX)•功能:把指定端口中的数据读入AL、AX或EAX中10输入指令举例:端口地址在0~255之间:INAL,35H;将地址为35H的端口数据送AL端口地址在0~65535之间:MOVDX,21H;端口地址放入DXINAL,DX;把地址为21H的端口数据送AL中11(2)输出指令•指令格式:OUTPORT,ACCOUTDX,ACC•操作:(PORT)←AL/AX/EAX(DX)←AL/AX/EAX•功能:把AL、AX或EAX中的数据从指定端口输出12输出指令举例:端口地址在0~255之间:OUT60H,AL;将AL中数据送到地址;为60H的8位端口中端口地址在0~65535之间:MOVDX,21HOUTDX,AL;将AL中数据从DX所;指定的8位端口输出132.串输入/输出指令•串输入/输出指令的源操作数和目的操作数都是隐含的•串输入指令把DX指定的端口数据送入ES:DI所指向的存储单元,自动修改DI以指向下一个存储单元•串输出指令把DS:[SI]所指向的存储单元的数据向DX指定的端口输出,自动修改SI以指向下一个存储单元14(1)串输入指令INS•指令格式:INSB/INSW/INSD•操作:ES:[DI]←(DX)修改DI值以指向下一个数据单元•INSB、INSW、INSD分别表示从端口读入一个字节、字或双字,存人ES:DI所指向的存储单元。如果方向标志DF=0,指令执行后,DI分别增加1、2、4,如果DF=1,则DI分别减少1、2、415(2)串输出指令OUTS•指令格式:OUTSB/OUTSW/OUTSD•操作:(DX)←DS:[SI]修改SI值以指向下一个数据单元•OUTSB、OUTSW、OUTSD分别表示把DS:[SI]所指向的一个字节、字或双字数据向指定的端口输出,同时根据DF的值,将SI增加或减少1、2、416输入输出方式:•编写输入、输出程序,必须根据外设的工作方式来决定输入/输出采用的方式•三种基本的程序控制输入输出方式:(1)无条件输入/输出(2)查询式输入/输出(3)中断方式8.1.3程序控制输入/输出171.无条件方式输入/输出•外设始终处于就绪状态,CPU在需要时可随时与外设交换数据,而无须知道外设所处的状态,就可以使用无条件输入/输出方式进行数据的传输•举例:扬声器发声18有两种方法使扬声器发声:1.将61H端口D0置为0,关闭Timer2,D1交替置为1/0,使扬声器发声;2.将61H端口D0、D1均置为1,使“Timer2”工作,产生固定频率的信号,使扬声器发声。下面的子程序使用第一种方法使扬声器发声,声音频率由DX寄存器的值决定,声音的延续时间由BX寄存器内的值决定。19SOUNDPROCPUSHAX;保护现场PUSHCXINAL,61H;读61H端口“当前值”ANDAL,11111110BOUT61H,AL;使D0=0,关闭Timer2TRIG:INAL,61H;读61H端口“当前值”XORAL,2OUT61H,AL;D1取反后输出,产生周期性信号MOVCX,DXLOOP$;延时,控制1/0输出时间,控制发声频率20DECBXJNZTRIG;延时,控制发声的总时间POPCX;恢复现场POPAXRETSOUNDENDP212.查询方式输入/输出•CPU必须通过“读”外部设备的状态端口,了解外部设备的当前状态,确定能否进行“数据传输”22(1)查询式输入•查询式输入的接口电路中,除了有一个数据输入端口,还必须有一个用于反映外设状态的状态端口•状态端口的每一位反映设备的一种状态,例如,用D7=1表示设备已经完成了数据准备,可以传输数据,D7=0则表示尚未完成数据准备,不能进行数据传输。这一位常常被称为“READY”。23(2)查询式输出•采用查询方式进行输出的接口电路中,有一个用于数据输出端口,还有一个用于反映外设状态的端口•外设状态位称作“BUSY”,BUSY=1表示设备正处于数据准备阶段(“忙”);BUSY=0表示设备已经完成数据准备(“空闲”),可以进入数据传输248.2中断8.2.1中断的概念8.2.2中断服务程序8.2.3定时中断8.2.4驻留程序251.中断与中断源•中断:由于某种事件的发生,使CPU中断(暂时停止)正在执行的程序而转去执行该事件的处理程序,为该事件服务结束后,继续执行原来被中断的程序,这个过程称为中断•中断源:引起中断的事件称为中断源•断点:由于中断,将要执行但尚未执行的指令地址称为“断点”,包括16位段基址和16位偏移地址8.2.1中断的概念262.中断分类•中断可以划分为外部中断和内部中断两大类(1)内部中断中断指令INT引起的中断(软件中断)由于CPU的某些错误引起的中断,如除法错中断、溢出中断(异常中断)为调试程序设置的中断(陷阱中断)27(2)外部中断不可屏蔽中断(NMI),通常代表CPU外部的故障外设完成数据准备,请求进行数据传输引起的可屏蔽中断3.中断类型•为了区分不同的中断源,80X86给每一个中断源一个编号,称为中断类型284.中断向量表•中断向量:每种类型的中断都有一个相应的中断服务程序来进行处理,中断服务程序的入口地址称为“中断向量”•中断向量表:80x86微机系统中把256个中断向量按照它们中断类型的顺序组织成一张表,存放在内存最低的1KB中,地址范围000H~3FFH,这张表称为“中断向量表”(图8-5)295.中断处理过程•中断发生时,计算机中断机构自动完成如下操作:(1)取中断类型号N(2)标志寄存器(FLAGS)内容入栈(3)当前代码段寄存器(CS)内容入栈(4)当前指令计数器(IP)内容入栈(5)禁止外部中断和单步中断(TF=0,IF=0)(6)从中断向量表中取地址4×N的2字节内容送IP,取地址4×N+2的2字节内容送CS(7)进入中断处理程序。306.中断优先级和中断嵌套•中断优先级:给各个中断源安排一个中断响应的先后次序,即中断优先级•中断嵌套:中断服务程序执行过程中,被优先级更高的中断请求所中断,称为中断嵌套31•使用中断方式进行输入/输出时,用户需要编制两个程序模块:“主程序”和“中断服务程序”•主程序:主要任务是为进入中断服务程序进行各种准备,输入输出完成后进行结束处理•中断服务程序:中断发生时由CPU执行该程序,进行所需要的输入输出处理8.2.2中断服务程序321.主程序(1)设置中断向量:•设置中断向量就是把中断服务程序的入口地址放入中断向量表中•设置中断向量有两种可选的方法:用MOV指令将中断向量直接写入中断向量表中,称为直接写入法用DOS功能调用,设置中断向量33[例8-2]:用直接写入法设置中断向量。假设中断类型为N,中断服务程序入口标号为INTERRUPTPUSHDS;保护DS寄存器内容MOVAX,0MOVDS,AX;数据段指向中断向量表MOVBX,4*N;中断向量安放位置(偏移地址)送BXMOVWORDPTR[BX],OFFSETINTERRUPT;写入偏移地址MOVWORDPTR[BX+2],SEGINTERRUPT;写入段基址POPDS;恢复DS寄存器34•用DOS功能调用25H用来设置中断向量:入口参数为:AH=25HAL=中断类型号DS:DX=中断向量•用DOS功能调用35H用来读中断向量:入口参数为:AH=25HAL=中断类型号DS:DX=中断向量出口参数为:ES:BX=中断向量8.2.2中断服务程序35[例8-3]:使用DOS功能调用设置中断向量PUSHDSMOVAX,SEGINTERRUPTMOVDS,AXMOVDX,OFFSETINTERRUPTMOVAL,NMOVAH,25HINT21HPOPDS36(2)设置设备的中断屏蔽位:•“中断屏蔽”:外部设备的中断请求由中断控制器8259A统一管理,在8259A内部,有一个“中断屏蔽寄存器”,该寄存器的8位二进制对应于8259A的8个中断请求输入,寄存器某一位设置为“1”时,对应引脚上的中断请求不能被传送到CPU,该中断因此无法得到相应。对中断请求的这种管理方法称为“中断屏蔽”。37(3)设置中断允许位IF,开放中断:•STI指令可以将中断允许位IF置1,打开中断。只有中断打开时,CPU才会响应从INTR引脚输入的,也就是从8259A发来的可屏蔽中断请求38(4)其他设置:•主程序还应该为中断服务程序使用的指针、计数器等设置初值。在中断方式输入输出结束后,进行必要的结束处理392.中断服务程序•中断服务程序的主要操作步骤:(1)保存寄存器内容:(2)开放中断(3)中断服务(4)关中断(CLI)(5)发送中断结束命令(6)恢复寄存器内容(7)中断返回40•实际应用中,经常要用到“定时”:确定某个操作所需要的时间:例如,测量电机的转速。定时启动某个操作:例如,定时采集温度、压力等数据•PC微机内部“定时器”:每55ms(1/18.2秒)产生一个“时间到”信号,向8259A申请中断。该中断类型号为09H,主要用于操作系统的定时操作•为了满足用户的定时需要,另设了一个1CH中断,每次进入09H中断后,由该中断服务程序通过执行指令“INT1CH”进入1CH中断,执行用户的定时中断服务程序8.2.3定时中断41•用户的定时任务实现方法:保存原1CH中断向量;把新的1CH中断服务程序入口地址填入中断向量表;编制新的1CH中断服务程序:首先执行新增加的定时任务,完成后进入原中断服务程序,执行其它的定时任务。•[例8.4]:在屏幕上显示一个实时时钟,限于篇幅,只显示时钟的“秒”值42;EX804.ASM定时中断,显示实时时钟(秒值)INCLUDEYLIB.H;头文件,包含外部函数与宏的定义;***************************************CODESEGMENTASSUMECS:CODESECONDDB0;秒值SIGNALDB0;1秒时间到标记COUNTDW0;毫秒值OLDINT1CHDD?;原来1CH中断向量43START:MOVAL,1CH;取原来1CH中断向量MOVAH,35HINT21HMOVWORDPTROLDINT1CH+2,ES;保存原中断向量MOVWORDPTROLDINT1CH,BX;********************************LEADX,MYINT1CH;取新向量偏移地址MOVAX,SEGMYINT1CH;取新向量段地址MOVDS,AXMOVAL,1CHMOVAH,25HIN