第九章_BIOS和DOS中断

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第九章BIOS和DOS中断•9.1键盘I/O•9.2显示器I/O•9.3打印机I/O•9.4串行通信口I/O640KBRAM基本内存0000:00000040:00000050:00000070:0000A000:0000B000:0000C800:0000F600:0000FE00:0000FE00:1FFF显示缓存区(显存)硬盘驱动器控制ROM32KBROMBASIC8KBROMBIOSIO.SYS模块COMMAND.COM常驻模块MSDOS.SYS模块用户程序空间COMMAND.COM暂驻模块256KBROMDOS工作区ROMBIOS工作区128KBRAM保留区1KB中断向量表MSDOS系统中有两层内部子程序可供用户使用:基本输入输出子程序(BIOS)层功能模块及咖层功能模块。这些子程序对用户来说均可看成中断处理程序,它们的入口都在中断入口表中。用户用户不必过多地关心有关设备的物理性能及接口方面的细节,即不用直接使用IN或OUT语句,只需调用相应子程序即可使用设备。使用汇编语言程序可以直接调用它们,这极大地方便了用户对这些微机系统的扩充开发,因而掌握这些子程序的使用十分重要。在系统存储器中,从地址0FE000H开始的8KBROM(只读存储器)中装有BIOS(basicinput/outputsystem,基本输入输出系统)例行程序。驻留在ROM中的BIOS提供了系统加电自检,引导装入,主要I/O设备的处理以及接口控制等功能模块。使用BIOS功能调用,给程序员编程带来了很大的方便。程序员不必了解硬件I/O接口的特性,可直接用指令设置参数,然后中断调用BIOS中的例行程序,所以利用BIOS功能编写的程序简洁,可读性好,而且易于移植。BIOSDOSDOS是IBMPC机的磁盘操作系统,IBMBIO.COM:是一个输入/输出设备处理程序,它提供了DOS到ROMBIOS的低级接口,它完成将数据从外设读入内存,或把数据从内存写到外设去的工作。IBMDOS.COM包括一个文件管理程序和一些处理程序,在DOS运行的程序可以调用这些处理程序。为了完成DOS功能调用,IBMDOS.COM把信号传送给IBMBIO.COM,形成一个或多个BIOS调用。它的两个模块IBMBIO.COM和IBMDOS.COM使BIOS使用起来更方便。因为:DOS模块提供了更多重必要的测试,使DOS操作比使用相应功能的BIOS操作更简易,而且DOS对硬件的依赖性更少些。用户编程原则①尽可能使用DOS的系统功能调用,提高程序可移植性。②在DOS功能不能实现情况下,考虑用BIOS功能调用。③在DOS和BIOS的中断子程不能解决问题时,使用IN/OUT指令直接控制硬件。在一些情况下,既能选择DOS中断也能选择BIOS中断来执行同样的功能,但在少数情况下必须使用BIOS功能。DOS中断能处理大多数的I/O,但有一些功能还没有提供。设置入口参数在AH设置功能号(如需要,在AL设置子功能号)执行中断指令INTN分析、应用出口参数Dos/Bios中断调用的基本步骤DOS功能调用INT21H用户在程序中调用DOS提供的一些子功能:(1)一般设备的输入输出(2)磁盘的输入输出及磁盘文件的管理(3)其它调用方法:(1)设置调用参数(2)MOVAH,功能号(3)INT21H(1)DOS键盘功能调用(AH=1,6,7,8,A,B,C)例:单字符输入(AH=1)get-key:movah,1int21hcmpal,‘Y’jeyescmpal,‘N’jenojneget_keyyes:……no:……例:输入字符串(AH=0ah)定义缓冲区:(1)maxlendb32actlendb?stringdb32dup(?)(2)maxlendb32,0,32dup(?)(3)maxlendb32,33dup(?)leadx,maxlenmovah,0ahint21h20maxlenactlen‘H’‘O’‘W’‘A’‘R’‘E’‘Y’‘O’‘U’20200dstring0b(DX)(2)DOS显示功能调用(AH=2,6,9)例:显示单个字符(AH=2)movah,2movdl,‘A’int21h例:显示字符串(AH=9)stringdb‘HELLO’,0dh,0ah,‘$’movdx,offsetstringmovah,9int21h(3)DOS打印功能(AH=5)有关键盘①一种输入设备,通过键盘接口电路与计算机连接。②键盘上的键有三种类型:字符数字键A~Z,0~9等扩展功能键F1~F12,PageUp等组合控制键Shift,Ctrl,Alt等③键盘上的每个键都有一个扫描码。◢◢据扫描码可确定操作的是哪个键、是按下键还是释放键;◢◢扫描码用一个字节表示。低7位是扫描码的数字编码,与键盘上的键一一对应;最高位D7位表示键的操作状态:当按下键时,D7=0;当释放键时,D7=19.1键盘I/O一个ASCII码产生一个动作改变其它键所产生的字符码⑤键盘中断子程功能(09H类型中断子程)◢从键盘接口读取操作键的扫描码(8255的输入端口61H);◢将扫描码转换成字符码;大部分键的字符码为ASCII码,无ASCII码键(如组合键Shift、Ctrl等)的字符码为0。还有一些非ASCII码键产生一个指定的动作◢将键的扫描码、字符码存放在键盘缓冲区KB_BUFFER,供其它有关键盘的中断子程应用。④键盘接口对按下键和释放键均向计算机发出中断申请,如果中断响应条件满足,CPU转去执行键盘中断子程。键盘中断子程类型号为09H。⑥键盘缓冲区0040:001ABUFF_HEADDW?0040:001CBUFF_TAILDW?0040:001EKB_BUFFERDW16DUP(?)0040:001AKB_BUFFER_ENDLABELWORD先进先出的循环队列首地址末地址大小单字符输入(01H、07H、08H功能)①入口参数无功能号AH=01H类型号21H出口参数AL=键入字符的ASCII码实现功能等待从键盘输入一个字符,并在屏幕上回显,光标移动,检测Ctrl-Break键例利用键盘输入的字符产生分支:MOVAH,1;等待从键盘输入INT21HCMPAL,‘Y’;是’Y’?JZyesCMPAL,‘y’;是’y’?JZyesno:......JMPexityes:......exit:...例在中断向量表中查找从键盘输入的字符,并将其个数用二进制形式显示出来。(scanskey.asm)codeSEGMENT;代码段开始ASSUMECS:codebegin:MOVAX,0000H;设置查找首地址MOVDS,AXMOVSI,0000HMOVCX,0400H;设置查找长度MOVBX,0;计算值初值MOVAH,01H;从键盘输入INT21H;输入关键字MOVDL,AL;保存在DL中next:LODSB;从串取CMPAL,DL;与关键字比较JNZpointINCBX;计算值加1point:LOOPnext;查找结束?CALLdisplay;调用显示子程MOVAH,4CH;调用4CH功能INT21H;返回DOS;用二进制显示BX内容子程displayPROCMOVCX,16;显示位数rotate:ROLBX,1MOVDL,BLANDDL,01HADDDL,30HMOVAH,2HINT21HLOOProtateRET;子程返回displayENDPcodeENDS;代码段结束ENDbegin②入口参数无功能号AH=07H类型号21H出口参数AL=键入字符的ASCII码实现功能等待从键盘输入一个字符,不在屏幕上回显,不检测Ctrl-Break键例用不带回显功能输入密码时:input:MOVAH,07H;等待从键盘输入INT21HMOV[DI],AL;存入缓冲区CMPAL,0DH;是回车符?JNZinput;不是,继续输入check:、、、、、、4.字符串输入(0AH功能)入口参数DS:DX=缓冲区的首地址(DS:DX)=限制最多输入的字符数功能号AH=0AH类型号21H出口参数(DS:DX+1)=实际键入的字符(不含回车符)从(DS:DX+2)开始顺序存放键入的字符串,回车符0DH为串尾最后一字符。实现功能等待从键盘输入字符串,并存入设定的缓冲区内,同时回显字符串,光标随着移动,回车符使光标回到行首。注意事项:应按要求先定义缓冲区,再调用。例应用0AH功能输入字符串。dataSEGMENT;定义缓冲区maxDB11;定义限制最多输入个数lenthDB?;用于存放实际输入个数striDB11DUP(?);用于存放输入的字符串dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;置缓冲区地址于DS:DXMOVDS,AXLEADX,maxMOVAH,0AHINT21H;调0A输入功能MOXCH,0MOVCL,lenth;取字符串长度放CX中LEABX,stri;取字符串首址于BX中MOVAL,[BX];应用输入字符、、、、、codeENDSdataSEGMENT;定义缓冲区maxDB11;定义限制最多输入个数lenthDB?;用于存放实际输入个数striDB11DUP(?);用于存放输入的字符串dataENDS从键盘输入‘ABCD’,回车,内存的存放结果:0B04414243440D00max07000000000000000080a0b0f12345690c0d0elenthstri地址内容DS:DX如下编程与上例相同:dataSEGMENTmaxDB11等价于:DB?maxDB11,?,11DUP(?)DB11DUP(?)dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;置缓冲区地址于DS:DXMOVDS,AXLEADX,maxMOVAH,0AH;调输入功能INT21HMOXCH,0MOVCL,max+1;取字符串长度放CX中LEABX,max+2;取字符串首址于BX中MOVAL,[BX];应用输入字符、、、codeENDSdataSEGMENTmaxDB11DB?DB11DUP(?)dataENDS从键盘输入‘ABCD’,回车,内存的存放结果:等价于maxDB11,?,11DUP(?)0B04414243440D00max07000000000000000080a0b0f12345690c0d0e地址内容DS:DX0AH功能执行过程:①若(DS:DX)字节单元的值为0,则不等待从键盘输入,结束调用。②若(DS:DX)字节单元的内容大于0,则等待从键盘输入,并把输入键的ASCII码顺序存放在DS:DX+2开始的单元,按回车键表示结束输入。当按下键的个数超过(DS:DX)中值,发出警告声’嘟嘟’,不再接收输入的数据,直到输入回车键。③将实际输入的字符个数(不包括回车键)填入(DS:DX+1),结束调用。DS:DX000000000000000000000000000000000AH功能注意事项:◢输入的字符均带回显,且光标随字符移动。当输入回车符结束时,也回显回车符。表现为功能调用结束后,光标回到了行首。◢回车符0DH作为一个输入的字符存放在字符串尾,但计数输入个数时,不包括回车键。实际最多能输入的字符数=限制的最多数-1(回车符占一个)◢执行完0AH功能后,DS和DX的值不变,DS:DX仍指向缓冲区的首地址。◢整个缓冲区的大小应为:限制的最多数+2maxDB11,?,11dup(?)例利用DEBUG查看0A功能输入结果。dataSEGMENTmaxDB11,?,11DUP(?)dataENDScodeSEGMENTASSUMECS:code,DS:datastart:MOVAX,data;置缓冲区地址于DS:DXMOVDS,AXLEADX,maxMOVAH,0AH;调输入功能INT21HMOVCH,0MOVCL,max+1;取输入长度到CX中MOVAH,4CH;返回DOSINT21HcodeEND

1 / 56
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功