9.1键盘I/O9.2显示器I/O第九章BIOS和DOS中断YoursitehereBIOS和DOS中断BIOS是固化在PC机内存地址0FE000开始的8KBROM中的基本输入输出系统的例行程序,它为PC系列的不同微处理器提供了兼容的系统加电自检、引导装入、主要I/O设备的处理程序以及接口控制等功能模块,一般以中断处理程序的形式存在。BIOS可以处理所有的系统中断,如键盘、显示器、磁盘、打印、日期与时间等。BIOS是模块化的结构形式,每个功能模块的入口地址都在中断向量表中,对这些中断调用是通过软中断指令INT来实现的。DOS是IBMPC机的磁盘操作系统,由软盘或硬盘提供。它的两个DOS模块IBMBIO.COM和IBMDOS.COM使BIOS使用起来更方便。其中模块IBMBIO.COM是一个输入输出设备处理程序,提供DOS到BIOS的低级接口,模块IBMDOS.COM包括一个文件管理程序和一些处理程序,把信息传送给IBMBIO.COM,形成BIOS调用。因为DOS模块提供了更多更必要的测试,使DOS操作比使用相应功能的BIOS操作更简易,而且DOS对硬件的依赖性更少些。YoursitehereBIOS和DOS中断层次用户程序磁盘管理模块(DOS内核)MSDOS.SYS系统功能基本输入/输出BIOS模块IO.SYS设备驱动ROMBIOS基本I/O系统硬件装入命令处理模块COMMAND.COM用户命令DOS系统层次结构ROMBIOS中的中断子程序使用IN/OUT指令直接控制外设,实现与外设之间的输入/输出操作,以软件形式向其上层提供服务。IO.SYS中的中断子程序(称基本输入/输出BIOS模块)调用ROMBIOS的基本I/O功能,向MSDOS.SYS提供设备驱动服务。MSDOS.SYS中的中断子程序(称DOS内核模块)调用IO.SYS,实现对外设的控制。DOS中断与标准外设有两层隔离:IO.SYS和ROMBIOS。Yoursitehere用户编程原则①尽可能使用DOS的系统功能调用,提高程序可移植性。②在DOS功能不能实现的情况下,考虑用BIOS功能调用。(比如读打印机状态:BIOS中断17H的功能2)③在DOS和BIOS的中断子程序不能解决问题时,使用IN/OUT指令直接控制硬件。(比如声音控制)YoursitehereBIOS和DOS中断例程的安装过程(1)开机后,CPU一加电,初始化(CS)=0FFFFH,(IP)=0,自动从FFFF:0单元开始执行程序。FFFF:0处有一条转跳指令,CPU执行该指令后,转去执行BIOS中的硬件系统检测和初始化程序。(2)初始化程序将建立BIOS所支持的中断向量,即将BIOS提供的中断例程的入口地址登记在中断向量表中。(3)硬件系统检测和初始化完成后,调用int19h进行操作系统的引导。从此将计算机交由DOS操作系统控制。(4)DOS启动后,除完成其它工作外,还将它所提供的中断例程装入内存,并建立相应的中断向量。Yoursitehere中断例程调用方法设置入口参数在AH设置功能号m执行中断指令INTN分析、应用出口参数一般来说,中断例程中包含多个子程序,内部用AH传递子程序的编号来决定执行哪个子程序。Yoursitehere例:DOS功能调用:int21h中断例程是DOS提供的中断例程,其中包含了DOS提供给程序员在编程时调用的子程序。;----------键盘输入一个字符MOVAH,01;设置功能号:键盘输入INT21H;DOS功能调用MOVCHAR,AL;返回参数:(AL)=字符ASCII码;-----------------显示输出一个字符MOVDL,’A’;调用参数:待输出字符的ASCII码MOVAH,02;DOS功能号:显示输出INT21H;DOS调用中断例程调用举例movah,4ch;调用第21h号中断例程的4ch号子程序moval,0;提供返回值作为参数int21hYoursitehere与子程序调用的比较主程序……CALLSUBP……子程序…………RETDOS/BIOS调用源程序……INTn……DOS/BIOS例行程序…………IRET实现机制不同Yoursitehere9.1键盘I/O大多数有用的程序都需要处理用户的输入。键盘输入寄存器的端口地址为60H,控制寄存器的端口地址为61H。键盘上的键有三种类型:字符键A~Z,0~9等功能键F1~F10,,Del、PageUp等组合控制键Shift,Ctrl,Alt等键盘通过键盘接口电路与计算机连接。PC机系列的键盘触点电路按16行×8列的矩阵来排列,用单片机Intel8048来控制对键盘的扫描。按键的识别采用行列扫描法,即根据对行线和列线的扫描结果来确定闭合键的位置,这个位置值称为按键的扫描码,通过数据线将8位扫描码送往主机。当在键盘上“按下”或“放开”一个键时,如果键盘中断是允许的(21H端口的1位等于0),就会产生一个类型9的中断,并转入到BIOS的键盘中断处理程序。Yoursitehere字符码与扫描码大部分键的字符码即相应字符的ASCII码,没有相应ASCII码的键字符码为0。键盘上的每个键都有一个扫描码(01~83)。◢据扫描码可确定操作的是哪个键、是按下键还是释放键;◢扫描码用一个字节表示。低7位是扫描码的数字编码(即在键盘上的位置),与键盘上的键一一对应;最高位D7位表示键的操作状态:当按下键时,D7=0,取得通码;当释放键时,D7=1,取得断码。YoursitehereBIOS键盘中断处理程序功能:◢从键盘接口(60H)读取操作键的扫描码;◢将扫描码转换成字符码;◢将键的扫描码、字符码存放在ROMBIOS数据区的键盘缓冲区KB_BUFFER,供其它有关键盘的中断子程应用。◢键盘状态字节(KB_FLAG)中的各位表示是否按下变换键Shift,Ctrl,Alt,NumLock,Scroll,Ins和CapsLock键盘中断处理程序D7D6D5D4D3D2D1D0InsertCapsLockNumLockScrollLockAlt键Ctrl键Left-ShiftRight-Shift激活为1激活为1激活为1激活为1按下为1按下为1按下为1按下为1Yoursitehere640KBRAM基本内存0000:00000040:00000050:00000070:0000A000:0000B000:0000C800:0000F600:0000FE00:0000FE00:1FFF显示缓存区(显存)硬盘驱动器控制ROM32KBROMBASIC8KBROMBIOSIO.SYS模块COMMAND.COM常驻模块MSDOS.SYS模块用户程序空间COMMAND.COM暂驻模块256KBROMDOS工作区ROMBIOS工作区128KBRAM保留区1KB中断向量表键盘缓冲区KB_BUFFER键盘缓冲区KB_BUFFER在ROMBIOS数据区中。0040:001ABUFF_HEADDW?0040:001CBUFF_TAILDW?0040:001EKB_BUFFERDW16DUP(?)0040:003EKB_BUFFER_ENDLABELWORD这是一个先进先出的循环队列,每取出一个字符就修改HEAD指针,当HEAD和TAIL指针相等时缓冲区为空。Yoursitehere类型9中断例程对键盘输入的处理下面我们按照键盘缓冲区的逻辑结构,来看一下键盘输入的扫描码和对应ASCII码是如何写入键盘缓冲区的。我们通过下面几个键:A、B、C、D、E、shift_A、A的输入过程,简要地看一下int9中断例程对键盘输入的处理方法。CPU要想取得键盘输入,就要调用BIOS键盘例行程序,它按其接收时的次序从缓冲区中取出字符和扫描码,回送给CPU。Yoursitehere键盘输入演示Yoursitehere(1)BIOS键盘中断(INT16H)AH功能返回参数0从键盘读一字符AL=字符码,AH=扫描码1读键盘状态并如按下ZF=0,AL=字符码,AH=扫描码检查是否有字符输入否则ZF=1,缓冲区空2取键盘状态字节AH=00,AL=键盘状态字节(KB_FLAG)比如指令序列:MOVAH,0INT16H;等待按键输入然后取得扫描码和字符码MOVBX,AX;用BX传递参数CALLBINIHEX;调用子程序将BX转16进制并显示Yoursitehereint16h读键盘缓冲区演示Yoursitehere使用int16h中断例程读取键盘缓冲区从上面我们可以看出,int16h中断例程的0号功能,进行如下的工作:(1)检测键盘缓冲区中是否有数据;(2)没有则继续做第1步;(3)读取缓冲区第一个字单元中的键盘输入;(4)将读取的扫描码送入ah,ASCII码送入al;(5)将己读取的键盘输入从缓冲区中删除。可见,B1OS的int9中断例程和int16h中断例程是一对相互配合的程序,int9中断例程向键盘缓冲区中写入,int16h中断例程从缓冲区中读出。Yoursitehere(2)DOS键盘中断(INT21H)AH功能调用参数返回参数1从键盘输入一个字符并回显在屏幕上AL=字符6读键盘字符,不回显DL=0FFH若有字符可取,AL=字符,ZF=0若无字符可取,AL=0,ZF=17从键盘输入一个字符,不回显AL=字符8从键盘输入一个字符,不回显,AL=字符检测Ctrl-BreakA输入字符到缓冲区DS:DX=缓冲区首址Yoursitehere例:检测键盘输入的字符是否为回车键Wait_here:movah,7int21h;等待输入cmpal,0dh;比较判断jnewait-here例:某程序在执行过程中检测是否有键盘输入Sounder:…movah,0bhint21h;读键盘状态incaljnzsounder;AL不等于0无键入retYoursitehere例:输入字符串到缓冲区STRINGDATASEGMENTMAXLENDB32ACTLENDB?STRINGDB32DUP(?)DATAENDSCODESEGMENT…LEADX,MAXLENMOVAH,0AHINT21H…CODEENDSENDMAXLENACTLENSTRING32568H61H70H70H79H0DHMAXLENDB32,0,32DUP(?)MAXLENDB32,33DUP(?)输入happyDOS键盘中断0AH功能号Yoursitehere①若(DS:DX)字节单元的值为0,则不等待从键盘输入,结束调用。②若(DS:DX)字节单元的内容大于0,则等待从键盘输入,并把输入键的ASCII码顺序存放在DS:DX+2开始的单元,按回车键表示结束输入。当按下键的个数超过(DS:DX)中值,发出警告声’嘟嘟’,不再接收输入的数据,直到输入回车键。③将实际输入的字符个数(不包括回车键)填入(DS:DX+1),结束调用。DS:DX000000000000000000000000000000000AH功能执行过程:Yoursitehere◢输入的字符均带回显,且光标随字符移动。当输入回车符结束时,也回显回车符。表现为功能调用结束后,光标回到了行首。◢回车符0DH作为一个输入的字符存放在字符串尾,但计算输入个数时,不包括回车键。实际最多能输入的字符数=限制的最多数-1(回车符占一个)◢执行完0AH功能后,DS和DX的值不变,DS:DX仍指向缓冲区的首地址。◢整个缓冲区的大小应为:限制的最多数+2maxDB11,?,11dup(?)缓冲区必须定义为字节类型,不能定义为字类型。0AH功能注意事项:Yoursitehere9.2显示器I/O①显示器通过显卡(显示适配器)连接到计算机上。②单色显示适配器(MDA)只能显示黑白两色。只能显示ASCII码字符和一些简单字符图形。彩色显示适配器(CGA)能以红、绿、蓝彩色显示以点绘制的图形以及ASCII字符。增强型图形适配器(EGA)和视频图形阵列适配器(VGA)的分辨率和彩色功能比MDA和CGA有很大提高,可以设置多种字