汇编语言程序设计:第5章 输入输出和中断_第1页
汇编语言程序设计:第5章 输入输出和中断_第2页
汇编语言程序设计:第5章 输入输出和中断_第3页
汇编语言程序设计:第5章 输入输出和中断_第4页
汇编语言程序设计:第5章 输入输出和中断_第5页
已阅读5页,还剩124页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第5章 输入输出和中断5.1 I/O设备数据传送方式5.2 中断传送方式5.3 BIOS中断调用方式5.4 综合举例开 始5.1 I/O设备数据传送方式 5.1.1 端口寻址方式 5.1.2 CPU与外设的传送方式返回本章目录5.1.1 端口寻址方式 接口芯片实际占用的端口数目端口号(16进制)8237DMA控制器16000F8259A中断控制器220218255并行接口46063DMA页面寄存器(74LS670)48083NMI寄存器1A08253计数器/定时器44043表5.1 IBM-PC接口芯片的端口地址分配表返回本节5.1.2 CPU与外设的传送方式控制信息:是由CPU发送给外部设备

2、的,命令其处于某种方式或执行某种操作。状态信息:从接口输入的状态信息表示I/O设备当前的状态。数据信息则是I/O设备和CPU真正要交换的信息。数据信息可分为三种类型:数字量、模拟量和开关量。各种外设的工作速度相差很大,根据其工作状态,大致可分为三类:l外设的工作状态是可以确定的。l 外设的工作状态是不能确定的。l高速的外设与计算机进行数据交换。CPU与外设之间传输数据的控制方式有三种:即程序方式、中断方式和DMA方式。 1程序方式(1)无条件传输方式,如图5.1所示。【例5.1】用一个8位输出锁存器控制8个发光二极管,使发光管从上向下依次一个一个地闪亮,每个发光管亮一段规定的时间。设输出锁存器

3、的地址为84H。图5.1 用无条件传送方式的例子控制程序如下:START:MOV AL,01H;控制代码01HALNEXT:OUT84H,AL;(AL)84H CALLDELAY ;延时一定时间ROLAL,1;控制代码循环左移1位JMPNEXT;无条件转NEXT继续程序循环DELAY:PROC ;定义延时子程序DELAYPUSHAX MOVAX,COUNT TIME: DECAX (2)条件传送方式JNZTIME POPAX RET ;返回调用程序DELAY ENDP ;子程序调用结束 【例5.2】假设从某输入设备上输入一组数据送缓冲区,接口电路如图5.2所示:程序如下:DATASEGMENT

4、MESSIDB “BUFFER OVERFLOW”, “$”BUFFDB 60 DUP(?)DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVBX,OFFSET BUFF;送缓冲区指针MOVCX,60;送计数初值OUT0FCH,AL;启动设备WAIT:INAL,0FAH;查询状态,READY=0,则等待TESTAL,01HJZWAITWAIT:INAL,0FAH;查询状态READY=0,则等待TESTAL,01HJZWAITINAL,0F8H;输入数据MOVBX,ALINCBXLOOPWAIT;检测缓冲区是否

5、满,不满再输入MOVDX,OFFSET MESSI;缓冲区满,输出标志字符串。MOVAH,09H INT21HMOVAH,4CH INT21HCODEENDS ENDSTART图5.2 查询式输入接口电路CPU打印机控制器打印机DBSTBBUSYCB DB AB图5.3 打印机连接示意图 【例5.3】向打印机输出字符。 图5.4 例5.3程序流程图源程序:MOVBX ,OFFSET, BUFFER;置缓冲区偏移量MOVCX,CHRTL;置输出字符计数器BG:MOVAL,BX;取字符MOVDX,378H;输出字符到控制器OUTDX,ALMOVDX,379H;读打印机状态WT:INAL,DXTES

6、TAL,80H ;判忙否?JZWT ;忙,重查询MOVDX,37AH ;形成选通信号MOVAL,0DH ;令打印机打印字符OUTDX,AL MOVAL,0CHOUTDX,ALINCBX;指向下一输出字符LOOPBG 2中断方式当外设需要与CPU进行数据交换时,由外设向CPU发出中断请求,当外部设备完成一次输入或输出操作后,主动向CPU报告(即中断请求),请求CPU为它服务。允许CPU启动多个外设工作,即允许CPU与多个外设同时工作。3直接存储器存取方式(DMA)方式DMA方式,主要是利用DMA控制器来管理数据的输入输出操作。如图5.5、5.6所示。由DMA控制器向地址总线发出存储器地址信号,并

7、给出存储器读或写命令,就可以把存储器中读出的数据送到外部设备或者把外部设备输出的数据写入存储器中。DMA主要是利用程序实现对DMA控制器的初始化(置控制字),然后由DMA控制器管理数据传送。存储器外部设备CPUDMA请求DMA响应HOLDHLDADMA控制器 图5.5 DMA控制器与CPU关系图 图 5.6 DMA方式工作过程图返回本节5.2 中断传送方式5.2.1 概述5.2.2 80868088的中断系统返回本章目录5.2.1 概述1中断、中断源及中断系统2中断的作用(1)并行操作(2)实时处理(3)故障处理3中断源种类及中断类型(1)中断源的种类 l硬件故障l 输入/输出设备l外部事件(

8、2)中断类型根据是否可屏蔽,分为不可屏蔽中断和可屏蔽中断。根据位置不同分为内中断和外中断。根据处理程序入口的方法,分为向量中断和非向量中断。根据产生中断的原因,又分为软件中断和硬件中断。4. 中断优先级和中断嵌套IBM-PC规定中断的优先级次序为:优先级高 内中断(语法错,INT0,INT) 非屏蔽中断(NMI) 可屏蔽中断(INTR) 低 单步中断图5.7中断嵌套程序执行过程。主程序高级中断程序更高级中断程序高级中断程序低级中断程序.中断处理过程微型机在运行程序的过程中,若出现中断申请时,CPU及时地择优响应,立即停止现行程序的执行,并保护现场,接着进行相应的中断服务。服务完毕之后,立即恢复

9、被中断的现场,返回被中断程序的断点,继续往下执行。中断处理大致包括如下过程:中断请求、中断响应、中断处理及中断返回。返回本节5.2.2 80868088的中断系统1中断源80868088系统设有如下的中断源:l外部中断:包括可屏蔽中断INTR和不可屏蔽中断NMI。l 内部中断:包括除法错中断、溢出中断、软中断、和单步中断。其中断源间的关系如图5.8所示。 图5.8 8086/8088的中断源 (1)内部中断内部中断简称内中断,又称软件中断。它不需要外部硬件支持。并且不受中断标志位状态的影响。8086/8088内部中断有以下5种: l 除数为中断类型0中断 l 单步中断类型1中断 l 断点中断类

10、型3中断 l 溢出中断类型4中断 l 中断指令指令INTn中断(2)外部中断l不可屏蔽中断:常用于紧急故障处理或紧迫事件处理中。l可屏蔽中断:可屏蔽中断的设置主要是为了实现多中断的处理和中断嵌套的应用。2中断向量和中断向量表图5.9 8086/8088系统的中断向量表表5.2 常用中断类型用其名称3设置中断向量用指令来为中断类型N设置中断向量:MOVAX,0MOVES,AX MOVBX,N*4;中断入口地址MOVAX,OFFSET INTHANDMOVES:WORD PRTBX,AX;设置中断处理程序INTHANDMOVAX,SEG INTHAND;的入口地址MOVES:WORD PRTBX+

11、2,AXINTHAND:;中断处理程序 IRET【例5.4】使用DOS功能调用存取中断向量。MOVAL,N MOVAH,35H;调用DOS功能35HINT21HPUSHES ;保存原中断向量PUSHBX PUSHDSMOVAX,SEG INTHANDMOVDS,AX;置用户定义的中断处理MOVDX,OFFSET INTHAND;程序INTHAND的入口MOVAL,N;地址(段地址和偏移地址)MOVAH,25H ;设置新的中断向量INT21H POPDS POPDX;恢复原中断向量POPDS MOVAL,N MOVAH,25H INT21HRET INTHAND:;中断处理程序IRET4中断过程

12、当中断发生时,由硬件自动完成下列动作:(1)取中断类型号N。(2)标志寄存器(PSW)内容入栈。(3)当前代码段寄存器(CS)内容入栈。(4)当前指令计数器(IP)内容入栈。(5)禁止外部中断和单步中断(IF=0,TF=0)。(6)从中断向量表中取4*N的字节内容送IP,取4*N+2的字节内容送CS。(7)转中断处理程序。 图5.10中断响应过程58259A可编程中断控制器例如,只允许打印机中断,可设置如下中断字:MOVAL,01111111B OUT 21H,AL如果系统要新增设打印机中断,则可用下列指令实现:IN AL,21H ANDAL,01111111BOUT21H,AL结束外中断用下

13、面的指令: MOVAL,20H OUT20H,AL 6中断处理程序图5.11 中断屏蔽寄存器和中断命令寄存器下面是主程序为中断所做的准备工作和硬件,(包括CPU和外设接口)自动完成的动作。(1)设置中断和向量。(2)设置设备的中断屏蔽位。(3)设置CPU的中断允许位IF(开中断)。(4)外设接口送中断请求给CPU。(5)当前指令执行完成后,CPU送响应信号给外设接口。(6)CPU接收中断类型号。(7)当前的PSW,CS和IP保存入栈。(8)清除IF,TF。(9)中断向量送IP和CS。编写中断处理子程序的步骤,请注意与子程序编写的一些不同之处。(1)保存寄存器内容。(2)如允许中断嵌套,则开中断

14、(STI)。(3)处理中断。(4)关中断。(5)送中断结束命令(EOI)给中断命令寄存器。(6)恢复寄存器内容。(7)返回被中断的程序(IRET)。【例5.5】编一段中断处理程序,在主程序运行的过程中,每隔10秒钟响铃一次,同时在屏幕上显示“The bell is ring!”。编程如下:DATASEGMENTCOUNTDW 1MESSDB The bell is ring!,0DH,0AH,$DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATA,ES:DATAMAINPROC FARSTART:PUSHDSSUBAX,AXPUSHAXMOVAX,DATAMOVD

15、S,AXMOVAL,1CH;取中断向量MOVAH,35HINT21HPUSHES;存原中断向量段址PUSHBX;存原中断向量偏移量PUSHDSMOVDX,OFFSET RING;新偏移量送DXMOVAX,SEG RINGMOVDS,AX;新段址送DSMOVAL,1CHMOVAH,25HINT 21H;写入新的中断向量POP DSIN AL,21H;读取中断屏蔽字ANDAL,11111110B;允许定时器中断OUT21H,ALSTI;开中断MOVDI,2000DELAY:MOV SI,3000;延时 DELAY1:DECSIJNZDELAY1DECDIJNZDELAYPOPDX;恢复原中断向量P

16、OPDSMOVAL,1CHMOVAH,25HINT21HRETMAINENDPRING:PROCNEARPUSHDS;各工作寄存器内容入栈PUSHAXPUSHCXPUSHDXMOVAX,DATAMOVDS,AXSTIDECCOUNT;计秒值JNZEXITMOVDX,OFFSET MESSMOVAH,09HINT21HMOVDX,100INAL,61HANDAL,0FCHSOUND:XORAL,02OUT61H,AL;扬声器发声MOVCX,140HWAIT1:LOOPWAIT1;延时等待DECDXJNESOUNDMOVCOUNT,182EXIT:CLI;关中断POPDXPOPCXPOPAXPOP

17、DSIRET;中断返回RINGENDPCODEENDSENDSTART返回本节5.3 BIOS中断调用方式5.3.1 概述5.3.2 常用BIOS功能调用5.3.3 图形显示程序设计返回本章目录5.3.1 概述BIOS使用的中断类型号为10H 1FH。下面给出BIOS中断调用表(见表5-3)。BIOS中断调用方法:调用BIOS程序模块,需要给出入口参数(有的调用无入口参数)。然后通过跟有中断类型号的软中断指令调用,经中断向量表取出调用模块的入口地址,就可自动地转入相应的BIOS处理模块中去了。表5.3 BIOS中断调用表返回本节5.3.2 常用BIOS功能调用1键盘I/O中断调用(16H中断调

18、用)16H中断调用有三个功能,功能号为02。(1)AH=0 本功能为从键盘读字符到AL寄存器中。(2)AH=1 本功能为读键盘缓冲区字符到AL寄存器中,并置ZF标志位。(3)AH=2 本功能为读取特殊功能键的状态。2打印机I/O中断调(17H中断调用)17H中断调用有三个功能,功能号为02。(1)AH=0 本功能为把AL中指定的字符在打印机上打印出来。(2)AH=1 本功能为对指定的打印机初始化。(3)AH=2 本功能为读取打印机的状态信息。MOVDX,0;用0号机打印机MOVAL,A;输出A字符MOVAH,0;0号功能INT17H;调用17H中断TESTAH,08H;判I/O错否JNZIOE

19、R;有错,转错误处理 JOER:【例5.6】打印机输出一字符,判I/O错否。如错,转错误处理程序段。3时钟中断调用(1AH中断调用)1AH中断调用有二个功能。功能号为0和1。(1)AH=0 本功能为读取时钟计数器的当前值。(2)AH=1 本功能为设置时钟计数器的当前值。【例5.7】计算程序执行时间。图5.12给出有关程序段流程图。执行测试程序段TDB0;时单元MDB0;分单元SDB0;秒单元取时间计数器值TNEQU65520;小时运算数MNEQU1092;分钟运算数计算执行时间为时、分、秒SNEQU18;秒运算数转换为BCD时间MOV CX,0;置时钟计数器MOVDX,0;初值为0显示时间MO

20、VAH,1INT1AH ;被测程序段. MOVAH,0;取时钟计数器当前值INT1AHCALLTDIV;计算当前执行时间子程序CALLTBCD;转为BCD数子程序CALLTDISP;显示执行时间子程序被测程序段.;其他处理图5.12 例5-7程序段流程图【例5.8】生成随机数程序。源程序:RANDPROCPUSHCXPUSHDXPUSHAXSTIMOVAH,0;读时钟计数器值INT 1AHMOVAX,DX;清高6位ANDAH,3MOVDL,101;除101,产生0100余数DIVDLMOVBL,AH;余数存BX,作随机数POPAXPOPDXPOPCXRETRANDENDP返回本节5.3.3 图

21、形显示程序设计10H中断调用共有16个功能。功能号为015。(1)设置显示方式(0号功能)入口参数:AH=0(功能号),AL=设置方式(07)。出口参数:无。(2)设置光标类型(1号功能)入口参数:AH=1(功能号),CH=光标开始行,CL=光标结束行。出口参数:无。根据CX给出光标的大小。AL显示方式04025黑白文本方式14025彩色文本方式28025黑白文本方式38025彩色文本方式4320200彩色图形方式5320200黑白图形方式6640200黑白图形方式78025黑白文本方式(单色显示卡)(3)设置光标位置(2号功能) 入口参数:AH=2(功能号),BH=页号,DH=行号,DL=列

22、号。 出口参数:无。根据DX确定了光标位置。(4)读当前光标位置(3号功能)入口参数;AH=3(功能号),BH=页号。出口参数:DH=行号,DL=列号,CX=光标大小。(5)初始窗口或向上滚动(6号功能)入口参数:AH=6,AL=上滚行数,CX=上滚窗口左上角的行、列号。DX=上滚窗口右下角的行、列号。BH=空白行的属性。出口参数:无。当滚动后,底部为空白输入行。(6)初始窗口或向下滚动(7号功能)入口参数:AH=7,AL=下滚行数,CX=下滚窗口左上角的行、列号。DX=下滚窗口右下角的行、列号。BH=空白行的属性。出口参数:无。当滚动后,顶部为空白输入行。(7)读当前光标位置的字符与属性(8

23、号功能)入口参数:AH=08H,BH=页号。出口参数:AL为读出的字符,AH为字符属性。表5.4 黑白方式显示属性字节表5.5 彩色文本方式显示属性字节位号76 5 43 2 1 0属性字节BLR G BI R G B闪烁选择背景颜色前景颜色110 棕RGB颜色000 黑001蓝010绿011青100红101品红111白表5.6 背景颜色组合IRGB颜色IRGB颜色0000黑1000灰0001蓝1001浅蓝0010绿1010浅绿0011青1011浅青0100红1100浅红0101品红1101浅品红0110棕1110黄0111白1111强度白表5.7 前景颜色组(8)在当前光标位置写字符和属性(

24、9号功能)入口参数:AH=9,BH=页号,AL=字符的ASCII码,BL=字符属性,CX=写入字符数。出口参数:无。(9)在当前光标位置写字符(10号功能)入口参数:AH=0AH,BH=页号,AL=字符的ASCII码,CX=写入字符数。出口参数:无。(10)设置彩色组或背景颜色(11号功能)入口参数:AH=0BH,BH=0或1,BH为0时,设置背景颜色。当BH=1时 ,可设置彩色组,即为显示的像素点确定颜色组。出口参数:无。背颜色与对应值见表5.8。(11)写像素(12号功能)入口参数:AH=0CH,DX=行数,CX=列数,AL=彩色值(AL的D7为1,则彩色值与当前点内容作异或运算)。出口参

25、数:无。(12)读像素(13号功能)BLIRGB颜色BLIRGB颜色00000黑81000灰10001蓝91001浅蓝20010绿101010浅绿30011青111011浅青蓝40100红121100浅红50101品红131101浅品红60110棕141110黄70111亮灰151111白表5.8 背景颜色组合表表5.9 彩色分组入口参数:AH=0DH,DX=行数,CX=列数。出口参数:AL=彩色值。(13)写字符并移光标位置(14号功能)入口参数:AH=0EH,AL=写入字符,BH=页号,BL=前景颜色(图形方式)。出口参数:无。(14)读当前显示状态(15号功能)入口参数:AH=0FH。出

26、口参数:AL=当前显示方式,BH=页号,AL=屏幕上字符列数。【例5.9】在屏幕10行2024列处显示五朵梅花,颜色各异,且要求中间一个朵能够闪烁。 源程序:DATASEGMENTATRIDB 6EH,52H,94H,52H,6EHDATAENDSSTACK SEGMENT PARA STACK STACKDB 200 DUP(0)STACKENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACKST:MOVAX,DATAMOVDS,AXMOVAH,0;设置8025彩色文本方式MOVAL,3INT10HLENSI,ATRI;属性字节值表首址存SIMOVDI,

27、5;显示5个字符MOVDX,0A13H;显示位置MOVAH,15;取当前页号INT10H LP:MOVAH,2;置光标位置INCDLINT10HMOVAL,5;显示梅花形字符MOVBL,SIMOVCX,1MOVAH,9INT10HINCSI、;指向下一属性字节DECDI;判显示完否 JNZLP;未完转LP再显示MOVAH,4CH;完,返回DOSINT21HCODEENDSENDST返回本节5.4 综合举例【例5.10】【例5.11】【例5.12】【例5.13】【例5.14】【例5.15】返回本章目录【例5.10】下面给出一个利用键盘I/O功能的程序例。用INT 16H(AH=0)调用实现键盘输

28、入字符。DATASEGMENT BUFFDB 100 DUP(?)MESSDB NO CHARACTER!,0DH,0AH,$DATAENDSCODESEGMENTASSUME CS:CODE,DS:DATA START:MOVAX,DATA MOVDS,AX MOVCX,100 MOVBX,OFFSET BUFF;内存缓冲区首址 LOP1:MOVAH,1 PUSHCX MOVCX,0 MOVDX,0 INT1AH ;设置时间计数器值为0LOP2:MOVAH,0INT1AH;读时间计数值 CMP DL,100 NZLOP2;定时时间未到,等待MOV AH,1INT16H;判有无键入字符JZDO

29、NE;无键输入,则结束MOV AH,0INT16H;有键输入,则读出键的ASCII码MOVBX,AL ;存入内存缓冲区INCBXPOPCXLOOPLOP1;100个未输完JMPENDONE:MOV DX,OFFSET MESSMOVAH, 09HINT21H;显示提示信息EN:MOV AH,4CH INT21HCODEENDS ENDSTART返回本节【例5.11】利用8253-5演奏乐曲。图5.13 钢琴上的部分音符对应频率程序如下:EXTRN NEW-:FARDATASEGMENTFTANBLEDW 262,190,220,190,220,262,220,262,294,0TTABLEDW

30、 40,40,40,0,10,40,20,80DATAENDSSTACKSEGMENT DW 100 DUP(?)STACKENDSCODESEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSINGPROCFARMOVAX,DATAMOVDS,AXMOVSI,OFFSET FTABLELEABP,TTABLECALLPLAYMOVAX,4C00HINT21HRETSINGENDPPLAYPROCPUSHBXPUSHDIPUSHSIPUSHBPAGAIN:MOVDI,SI;取音调频率CMPDI,0;是否演奏完JEEND-PLAYMOVBX,DS:BP;取持续时间CALL

31、NEW-BEEP;演奏一个音符ADDSI,2 ADDBP,2;修改指针JMPAGAIN POPDIPOPBXRET PLAYENDPNEW-BEEPPROCNEARPUSHAXPUSHCXPUSHDXPUSHDIMOVAL,0B6H OUT43H,AL;8253-5通道2设置方式3MOVDX,12H;16位,二进制计数MOVAX,34DAHDIVDI;计算时间常数OUT42H, ALMOVAL,AHOUT42H,AL;送时间常数MOVAL,03HOUT61H,AL;使与门打开,GETE2有效,扬声器响DELAY2:MOV CX,12500DELAY1:OOP ELAY1;延时10ms,使声音维

32、持DECBXJNZDELAY2;根据BX的内容延迟MOVAL,00H OUT 61H,AL;关闭扬声器POPDI POPDXPOPCX POPAXRETNEW-BEEPENDPCODEENDSENDSING返回本节【例5.12】使用0AH系统功能从键盘中接收一个以回车符结尾的字符串。 程序如下:STACKSEGMENT PARA STACK STACKDB 64 DUP(STACK)STACKENDSDATASEGMENT PARA PUBLIC DATAKBUFLDB 255KBUFCDB ?KBUFFDB 255 DUP(?)DATAENDSCODESEGMENT PARA PUBLIC

33、CODEASSUME CS:CODE,SS:STACK,DS:DATAPRNTYPPROC FARPUSHDS;保存旧的数据段SUBAX,AXPUSUAXMOVAX,DATAMOVDS,AXMOVAH,0FH ;重建显示模式以清屏INT10H MOVAH,0INT10HMOVDX,0000H ;设定光标为0行0列MOVBH,0;0页MOVAH,2INT10HMOVDX,1码 ;1号打印机接口MOVAH,1;初始化打印机INT17HPRT1:MOVDX,OFFSET KBUFL;DS:DX指向输入缓冲区MOVAH,0AH;用键盘向缓冲区输入字符串INT21HMOVCL,KBUFCCMPCL,0;

34、若键入回车符则退出JEEXITMOVCH,0;使CX为串长(不包括结尾回车符)LEASI,KBUFFMOVDX,1;1号打印机接口PRT2:LODSB;以DS:SI为指针取1字符至ALMOVAH,0;向打印机送此字符INT17HTESTAH,01H;打印机超时否?JNZEXIT;是,结束程序LOOPPRT2;CX减1,不为0再送下一字符MOVAL,ODH;字符串打印完毕,打印机回车换行MOVAH,0 INT17HMOVAL,0AHMOVAH,0INT17HMOVBH,0;读0页光标当前位置MOVAH,3INT10HINCDH;光标下移一行MOVDL,0;并移至左端返回本节【例5.13】键盘输入

35、09间任一数,分别显示内定的一串字符。程序如下:STACKSEGMENT PARA STACK STACKDB 256 DUP(0)STACKENDSDATASEGMENT PARA PUBLIC DATATHIRTYDB 30PARMDB 128 DUP(0MSG0DB I LIKE IBM PCMSG1DB 8080 PROGRAMMING IS FUNMSG2DB TIME TO BUY MOUY DISKETTES MSG3DB THIS PROGRAM WORKSMSG4DB TURN OFF THAT PRINTER! MSG5DB I HAVE MORY ME MORY THEN

36、 YOU MSG6DB THE PSP CAN BE USEFULMSG7DB BASIC WAS EASIER THENTHISMSG8DB DOS IS INDISPENSABLE MSG9DB LSAT MESSAGE OF THE DAYERRMSGDB ERROR! INVALID PARAMETER!DATAENDSCODESEGMENT PARA PUBLIC CODESTARTPROC FARASSUMECS:CODE PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVES,AX ASSUMEES:DATAMOVDS,AXASSUMEDS:DATAMOVAH,0;

37、功能号为0INT16H;键盘入,字符在AL SUBAL,0;减去字符0的ASCII码JCERROR;键入字符编码小于30H则转移CMPAL,9;是9吗?JAERROR;大于9转移,否则顺序MOVBX ,OFFSET MSG0;MSG0 位移送BX MULTHIRTY;键入字符之二进制数30ADDBX ,AX;计算输出信息在表中位移CALLDISPLAY;转子显示信息RET;返回ERROR:MOVBX,OFFSET ERRMSG;出错显示信息位移送BXCALLDISPLAY;转子显示信息RET;返回DISPLAYPROCNEARMOVCX,30;显示的字符总数DISP:MOVAL,BX;取字符送

38、ALCALLDISPCHAR;转子显示字符INCBX;指向下一字符LOOPDISP MOVAL,0DH;回车符送ALCALLDISPCHAR;转子显示MOVAL,0AH;换行符送ALCALLDISPCHAR;显示RET;返回 DISPLAYENDP DISPCHARPROCNEARPUSHBX;保护BXMOVBX,0;0送BX MOVAH,14;功能调用输出字符POPBX;恢复BXRET;返回DISPCHARENDPSTARTENDPCODEENDSENDSTART返回本节【例5.14】在屏幕上显示包括隐含文件在内的所有文件目录程序如下:STACKSEGMENT PARA STACK STAC

39、KDB 256 DUP(0);256个字节栈STACKENDSDATASEGMENT PARA PUBLIC DATADIRECTORYDB 3584 DUP(0);存放盘目录区域NAMECOUNT DB 0;文件名计数ERRMSGDB DISK ACCESS ERROR!DATAENDSCODESEGMENT PARA PUBLIC CODESTARTPROC FARASSUME CS:CODEPUSHDS;保留PSP段址MOVAX,0PUSHAX;保留返回地址偏移MOVAX,DATAMOVDS,AX;建立数据段可寻址性ASSUME DS:DATAMOVES,AX;建立特别段可寻址性ASSU

40、ME ES:DATAMOVCX,3;读盘次数RETRY:PUSHCX;保留再试计MOVBX,OFFSET DIRECTORY;指向内 存目录存放区MOVDL,0;驱动器号AMOVDH,0;盘的0面MOVCH,0;0道MOVCL,6;6个扇区MOVAL,7;从第7扇区开始MOVAH,2;读盘功能号INT13H;BIOS 读盘POPCX;恢复计数值JNCREADOK;CF=0读盘成功转READOKMOVAH,0;CF=1置AH=0INT13H;复位磁盘BIOS调用LOOPRETRY;不够三次转RETRY再试ERROR: MOV BX,OFFSET ERRMSG;够三次不成功取出错信息位移CALLD

41、ISPLAY ;转子显示错信息RET ;返回READOK:MOV CX,112 ;双面双密软盘目录数NEXT:CMPBYTE PTRBX,0E5H ;是空目录标志E5H吗JZEMPTY ;是转PUSHBX ;不是保护BXMOVDL,8 ;文件名主名长度PNAME: MOV AL,BX ;取文件名字符CALLDISPCHAR ;显示INCBX ;下一字符DECDL ;字符数减1JNZPNAME ;不够8个转PNAME,够顺序执行MOVAL,.CALLDISPCHAR ;显示主名与扩展名之间的分隔符.MOVDL,3 ;扩展名长度ENAME: MOV AL,BX ;取扩展名字符CALLDISPCHA

42、R ;显示INCBXDECDLJNZENAMEPOPBX ;恢复BXMOVDL,8 ;空格数 BLANK:MOVAL, CALLDISPCHAR ;显示文件名间的DECDL ;8个空格JNZBLANKINCNAMECOUNT ;文件名计数增1CMPNAMECOUNT,92 ;满屏吗?JNZEMPTY ;若不,转MOVAH,0;读键盘功能号INT16H ;BIOS键盘入,用户击键后继续MOVNAMECOUNT,0 ;复原计数初值EMPTY:ADD BX,32 ;指向下一目录项,每项32个字节LOOPNEXT;不够112个转,够顺序执行 RET ;返回DOSDISPLAY PROC NEAR ;显示信息子程序MOVCX,30;显示字符数DISP1: MOV AL,BX ;取字符CALLDISPCHAR ;转子显示INCBXLOOPDISP1;做30次MOVA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论