微型计算机技术58612课件_第1页
微型计算机技术58612课件_第2页
微型计算机技术58612课件_第3页
微型计算机技术58612课件_第4页
微型计算机技术58612课件_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

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

文档简介

微型计算机技术学习辅导(4)第四章汇编语言程序设计基础

4.1循环程序设计在程序设计中,常常需要一段程序反复执行若干次,这通常用循环的方法来实现,借助几种循环控制指令和前缀可以方便地实现循环。4.1.1基本结构的循环程序(1)初始化部分:循环前的准备工作,包括建立指针、设置变量及循环初值等。(2)循环体:这是循环程序的工作部分,完成循环的基本操作。(3)修改部分:修改参数,包括操作数地址、循环计数值或其他控制变量。(4)控制部分:根据对循环条件的判断结果,控制循环的执行或结束。初始化循环体初始化修改部分修改部分循环体循环控制循环控制YNNY先工作后判断先判断后工作例:编制一个程序,将BX寄存器中的二进制数用十六进制数的形式显示出来。(1)BX寄存器中的二进制数可用4位十六进制数显示,故循环次数为4,放入CH中。(2)BX循环左移4次,最高位数字移到最低位置;(3)0~9的数字与ASCII码差为30H;A~F(41H~46H)与ASCII码差为37H;故0~9的数字+30H,而A~F应+37H。开始CX←循环记数值BX循环左移4次转换为ASCII码>9?+7显示次数=0?结束例:统计某字单元中二进制数位值为1的个数,统计结果存放在变量ONE中。DATASEGMENTNUMDW1669HFINI:MOVAH,4CHONEDB?INT21HDATAENDSCODEENDSCODESEGMENTENDSTARTASSNUMCS:CODEDS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,NUMCOMP:CMPAX,0JZFINISHLAX,1JNCCOMPINCONEJMPCOMP开始AX←NUMAX=0?AX左移一位CF=1?ONE+1结束YY4.1.2多重循环程序一个计算过程可能要依赖几个互相独立变化的参数,这就需要在一个循环过程中再包含一个循环过程,形成外层循环嵌套内层循环的结构形式,这种程序就称为多重循环程序。多重循环程序设计的基本方法和单重循环程序设计是一致的,应分别考虑各层循环的控制条件及其程序实现,相互之间不能混淆。另外要注意在每次通过外层循环再次进入内层循环时,初始条件必须重新设置。例:有一个首地址为A的N字数组,请编制程序使该数组中的数按照从小到大的次序排列(整序)。采用起泡排序算法实现整序:从第一个数开始依次对相邻两个数Ki和Ki十l进行比较,若Ki≤Ki十l,Ki的位置不动,Ki十l继续和Ki十2比较;若Ki>Ki十1,则两者交换位置。Ki十1(交换前的Ki)继续和Ki十2比较。可以看出,在第一遍比较了N-1次后,最大的数已经放到了最后,所以在第二遍时,只需比较N-2次,同样道理,第三遍只需比较n-3次…。如果有N个数,最多要比较n-1遍。

序号数比较遍数1234比较次数123412312113232321616151588285851616321515168815153161685151515328881616

1641515858883232

32

3258885

85

85

85

85

第一遍比较5-1=4次挑出最大数85第二遍比较5-2=3次挑出第二大数32第三遍比较5-3=2次挑出第三大数16第四遍比较5-4=1次挑出第四大数15完成整序DSEGSEGMENTNEQU5ADW5DUP(?)DSEGENDSCSEGSEGMENTMAINPROCFARASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXNUM:ADDSI,2MOXCX,NLOOPLOOP2DECCXMOVCX,DXLOOP1:MOVDX,CXLOOPLOOP1MOVSI,0MOVAH,4CHLOOP2:MOVAX,A[SI]INT21HCMPAX,A[SI+2]MAINENDPJLENUMXCHGAX,A[SI+2]CSEGENDSMOVA[SI],AXENDSTART

4.2分支程序设计4.2.1分支程序结构两路(单重)分支结构多路(多重)分支结构这两种结构都要求先对条件进行判定,然后根据判定结果确定执行哪路分支,判定一次只能有一路分支被选择。一般来讲一个条件两路分支;N个条件,2N路分支。判定条件判定条件ABABXYN

4.2.2分支程序的设计方法分支程序的实现方法有多种,最常用的方法有:利用比较和条件转移指令实现分支,利用逻辑尺控制分支,以及利用地址跳转表实现分支等方法。例:X/2X<0Y=2X=02XX>0这个问题可以通过X与0的比较,利用条件转移指令来确定三个计算分支中的某一支。MOVAL,XCMPAL,0JLM1JZM2SALAL,1JMPNEXTM1:SARAL,1JMPNEXTM2:MOVAL,2NEXT:MOVX,ALAL←XX<0?AL÷2X=0?AL←2AL×2X←ALYNYN利用地址跳转表的方法主要用于多路分支(三路分支以上)的情况,下面通过一个实例来说明这种程序设计方法。在调用DOS文件管理功能时,如出现了错误(如使用了非法功能号),DOS则根据AX中的错误码,将相应的错误信息显示出来。(AX)=1~5各表示一种错误,其错误信息分别为ERl~ER5。AX除l~5之外的数码是无效的。(1)错误信息提示的地址分别为ERl~ER5。(2)ERl~ER5构成跳转表,表首地址为ERTAB。(3)表中各项的地址为表首址+(功能号-1)×21号错误提示2号错误提示3号错误提示4号错误提示5号错误提示ER1ER2ER3ER4ER5ER1ER2ER3ER5ER4ERTABERTAB+2ERTAB+4ERTAB+6ERTAB+8DATASEGMENTCMPAX,5OUTRDB“非1~5$”JGOUTR;≥5转至OUTRER1DB“错误1提示$”CMPAX,1ER2DB“错误2提示$”JGETADR;1~5转TADRER3DB“错误3提示$”OUTR:LEADX,OUTRER4DB“错误1提示$”JMPDISPM;转至DISPMER5DB“错误1提示$”TADR:MOVBX,AXEVENDECBXERTABDWER1,ER2,ER3SHLBX,1DWER4,ER5MOVDX,ERTAB[BX]DATAENDSDISPM:MOVAH,9CODESEGMENTINT21HSHOWERRPROCFARPOPBX;恢复现场ASSUMECS:CODE,DS:DATAPOPDXMOVSI,DATAPOPAXMOVDS,SIREGPHSUAX;保护现场SHOWERRENDPPUSHDXCODEENDSPUSHBXEND

4.3子程序设计子程序又称为过程,在程序实现中,如果要多次用到一些功能相同的程序段,那么就可以用伪操作PROC和ENDP把这些程序段定义成子程序。需要时用CALL指令来调用它,调用程序也称为主程序。子程序有两种属性:NEAR(缺省的属性)和FAR。和调用程序在同一代码段中的子程序使用NEAR属性,和调用程序不在同一代码段中的子程序使用FAR属性。4.3.1主程序与子程序之间的参数传送主程序在调用子程序时,需要传送一些参数(入口参数)给子程序,子程序运行完后也要将运行结果(出口参数)回送给主程序。利用寄存器传送参数传送参数的方式:利用存储区传送参数利用堆栈传送参数1.利用寄存器传送参数这种参数传送的方式方便、快速,但只适合传送参数较少的情况。例:编写程序,将一个16位二进制数转换成用ASCII表示的十进制数。这是一个常用的转换子程序,应提供给所有的用户调用。因此,要将该子程序的人口参数和出口参数注释清楚,方便调用。入口参数:DX=被转换数DI=结果单元首地址出口参数:DI=ASCII码结果单元首地址BIN-TO-ASCPROC

PUSHCX;保护现场POPDI;恢复现场PUSHAXPOPAXPUSHDIPOPCXADDDI,4;指向最低位RET

BINAO:MOVAX,DXBIN-TO-ASCENDPMOVDX,0CODEENDSMOVCX,10ENDSTARTDIVCX;÷10XCHGAX,DX;商←→余数ADDAL,30H;转换ASCII码MOV[DI],AL;存结果DECDI;修改指针CMPDX,0JNZBINA0;≠0,转BINA0本例中,N为二进制数,先除10,余数为个位,或30H变为ASCII码;再对商除10,余数为十位,或30H变为ASCII码;直至商为0。2.利用存储区传送参数参数存放在存储区中,入口参数为存储区首地址。适合参数较多的情况。例:TABLE数组中存有15个十进制数,挑出最大数存放在MAX单元中。DATASEGMENTFOUNTPROCTABLEDB4,6,8,4,9…MOVAL,[SI]NEQU15DECCXMAXDB?INCSIDATAENDSLOP:CMPAL,[SI]CODESEGMENTJGL1ASSUMECS;CODE,DS:DATAMOVAL,[SI]START:MOVAX,DATAL1:INCSIMOVDS,AXLOOPLOPMOVCX,NFOUNTENDPLEASI,TABLE;入口参数CODEENDSCALLFOUNTENDSTARTMOVMAX,ALMOVAH,4CHINT21H

3.利用堆栈传送函数利用堆栈适合于传送参数多,而且子程序有嵌套、递归调用的情况。主程序将参数或参数地址推入堆栈,子程序从堆栈中取出参数或参数地址。利用堆栈传送涵数一定要注意堆栈的变化,如果参数和返回地址混淆,会造成子程序不能正确返回的错误。例:调加密子程序将数组中的数据Aj加密。秘约规则为Aj×2,再各位求反。DSEGSEGMENTSTART:MOVAX,DSEGNEQU20MOVDS,AXARAYDWNDUP(?)MOVAX,SSEGDSEGENDSMOVSS,AXSSEGSEGMENTLEASP,TOP;指定栈底DW64DUP(?)LEABX,ARAYTOPLABELWORDPUSHBX;首地址入栈SSEGENDSMOVBX,N;个数入栈CSEGSEGMENTPUSHBXASSUMECS:CSEG,CALLECRYSS:SSEG,MOVAX,4C00HDS:DSEGINT21H

4.4I/O程序设计

信息交换地址端口:地址信息主机I/O接口数据端口:状态信息状态端口:数据信息4.4.1直接控制I/O的程序设计1.I/O端口在80x86微机中,I/O端口编址在一个独立的地址空间中,这个I/O空间允许设置64K(65536)个8位端口或32K(32768)个16位端口。2.I/O程序举例对于I/O和存储器分离的地址空间系统,80x86有专门的I/O指令与端口进行通信。下面通过几个I/O程序的例子,说明使用I/O指令直接在端口级上输入输出的方法。输入指令输出指令INAN,30HOUT30H,ALINAX,40HOUT40H,AXINAL,DX;DX←16位端口地址OUTDX,AX;DX←16位端口地址INAX,DX;DX←16位端口地址OUTDX,AX;DX←16位端口地址

例:SOUND程序。程序通过I/O指令使设备控制寄存器(1/O端口地址为61H)的第1位交替为0和l,而61H端口的第l位和扬声器的脉冲门相连,交替为0和l的脉冲电流被放大后送到扬声器使之发出了声音。

76543210SOUNDPROCPUSHAXPUSHDXMOVDX,1000INAL,61HDECDXANDAL,11111100BJNZTRIGTRIG:XORAL,00000010BPOPDXOUT61H,ALPOPAXMOVCX,6000RETDELAY:LOOPDELAYSOUNDENDP1/0与门放大器端口61H本例中CX=6000它决定发声频率值小声音尖锐,值大声音低沉。DX=1000决定发声时间长短。

例:PRT—CHAR程序。这是一个采用查询方式的打印字符程序。程序通过反复渎取并测试打印机的状态来控制输出。在打印机接口中,数据寄存器的端口地址为378H,状态寄存器的端口地址为379H,控制寄存器的端口地址为37AH。76543210

忙位(0=忙)未用应答(0=可接受)打印出错(0=出错)纸出界(1=出界)联机状态(1=联机)76543210未用选通(1=输出数据)工作方式自动换行(1=换行)(0=禁止中断方式)初始化(1=正常)选择位(1=接通)

状态寄存器端口379H控制寄存器端口37AH又例:CPU要从3个设备轮流输人数据,PROCl,PROC2,PROC3分别是设备l,设备2和设备3的数据输入程序,它们的状态寄存器的端口地址分别用STAT1,STAT2,STAT3表示,这三个状态寄存器的5位是输入准备位。轮流查询三个数据输入设备的程序段:INPUT:INAL,STAT1;AL←状态寄存器1TESTAL,20H;输入准备好?JZDEV2;否,转DEV2CALLFARPTRPROC1;准备好,调PROC1DEV2:INAL,STAT2TESTAL,20HJZDEV3CALLFARPTRPROC2DEV3:INAL,STAT3TESTAL,20HJZNO-INPUTCALLFARPTRPROC1NO-INPUT:……查询方式的优点:可以安排优先次序,最先查询的设备优先级最高。修改查询次序就修改了设备的优先级。缺点:查询等待浪费CPU的时间,在设备多时由询问转向处理程序的时间较长。4.4.2中断程序设计中断是一种使CPU中止正在执行的程序而转去处理特殊事件的操作,引起中断的事件称为中断源。中断是CPU和外部设备进行输入/输出的有效方法。可以避免因反复查询外部设备的状态而浪费时间,从而提高CPU的效率。中断源分为软件中断(或称内中断)和硬件中断(或称外中断),系统通过分配给这些中断的类型号来加以识别和处理。

80x86中断源及其中断类型号

IR08259AIR1可编程IR2中断IR3控制器IR4(PIC)IR5IR6IR708系统定时器09键盘0A彩色/图形0B串行COM20C串行COM10DLTP2控制0E磁盘控制器0FLTP1控制非屏蔽中断请求中断逻辑INTn指令单步TF=1除法错误INT0指令INTRNMI2401nCPU1.软件中断的执行(1)中断指令INTn的执行。CPU执行一条INTn指令时,中断系统立即产生类型为n的中断,并且通过中断向量调用相应的中断处理程序来完成其中断功能。(2)处理CPU某些错误的中断。除法错中断:在执行除法指令时,若发现除数为0或商超过了寄存器所能表达的范围,则立即产生一个类型为0的中断。溢出中断:有一条专门的指令INTO来中断发生溢出的算术操作。如果OF=1,INTO指令引起中断,如OF:=0,则不发生中断,CPU继续运行原程序。溢出中断的类型号为4。(3)为调试程序没置的中断。单步中断:单步是一种很有用的调试方法。当标志位TF设置为l时,每条指令执行后,CPU自动产生类型号为1的单步中断。断点中断:断点可以设置在程序的任何地方,设置断点实际上是把一条断点指令INT3插入程序中,CPU每执行到断点处的INT3指令便产生一个中断。INT指令和INTO指令产生的中断。以及除法错中断都不能被禁止,并且比任何外部中断的优先权都高。如果系统增设键蛊中断,则可用下列指令实现:INAL,21H;取中断屏蔽字ANDAL,11111101B;将第1为置0,保留其余位不变OUT21H,AL;回送21H端口中断标志位IF的设置:STI;设置中断允许位(IF=1),允许中断(开中断)CLI;清除中断允许位(1F=0),禁止中断(关中断)中断命令寄存器76543210(I/O端口20H)中断命令寄存器:EOI是中断结束位,当EOI为1时,当前正在处理的硬件中断请求就被清除,所以在中断处理完成后,必须把中断结束位置为1。结束硬件中断用下面的指令:MOVAL,20H;20H=00100000B,置EOI为1OUT20H,AL;

RSLEOI00L2L1L03.中断操作步骤8086/8088中断系统能处理256种类型的中断,类型号为0~0FFH。中断向量表是各类型中断处理程序的人口地址表。中断向量的地址可由中断类型号乘以4计算出来。以BIOS中断INT4AH为例,表示出中断操作的以下5个步骤:①取中断类型号;⑦计算中断向量地址;③取中断向量,偏移地址送IP,段地址送CS;④转人中断处理程序;⑤中断返问到INT指令的下一条指令。类型49H中断向量0518F000类型4BH中断向量0:1280:1290:12A0:12B0:124INT4AHMOVCX,30H向量地址=4AH×4=128STIPUSHDSIRET1805F000IPCS①②③中断处理程序F000:1805④⑤采用向量中断可加快CPU中断处理速度。利用保留的中断类型号扩充中断功能,需要在中断向量表中建立相应的中断向量。为中断类型N设置中断向量的方法:

MOVAX,0MOVES,AXMOVBX,N﹡4MOVAX,OFFSETINHANDMOVES:WORDPTR[BX],AXMOVAX,SEGINHANDMOVES:WORDPTR[BX+2],AX

INHAND:IRET中断向量表子程序IRETINHAND(BX)=N﹡4(BX)+2OFFSETINHANDSEGINHAND0:0000IPCS①②①②用自己编写的中断处理程序代替系统中的某个中断处理功能时:(1)利用DOS功能调用(21H)保存原中断向量(2)设置新的中断向量;(3)在程序结束之前恢复原中断向量设置中断向量的DOS功能调用把由AL指定的中断类型的中断向量DS:DX放在中断向量表中.预置:AH=25HAL=中断类型号DS:DX=中断向量执行:INT21H

取中断向量的DOS功能调用把由AL指定的中断类型的中断向量从中断向量表中取到ES:BX中预置:AH=35HAL=中断类型号执行:INT21H例:使用DOS功能调用存取中断向量。

MOVAL,N;MOVAH,35H;INT21H;PUSHESPUSHBXPUSHDSMOVAX,SEGINTNANDMOVDS,AXMOVDX,OFFSETINTHANDMOVAL,NMOVAH,25HPOPDS

利用功能号35H的DOS功能调用把N类型的中断向量取到ES:BX中,进行压栈保存。新的中断向量DS:DX利用功能号25H的DOS功能调用存入到中断向量表中。中断类型为N。

POPDX;POPDS;MOVAL,NMOVAH,25HINT21HRETINTHAND:IRET将原来压栈保护的中断向量弹出到DS:DX中,利用功能号25H的DOS功能调用再存入到中断向量表中。INTHAND是新的中断服务子程序的入口符号地址。

4.中断过程中断过程:

1.保存返回地址CS:IP、保存标志寄存器FLAGS。2.CPU还自动清除IF位和TF位,目的是使CPU转人中断处理程序后,不允许再产生新的中断。3.转入中断服务程序。

IRET中断服务1.FKAGS、CS、IP入栈2.清除IF、TF3.转中断处理程序INTHAND产生中断1.IP、CS和FLAGS出栈2.返回断点,继续执行下一条指令。中断返回5.中断优先级中断优先级:CPU根据中断源的轻重缓急为中断源事先安排的中断优先级次序。当多个中断源同时向CPU请求中断时,CPU先比较它们的优先级,然后从优先级高到优先级低的次序来依次处理各个中断源的中断请求。8086规定中断的优先级次序为:

优先级高软件中断(除法错,INTO,INT)非屏蔽中断(NMI)可屏蔽中断(INTR)低单步中断可屏蔽中断的优先权又分为八级,在正常的优先级方式下,优先级次序是:

优先级高低IR0,IR1,IR2,IR3,IR4,IR5,IR6,IR74.4.3中断程序设计举例中断处理程序的编写应注意:(1)中断处理程序若不允许被打断,则清除IF和TF,若允许其他设备中断,则需用STI指令把IF位置1。(2)CPU产生一次中断,I/O设备只完成一个字节(或字)的输入/输出,所以中断处理程序所用的指针变量或数据变量一般应设置存储单元来保存。(3)硬件设备的中断处理结束后,一般要发出中断结束命令(E0I)。否则将屏蔽同级或低级的中断。例:编写一个中断处理程序,要求在主程序运行过程中,每隔10s响铃一次,同时在屏幕上显示出信息“Thebellisring!”。本例中用新设计的处理程序来代替原有的1CH中断程序,为此:在主程序的初始化部分,先保存当前1CH的中断向量,再设置新的中断向量。在主程序的结束部分恢复保存的1CH中断向量。SCATK1SEGMENTPARASTACKDW100DUP(?)STACK1ENDSDATASEGMENTCOUNTDW1MSGDB‘Thebellisring’,0dh,0ah,’$’DATAENDSCODESEGMENTMAINPROCFARASSUMECS:CODE,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AXMOVAL,1CH;取功能号1CH的中断向量压栈保存MOVAH,35HINT21HPUSHESPUSHBXPUSHDSMOVDX,OFFSETRING;子程序入口地址的偏移量送DXMOVAX,SEGRING;子程序入口地址的段基值送DSMOVDS,AX;中断向量送DS:DXMOVAL,1CHMOVAH,25HINT21HPOPDS

POPDXPOPDSSTIMOVAL,1CHMOVDI,20000MOVAH,25DELAY:MOVSI,30000INT21HDELAY1:DECSIMOVAH,4CHJNZDELAY1INT21HDECDIMAINENDPJNZDELAYIN21HANDAL,11111110BOUT21H,AL设置时钟中断延时

RINGPROCNEARSOUNT:XORAL,02HPUSHDSOUT61H,ALPUSHAXMOVCX,1400HPUSHCXWAIT1:LOOPWAIT1PUSHDXDECDXMOVAX,DATAJNZSOUNTMOVDS,AXMOVCOUNT,182STI;开中断EXIT:CLI;关中断DECCOUNTMOVAL,20HJNZEXITOUT20H,ALMOVDX,OFFSETMSGPOPDXMOVAH,09HPOPCXINT21HPOPAXMOVDX,100POPDSINAL,61HIRETANDAL,0FCHRINGENDPENDSTART显示提示语响铃程序EOI=1清除中断请求保护寄存器恢复寄存器

4.5BIOS和DOS基本调用

在存储器系统中从地址0FE000H开始的8KROM(只读存储器)中装有BIOS例行程序:系统加电自检、引导装入、主要I/O设备的管理程序以及接口控制等功能模块来处理所有的系统中断。使用BIOS功能调用,给程序员编程带来很大方便。DOS提供了一组系统功能调用子程序:包括I/O设备处理程序、文件管理程序和一些其他的处理程序。DOS操作比相应功能的BIOS操作更简易,而且对硬件的依赖性更少些。BIOS中断类型CPU中断类型0除法错1单步2非屏蔽中断3断点4溢出5打印屏幕6保留7保留8259中断类型8系统定时器(IRQ0)CCOM1控制器(IRQ4)9键盘(IRQ1)DI‘PT2控制器(IRQ5)A彩色/图形接口(IRQ2)E磁盘控制器(IRQ6)BCOM2控制器(IRQ3)FLPT1控制器(1RQ7)BIOS中断类型10显示器I/O11取设备信息12取内存容量13磁盘I/O14RS—232串行口I/O15磁带I/O16键盘I/O17打印机I/O18ROMBASIC19引导装入程序1A时钟40软盘BIOS用户应用程序1B键盘终止地址(Ctrl-Break)1C定时器4A报警(用户闹钟)数据表指针1D显示器参数表410﹟硬盘参数表1E软盘参数表461﹟硬盘参数表1F图形字符扩展码49指向键盘增强服务变换表DOS中断类型20程序终止27结束并驻留内存21功能调用28键盘忙循环22终止地址29快速写字符23Ctrl-C中断向量2A网络接口24严重错误向量2E执行命令25绝对磁盘读2F多路转接接口26绝对磁盘写30~3F保留给DOS

DOS功能与BIOS功能都通过软件中断调用。基本步骤:(1)将调用参数装入指定的寄存器中;(2)如需功能号,把它装入AH;(3)如需子功能号,把它装入AL;(4)按中断号调用DOS或BIOS中断;(5)检查返回参数是否正确。4.5.1键盘I/O键盘由三种基本类型的键组成:(1)字符数字键,如字母A(a)一Z(z),数字0—9以及%、$,#等常用字符。(2)扩展功能键,如Home,End,Backspace,Arrows,Return,Delete,Insert,PgUp,PgD,以及程序功能键F1一F10等。(3)和其他键组合使用的控制键,如A1t,Ctrl和Shift等。字符数字键—ASCII码字符;扩展功能键产生一个动作:如按下Home键能把光标移到屏幕的左上角,End键使光标移到屏幕上文本的末尾;组合控制键改变其他键所产生的字符码。1.字符码与扫描码键盘上的每个键都对应一个扫描码,根据扫描码就能唯一地确定哪一个键改变了状态。字符码是每个键代表的字符和符号的ASCII码(祥见教材P150页表4.6)

2.BIOS键盘中断BIOS键盘中断(INT16H)的中断处理程序包括3个不同的功能:AH功能返回参数0从键盘读一字符AL=字符码,AH=扫描码1读键盘缓冲区的字符如ZF=0,AL=字符码,AH=扫描码ZF=1,缓冲区空2取键盘状态字节AL=键盘状态字节调用方法:(1)功能号送入AH(2)执行INT16H的BIOS中断例如,要查看按键的扫描码和ASCII码,可以调用中断类型16H的0功能。

MOVAH,0;AH←功能号0,INT16HMOVBX,AX;(AX)=(BX)=扫描码和ASCII码CALLBINHEX;调用二进制转换十六进制的子程序

键盘上不具有ASCII码的键,如Shift、Ctrl、Alt、NumLock、Scro11、Ins和Capslock等,按动了它们能改变其他键所产生的代码。是通过键盘状态字节进行判断按动与否。

1=按下右移键RSHIFT1=按下左移键LSHIFT1=按下控制键CTRL1=按下交替键ALT1=SCOLLLOCK状态已变1=NUMLOCK状态已变1=CAPSLOCK状态已变1=INSERT状态已变键盘状态字节KB-FLAG

例:读取键盘状态字节,并以十六进制打印出来。MOVAH,02H

INT16H;BIOS16H中断MOVBX,AX;(AX)=(BX)=键盘状态字节CALLBINIHEX;转换十六进制打印MOVDL,0DH;显示CR字符(02号DOS功能调用)MOVAH,02HAGAIN:MOVAH,02H;功能号02H→AHINT21HJMPAGAIN

3.DOS键盘功能调用

DOS键盘操作(INT21H功能调用)AH功能调用参数返回参数1输入一个字符并显示AL=字符

(检测Ctrl-C或Ctrl-break,并调用INT23H结束程序)6读键盘字符,不回显DL=0FFH有字符,AL=字符,ZF=0无字符,AL=0,ZF=17输入一个字符不显示AL=字符

(不支持检测Ctrl-C或Ctrl-break)8输入一个字符不显示AL=字符

(检测Ctrl-C或Ctrl-break,并调用INT23H结束程序)A输入字符到缓冲区DS:DX;缓冲区首址B读键盘状态AL=0FFH有键入AL=00H无键入C清除键盘缓冲区AL=键盘功能号调用一种键盘功能(1、6、7、8、A)(1)单字符输入交互程序中常常需要用户对一个提示做出应答,例如,程序显示出一串信息,要求你回答Y或N,回答Y,程序将转入标号为YES的程序段,而回答N使程序转入标号为NO的程序段,按下其他键程序就等待。GET-KEY:MOVAH,1;AH←功能号1INT21HCMPAL,’Y’;是Y吗?JEYES;是Y,转程序YESCMPAL,’N’;是N吗?JENO;是N,转程序NOJNEGET-KEY;等待输入Y或N如果想检测Enter(Return)键,就要在指令中写出它的ASCII码0DH,例如:

WAIT-HERE:MOVAH,7;检测键,但不显示或不执行INT21HCMPAL,0DH;是Enter吗?(0DH回车键的ASCII码)JNEWAIT-HERE

要求程序能接收功能键或数字组合键必须进行两次DOS调用,第一次回送00,第二次回送扫描码。例如,程序显示出一个菜单,要求用户通过键入F1,F2或F3来选择1,2或3项,按其他键则产生错误信息。例:检测键盘输入的功能键

MOVAH,7INT21H;第一次回送00CMPAL,0JEGET-EC;为0,功能键JMPERROR;非0,转错误信息GET-EC:MOVAH,7INT21HCMPAL,3BH;F1?JEOPTION1CMPAL,3CH;F2?JEOPTION2CMPAL,3DH;F3?JEOPTION3JMPERROR;都不是,转错误信息

(2)输入字符串中断21H的A功能从键盘读入一串字符并把它存人用户定义的缓冲区中。缓冲区的第一个字节为预输入数,第二个字节为实际输入数,第三个字节起是输入的字符串,最后一个为回车(0DH)。例如:

LAMLENDB32ACTLENDB?STRINGDB32DUP(?);建立缓冲区执行输入字符串的指令:

LEADXMAXLENMOVAH,0AHINT21H假定输入字符串为:ABCDEFGH……XYZ↙的缓冲区:实际输入字符数26(1AH)预定输入字符数20H1AHABCDEFGXYZ↙CX←实际字符数DS:DX指向第一个字符可用如下指令:SUBAH,AHMOVAL,LAMLEN+1ADDDX,2

(3)清除键盘缓冲区0CH功能:清除键盘缓冲区,再执行AL指定的(1、6、7、8、AH)功能。例如:MOVAH,0CH;清除以前键入的字符MOVAL,08H;再执行08号功能INT21H可以避免由于偶然超前打入的字符而出现的错误(4)检验键盘状态0BH功能:如按键,则AL=0FFH,如没按键,则AL=00,无论哪种都将继续执行程序中的下一条指令。例:未按键,程序不断循环,只要按下任意键,程序就退出循环并返回。

SOUNDER:……..……..MOVAH,0BHINT21HINCALJNZSOUNDERRET按键AL=0FFH,+1为0不按键AL=0,+1不为0故非0循环。

4.5.2显示器I/O

1.字符属性屏幕上的字符,在存储器中由连续的两个字节表示,一个字节保存ASCII码,另一个字节保存字符的属性。在屏幕上处理字母、数字以及一些字符图形称为文本方式。(1)单色字符显示单色显示属性字节:76543210

闪烁亮度0=正常显示0=正常亮度1=闪烁显示1=加强亮度

背景前景000=黑111=白000=黑111=白单色显示的属性表属性值(二进制)属性值(十六进制)显示效果0000000000无显示0000000101黑底白字,下划线0000011107黑底白字,正常显示000011110F黑底白字,高亮度0111000070白底黑字,反相显示1000011187黑底白字,闪烁11110000F0白底黑字,反相闪烁(2)彩色字符显示彩色文本显示时,属性字节选择前景(显示的字符)和背景的颜色。字符可以选择16种颜色中的一种,背景有8种颜色可以选择。

16色方式下的属性字节BLRGBIRGB闪烁背景前景

16色字符方式颜色的组合颜色IRGB颜色IRGB颜色IRGB颜色IRGB黑0000灰1000红0100浅红1100蓝0001浅蓝1001品红0101浅品红1101绿0010浅绿1010棕0110黄1110青0011浅青1011灰白0111白1111背景颜色只能是表中I为0的8种颜色。如果前景和背景是同一种颜色,显示出的字符是看不见的,但属性字节中的位7可以使字符闪烁(BL=1)。2.BIOS显示中断中断类型10H的部分显示操作及所用的寄存器表AH功能调用参数返回参数1置光标类型(CH)0~3=光标开始行(CL)0~3=光标结束行BH=页号2置光标位置DH=行DL=列3读光标位置BH=页号CH/CL=光标开始/结束行DH/DL=行/列AH功能调用参数返回参数5置当前显示页AL=页号6屏幕初始化或上卷AL=上卷行数AL=0全屏幕为空白BH=卷入行属性CH=左上角行号CL=左上角列号DH=右下角行号DL=右下角列号7屏幕初始化或下卷AL=下卷行数AL=0全屏幕为空白BH=卷入行属性CH=左上角行号CL=左上角列号DH=右下角行号DL=右下角列号8读光标位置的BH=显示页AH=属性属性和字符AL=字符AH

温馨提示

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

评论

0/150

提交评论