80X86汇编语言程序设计华中科技大学计算机学院2010年6月第六章输入/输出和中断本章的学习内容:本章学习在几种新的计算机资源下的汇编语言程序设计技术,包括:•(1)输入输出指令的使用格式及功能•(2)主机与外部设备之间传送数据的方式•(3)中断的概念及中断处理程序设计通过本章的学习,有助于深入系统的核心,充分发掘系统的资源,有效发挥汇编语言的优势第六章输入/输出和中断本章的学习重点:(1)输入输出指令IN、OUT的使用格式及功能(2)中断矢量表,中断处理程序的编制方法第六章输入/输出和中断本章的学习难点:(1)输入输出指令中的地址表示方法(2)中断矢量表的作用、存取方法(3)中断处理程序的安装、驻留、调试6.1输入/输出输入/输出回顾:方法:利用“21H”DOS系统功能调用实现输入和输出特点:不需要考虑I/O处理细节及I/O设备特性,也不必了解主机与外设之间传输数据的方式,只需要按约定准备输入参数问题:DOS的“21H”系统功能调用无法实现对其它外设的控制,需要运用I/O指令实现对I/O设备的控制6.1输入/输出I/O设备通过接口连接到主机每个接口由外部设备的一组寄存器组成•设备状态寄存器•设备控制寄存器•数据寄存器寄存器在主机都对应有一个称为I/O端口的地址编码主机外设CPU内存I/O存储空间(端口)接口I/O操作6.1输入/输出地址总线数据总线控制总线CPU内存地址译码内存单元00FFFFFFFFH内存读写I/O地址译码00FFFFHI/O读写外部设备状态端口控制端口数据端口6.1输入/输出I/O端口的地址空间允许设置64K个8位端口或32K个16位端口I/O端口地址分配,可以查手册•每个外设的所有寄存器都对应一个I/O地址•所有外设的所有寄存器都对应不同的I/O地址对I/O空间的访问用IN或OUT两个指令6.1.1数据传送方式I/O设备与主机的信息交换传送的信息分为:控制信息•CPU把控制信息从端口输出到对应外设接口的控制寄存器中,告诉外设应做什么状态信息•把外设的状态寄存器中的内容送到对应的端口中,以便CPU了解外设状态数据信息•需要交换的数据(8位、16位)6.1.1数据传送方式I/O设备与主机的信息传送方式分为:直接控制传送方式•包括无条件传送和查询传送两种,都直接在端口上利用IN和OUT指令传送数据中断传送方式•在DOS及BIOS层上通过系统功能调用的中断指令实现直接存储器方式DMA•在端口上,采用通道技术实现6.1.1数据传送方式无条件传送方式:不查询外设状态寄存器的状态,直接用IN或OUT指令实现CPU与外设信息传送特点:CPU与外设必须同步工作查询传送方式:查询外设状态和控制寄存器中的内容,确定是否传送特点:CPU与外设不同步6.1.1数据传送方式中断数据传送方式:解决查询传送方式下,CPU等待外设,浪费大量CPU资源的问题中断传送方式的优点:提高CPU效率可以处理突发事件提高了计算机工作的灵活性在中断方式下,程序设计的主要任务:设置中断向量、编制中断处理程序6.1.2输入/输出指令输入:从外部设备向计算机传送信息,也即将外部设备寄存器中的数据送至累加器AL/AX/EAX或主存储器中输出:从计算机向外部设备传送信息,也即将AL/AX/EAX或主存储器中的数据送至外设寄存器中6.1.2输入/输出指令输入指令IN语句格式:INOPD,OPS功能:(OPS)→累加器OPD说明:①当外设寄存器的地址=255时,OPS=立即数或者DX表示待访问的端口地址。当外设寄存器的地址255时,OPS只能用DX表示②OPD只能是累加器AL、AX或EAX。即:INAL/AX/EAX,OPS6.1.2输入/输出指令例:INAL,60H执行前:(60H)=11H,(AL)=0E3H执行后:(AL)=11H,(60H)不变说明:60H是键盘将当前按键的键码输入到计算机内的端口的地址。该指令语句从60H号端口中读取一个字节的键码送到AL中,即(60H)→AL当(DX)=60H时,INAL,DX等价于INAL,60H6.1.2输入/输出指令输出指令OUT语句格式:OUTOPD,OPS功能:累加器(OPS)→OPD说明:OPD=立即数或者DXOPS只能是累加器AL、AX或EAX即:OUTOPD,AL/AX/EAX6.1.2输入/输出指令例:OUT80H,EAX执行前:(EAX)=11223344H,(80H)=55H,(81H)=66H,(82H)=77H,(83H)=88H执行后:(80H)=44H,(81H)=33H,(82H)=22H,(83H)=11H,(EAX)不变6.1.2输入/输出指令说明:I/O空间的访问不存在分段的问题(不使用段寄存器)在输入/输出指令中,寻址方式的表示形式不同于第二章的格式规定•用立即数表示的端口地址形式实际相当于第二章中的直接寻址方式•用寄存器表示的端口地址形式实际相当于第二章中的寄存器间接寻址方式6.2中断中断是一种使CPU中止正在执行的程序,而转去处理特殊事件的操作,处理结束之后,又返回到断点处继续往下执行K:…DK:…现行程序.........处理事件的子程序响应随机发生的事件处理结束,返回断点①中断请求②中断响应③中断处理④中断返回6.2.1中断的概念引起中断的事件称为中断源处理事件的程序称为中断处理程序实现中断功能的软硬件设施称为中断系统硬件设施•中断控制器8259A软件设施•中断向量表、中断处理程序6.2.1中断的概念中断源外部中断内部中断软中断(INTn)CPU错误中断单步中断不可屏蔽中断NMI可屏蔽中断INTR6.2.1中断的概念中断源NMIINTR不可屏蔽中断请求中断逻辑除法出错溢出中断软中断单步中断中断控制器8259A系统定时器键盘打印机CPU可屏蔽中断请求……6.2.1中断的概念中断优先级中断/异常类型优先级除调试故障以外的异常异常指令INTO、INTn、INT3对当前指令的调试异常对下条指令的调试异常NMIINTR最高最低6.2.1中断的概念中断号(类型码):0-255(一个字节256个)中断号名称类型相关指令DOS下名称0除法出错异常DIV,IDIV除法出错1调试异常异常任何指令单步2非屏蔽中断中断-非屏蔽中断...............20H~2FH其它软/硬件中断DOS使用0~0FFH软中断异常INTn软中断6.2.2中断向量表中断向量表就是各种中断类型的处理程序的入口地址表实方式下中断向量表占用内存中从00000H~003FFH的存储空间,用于存放中断向量,共256项,对应于中断类型号0~255,每个类型的中断占4个字节如:INT4AH,中断向量地址=4AH*4=128H6.2.2中断向量表类型0中断处理程序入口地址类型1中断处理程序入口地址类型2中断处理程序入口地址┇类型255中断处理程序入口地址IPCS00000H┇00004H003FCH003FFH┇00008H┇主存中断号为1的中断处理程序的代码段6.2.2中断向量表CPU转到中断处理程序的主要步骤:(1)获取中断类型码n(2)从中断矢量表中获取入口地址(0:[n*4])→IP(0:[n*4+2])→CS以上2步解决了如何获得入口地址的问题(3)返回地址的处理、标志寄存器等的处理6.2.3软中断及有关指令软中断通过程序中的软中断指令实现,所以又称它为程序自中断指令格式:INTn;n取值范围0~255功能(实方式):(FLAGS)→↓(SP),0→IF、TF(CS)→↓(SP),(4*n+2)→CS(IP)→↓(SP),(4*n)→IP6.2.3软中断及有关指令例:“INT21H”用来调用DOS系统功能,每当执行这条指令时,便产生类型号为21H的中断,执行事先安排好的中断处理程序。堆栈中信息的布局情况如下:SP→┇中断前的(IP)中断前的(CS)中断前的(FLAGS)┇中断前的(IP)=断点(IP)=返回地址值6.2.3软中断及有关指令中断返回指令IRET指令格式:IRET功能(实方式):↑(SP)→(IP)↑(SP)→(CS)↑(SP)→(FLAGS)6.2.3软中断及有关指令可屏蔽中断INTR的关闭和开启…MOVSS,AXMOVSP,BX…CLIMOVSS,AXMOVSP,BXSTI在进行不能打断的操作前一定要先关闭中断(CLI指令使IF=0,不会响应INTR了),做完之后STI6.2.4中断处理程序的设计中断处理程序的设计主要包括:为尚未分配功能的中断号设计一个中断处理程序修改已有的中断处理程序以扩充其功能6.2.4中断处理程序的设计新增一个中断处理程序的步骤(实方式):根据功能编制中断处理程序,编制方法与子程序的编制方法类似,远过程,IRET为软中断找到一个空闲的中断号m;或根据硬件确定中断号将新编制的中断处理程序装入内存,将其入口地址送入中断矢量表4*m~4*m+3的四个字节中使用该中断:INTm6.2.4中断处理程序的设计修改(接管)已有中断处理程序以扩充其功能:根据扩充功能的要求编制程序段将新编制的程序段装入内存,把待扩充功能的已有中断处理程序的入口地址复制到新编制的程序段中,用新编制程序段的入口地址取代中断矢量表中已有中断处理程序的入口地址6.2.4中断处理程序的设计修改(接管)已有中断处理程序以扩充其功能:根据扩充功能的要求编制程序段将新编制的程序段装入内存,把待扩充功能的已有中断处理程序的入口地址复制到新编制的程序段中,用新编制程序段的入口地址取代中断矢量表中已有中断处理程序的入口地址例:新增80H号软中断,实现输出回车换行,并常驻内存。1..3862.CODESEGMENTUSE163.ASSUMECS:CODE,SS:STACK4.NEW80H:5.MOVDX,0AH6.MOVAH,27.INT21H8.MOVDL,0DH9.INT21H10.IRET11.START:XORAX,AX12.MOVDS,AX;0→DS13.CLI;关中断14.MOVWORDPTRDS:[80H*4],OFFSETNEW80H15.MOVDS:[80H*4+2],CS;将新的段值送到中断矢量表16.STI;开中断例:新增80H号软中断,实现输出回车换行,并常驻内存。17.MOVDX,OFFSETSTART+15;加15是为了便于向上取整18.MOVCL,419.SHRDX,CL20.ADDDX,100H;驻留的长度还需包括程序段前缀的内容(100H个字节)21.MOVAL,0;退出码为022.MOVAH,31H;退出时,将(DX)节的主存单元驻留23.INT21H24.CODEENDS25.STACKSEGMENTUSE16STACK26.DB200DUP(0)27.STACKENDS28.ENDSTART例:新增80H号软中断,实现输出回车换行,并常驻内存。以下为新增80H号软中断的测试程序1..3862.STACKSEGMENTUSE16STACK3.DB200DUP(0)4.STACKENDS5.DATASEGMENTUSE166.HELLODB'HOWAREYOU!$'7.DATAENDS8.CODESEGMENTUSE169.ASSUMECS:CODE,DS:DATA,SS:STACK10.BEGIN:MOVAX,DATA11.MOVDS,AX12.LEADX,HELLO13.MOVAH,914.INT21H15.INT80H16.INT80H17.MOVAH,4CH18.INT21H19.CODEENDS20.ENDBEGIN例:请通过修改DOS提供的键盘输入功能,禁止其它DOS程序使用键盘输入。1..3862.CODESEGMENTUSE163.ASSUMECS:CODE,SS:STACK4.OLD_INTDW?,?;存放老中断向量5.NEW21H