1第六章输入/输出和中断和WIN32编程前面已经讲过有关输入/输出的问题,主要是用DOS中断调用INT21H来完成键盘输入以及屏幕显示。对于计算机来说,仅有这种输入/输出还不够,因为DOS的中断调用无法实现对其它外设的控制。关于如何用汇编程序实现主机与外设之间的信息交换,将是本章的主要内容。包括:输入输出指令的使用格式及功能;主机与外部设备之间传送数据的方式;中断的概念及中断处理程序设计;WIN32程序设计基本方法与技术。6.1I/O设备与数据传送方式一.主机与外设之间数据的传送方式计算机与外设之间传送数据有如下4中方式:1.无条件传送方式:适合于CPU与外设同步的情况。直接传送,高速外设与主机之间数据传送。22.查询传送方式:适合于低速外设与主机之间数据传送。3.中断传送方式:适合于低速外设与主机之间数据传送。4.直接存贮器(又称DMA)传送方式:适合于高速外存与主机的数据传送。其中:无条件传送和查询传送,直接在端口上利用IN和OUT指令传送数据。中断传送:在DOS及BIOS层上通过系统功能调用的中断指令实现。直接存贮方式:在端口上,采用通道技术实现。在计算机准备好接收,外设准备好传送数据时,外设向CPU发一个请求DMA传送信号,此时CPU让出总线控制权,使外设与主存在短时间内成批传送数据。二.外设与主机传送的接口与信息1.端口与接口计算机的外设都是通过接口连接到系统上,每个接口由一组寄存器组成,寄存器都有一个称为I/O端口的地址编码。也就是,每一台外设都通过硬件接口与主机端口相连,并交换信息。3接口的组成:设备状态寄存器、设备控制寄存器、数据寄存器。上述寄存器在I/O空间中都有固定编码。I/O端口的地址空间:允许设置64K个8位端口或32K个16位端口。对I/O空间的访问用IN或OUT两个指令。I/O端口地址分配,可以查手册。如:40H~43H时钟/定时器,60H~63H为8255通讯芯片的接口。2.外设与主机的信息交换传送的信息分为三类:①控制信息:CPU把控制信息从端口输出到对应外设接口的控制寄存器中,告诉外设应做什么。②状态信息:把外设的状态寄存器中的内容送到对应的端口中,以便CPU了解外设状态。③数据信息:需要交换的数据(8位、16位)。主机外设CPU内存I/O存贮空间(端口)接口I/O操作46.2程序直接控制I/O方式直接I/O方式有两种:①无条件传送方式:不查询外设状态寄存器的状态,直接用IN或OUT指令实现CPU与外设信息传送。该方式的特点是:CPU与外设必须同步工作。②查询传送方式:查询外设状态和控制寄存器中的内容,确定是否传送。特点:CPU与外设不同步。一.IN和OUT指令通过前面的学习,我们已经知道,外设与主机传送信息,必须用IN和OUT指令。1.输入指令IN功能:从外设寄存器取信息送入AX或AL。4种形式:INAL,PORT功能:(PORT)→ALINAX,PORT功能:(PORT+1,PORT)→AXINAL,DX功能:([DX])→ALOUTIN外设主机5INAX,DX功能:([DX])→AX由AL或AX决定取几个端口的内容。2.输出指令OUT功能:将AX或AL内容送到外设寄存器中。4种形式:OUTPORT,AL功能:(AL)→PORTOUTPORT,AX功能:(AX)→PORT(2个8位口)OUTDX,AL功能:(AL)→[DX]OUTDX,AX功能:(AX)→[DX]同样,由AL或AX决定送到几个端口。如:INAL,40HOUT80H,ALMOVDX,379HINAL,DX注意:端口地址>255,就放到DX中。二.程序直接控制传送方式1.无条件传送方式特点:不查询外设状态,直接用IN和OUT指令传送信息。采6用这种方式,必须保证外设与CPU在传送数据的过程中,具有相同速度(同步)。例:扬声器发声程序。已知扬声器的控制寄存器的端口地址为61H,硬件结构如下:程序通过I/O指令,使设备控制寄存器的b1位为0或1(交替为0或1),与门的输入为0和1交替的电信号,输出为一个脉冲电流,经放大后,送扬声器使之发声。端口61H071/00控制其它外设2号定时器门控与门放大器扬声器72.查询传送方式特点:查询外设状态,条件满足时传送。适合于低速外设与CPU传送信息。①输入输入之前,查询数据是否准备好,若准备好则输入,否则等待。流程:STACKSEGMENTSTACKDB200DUP(0)STACKENDSCODESEGMENTASSUMECS:CODE,SS:STACKBEGIN:MOVDX,100;开关次数100INAL,61HANDAL,11111100B;最低2位变为0S1:XORAL,2;第1次b1为0,第2次b1为1OUT61H,ALMOVCX,140H;延时一段时间(声音频率)WAIT1:LOOPWAIT1DECDXJNES1MOVAH,4CHINT21HCODEENDSENDBEGIN8例:串行通讯I/O。串行通讯端口:采用8250芯片,数据寄存器端口地址为3F8H,状态寄存器端口地址为3FDH,其中b0位是输入数据数据准备位,b5位是输出数据准备位。串行口输入程序:②输出输出之前,要查询外设是否“忙”,若“忙”则等待,否则输出数据。YN输入的状态信息准备好?输入数据C_INPROCFARPUSHDXMOVDX,3FDHC1:INAL,DX;读入状态TESTAL,01H;测试b0位,b0=1,数据准备好JZC1MOVDX,3F8HINAL,DX;接收一个字符POPDXRETC_INENDP9流程:例:串行口输出子程序。查询方式的缺点:CPU反复等待状态位,浪费大量CPU资源。6.3中断传送方式为了解决查询方式下,CPU等待外设,浪费大量CPU资源的问题,提出了中断传送方式。引入中断之后,有如下优点:YN输入的状态信息外设忙?输出数据C_OUTPROCFARPUSHDXPUSHAXMOVDX,3FDHC2:INAL,DX;读入状态TESTAL,20H;测试b5位,b5=1,准备好接收JZC2POPAXMOVDX,3F8HOUTDX,AL;输出一个字符POPDXRETC_OUTENDP10①提高CPU效率②可以处理突发事件③提高了计算机工作的灵活性在中断方式下,程序设计的主要任务:设置中断向量、编制中断处理程序。一.中断的概念中断是一种使CPU中止正在执行的程序,而转去处理特殊事件的操作,处理结束之后,又返回到断点处继续往下执行。中断的处理过程:①中断请求、②中断响应、③中断处理、④中断返回。中断系统:实现中断的软硬件设施。其中,硬件有:8259A、中断源、中断请求等。软件有:中断向量表、中断处理程序。二.中断源(内中断/外中断)内中断来自CPU内部事件:①程序中使用的INT指令产生的中断;②CPU的某些错误结果产生的中断(除法、溢出、单步)。11内中断的处理特点:①中断类型号一般在指令中;②不受中断允许标志位IF的影响。外中断由外设控制器、协处理器等CPU以外的事件引起的中断,称为外中断。外中断的处理特点:①中断类型号由8259A提供,或由自制电路来提供;②受中断允许标志位IF的影响(IF=1,响应中断)。8086/8088中断源:不可屏蔽中断请求由硬件故障引起:掉电、存贮器错、总线奇偶校验错等。8086系统中断优先级:NMIIR0INTR…F89不可屏蔽中断请求中断逻辑除法出错溢出中断软中断单步中断中断控制器8259A系统定时器键盘打印机IR7CPU可屏蔽中断12其中,“INTn”可处理256种中断,n的范围:BIOS中断:10H~1FHDOS中断:20H~3FH自由中断:40H~FFH三.中断向量表1.中断向量表的结构中断向量表就是各种中断类型的处理程序的入口地址表。内存中从00000H~003FFH用于存放中断向量表。中断类型:0~FFH,每个类型的中断占4个字节。如:INT4AH中断向量地址=4AH*4=128H高低除法错、INTO(溢出中断指令)、“INTn”单步中断NMIINTR132.中断类型号的获取(1)除法错、单步中断、不可屏蔽中断NMI、断点中断、溢出中断(中断号0~4)。中断类型号由CPU芯片内的部件自动提供。(2)软中断INTn,执行时从指令流中读出类型号。(3)外中断①标准外设,利用8259A提供的类型号;②非标准外设,自制电路通过接口提供给总线,获得类型号。3.设置或取出中断向量指令(1)设置中断向量指令功能:把由AL指定的中断类型的中断向量DS:DX放入中断向量表中。(AH)=25H(AL)=中断类型号中断处理F000:18050:12BH0:12AH0:129H0:128H…051800F0…IPCSDEBUG执行后,用D命令查看:―D0:0↙执行INT4AH时:IP=1805HCS=F000HIRET14DS:DX=中断向量INT21H(2)取出中断向量指令功能:把AL中指定的中断类型的中断向量从中断向量表中取出送到ES:DX中。(AH)=35H(AL)=中断类型号INT21H4.保护方式下的中断向量表在保护方式下,中断矢量表称作中断描述符表(IDT),按照统一的描述符风格定义其中的表项;每个表项(称作门描述符)存放中断处理程序的入口地址以及类别、权限等信息,占8个字节,共占用2KB的主存空间。IDTR决定IDT的起始PA。15四.软中断及中断的有关指令1.软中断形式:INTn功能:①(FLAGS)→↓(SP)同时0→IF、TF16②(CS)→↓(SP)(4*n+2)→CS③(IP)→↓(SP)(4*n)→IP2.中断返回形式:IRET。功能:①↑(SP)→IP②↑(SP)→CS③↑(SP)→FLAGS五.举例用空闲的中断类型号45H,做新增的软中断类型号,实现功能:将AX中的内容以十六进制形式在屏幕上输出。实现步骤:(1)按指定功能编制中断处理子程序(2)在中断向量表中,找出一个空闲的中断号N(3)将新编制的中断处理子程序的入口地址送入中断向量表4*N~4*N+3这四个字节中(4)调用“INTN”调用N号中断,执行新增的中断处理子程序17.386STATCKSEGMENTUSE16STACKDB200DUP(0)STACKENDSDATASEGMENTUSE16DATAENDSCODESEGMENTUSE16ASSUMECS:CODE,SS:STACK,DS:DATASTART:MOVAX,0MOVDS,0CLIMOVWORDPTRDS:[45H*4],OFFSETINTR45MOVWORDPTRDS:[45H*4+2],CSSTIMOVAX,DATAMOVDS,AXLEASI,BUFMOVCX,NL1:MOVAX,[SI]INT45HMOVAH,2MOVDL,20HINT21HADDSI,2LOOPL1MOVAH,4CHINT21HINTR45PROCFARPUSHA;16进制输出AX中的内容POPAIRETINTR45ENDPCODEENDSENDSTART18注意:(1)在中断处理子程序中,必须保护和恢复现场(2)设置中断向量前CLI,设置中断向量后CLI(3)利用IRET实现中断返回6.4WIN32编程一.WIN32编程基础1.段的简化定义(1)使用简化的段定义后,16位程序结构如下:(2)使用简化的段定义,32位程序结构如下:.MODELSMALL.386.STACK200.DATA….CODESTART:MOVAX,@DATAMOVDS,AX…MOVAH,4CHINT21HENDSTART192.控制伪指令32位汇编提供了类似高级语言的分支控制伪指令和循环控制伪指令(1)分支控制伪指令格式:.IF条件表达式语句序列[.ELSEIF条件表达式语句序列][.ELSE语句序列].ENDIF.386.MODELFLATSTDCALLOPTIONCASEMAP:NONEINCLUDEKENEL32.INCINCLUDEUSER32.INCINCLUDEGDI32.INCINCLUDEKERNEL32.LIBINCLUDEUSER32.LI