1、 第第14章章 BIOS和和DOS 中断中断 MS_DOS系统中,有两层内部子程序可供用户调用:基本输入输出子程序BIOS层的功能模块以及DOS层的功能模块。这些子程序对于程序员来讲都可以看成是中断处理程序,它们的入口地址都存在中断矢量表中。用户使用功能号及相应的软件中断指令就可以直接调用它们,这就在很大程度上方便了程序员对这些微机系统功能的扩充与开发。驻留在内存较高地址区域0FE000H开始的8KROM中装有基本输入输出系统BIOS(Basic Input/Output System),提供了系统加电自检,引导装入,主要I/O设备的处理程序以及接口控制等功能模块用来处理系统中断。使用BIOS
2、功能调用,使程序员不必了解硬件I/O接口的特性,可直接使用指令来设置参数,然后调用BIOS中的程序,所以利用BIOS功能调用所编写的程序就更加简单明了,其可读性好,而且更加易于移植。BIOS已固化在EPROM中而成为固件。磁盘操作系统DOS(Disk Operrating System)是IBM_PC机中最重要的操作系统,它有二个DOS模块:IBMBIO.COM和IBMDOS.COM。因为DOS模块提供了更多更必要的测试,使DOS操作比使用相应功能的BIOS操作更简易,并且DOS对硬件的依赖性更少些。在编程中的某些情况下,我们既可选择DOS中断也可以选择BIOS中断来执行相同的功能。例如,打印
3、机输出一个字符的功能,可用中断类型号为21H的DOS功能调用中的功能号5,也可以用中断类型号为17H的BIOS功能调用中的功能号0。由于BIOS比DOS更靠近硬件,在一般情况下尽可能地使用DOS功能调用,但在少数情况下,必须使用BIOS功能,因为它没有等效的DOS功能。在内存单元最低的1K个字节单元的中断矢量表中,可以存放256(0FFH)个中断子程序的入口地址。对这些中断调用是通过软中断指令INT来实现的。中断指令的操作数就是中断类型码。如:INT n。中断调用的类型码及其功能,请参阅附录F。14.1 键盘I/O键盘是计算机用来输入信息的最基本输入设备,是人机对话的主要界面。键盘上的按键可分
4、成以下3种基本类型:(1)字符数字等按键:字母A(A)Z(Z),数字09及#,$,%,&,等常用的符号,这些字符数字键可向计算机传输ASCII码字符;(2)扩展功能的按键:Home,PgUp,PgDn,End,BackSpacd,Ins,Del,Enter,等以及程序功能按键F1F10等,这些键按下将产生一个动作,如按下End键将使光标移到屏幕上现行行文本的末尾;(3)和其它键组合使用的控制键:Alt,Ctrl以及Shift等,利用组合控制键能够改变其它键所产生的字符码,如,直接按8键,屏幕显示8,而当先按Shift键不放再按8键,则在清华紫光的中文状态下结果为;在DOS状态下按Shift8的
5、结果是*号。键盘上有的按键存在对应的ASCII码;有的没有,如F1F10的功能键,但键盘上的每个键都对应一个扫描码,从ESC(01)DEL(83),我们就可以根据扫描码唯一确定是哪个键改变了其状态。表141为按键与其对应的扫描码(十六进制表示)。14.1.1 BIOS键盘中断键盘中断我们利用键盘进行通信,可以使用DOS功能调用,也可以使用BIOS功能调用。BIOS功能调用中的中断类型码16H,提供了基本的键盘操作,中断类型码16H的中断处理程序包括3个不同的功能,由AH寄存器的内容来选择。AH中存放的是调用功能号,可看成是某中断类型号中的菜单号。AH=0功能:从键盘读一字符。调用返回参数:AL
6、=字符的ASCII码,AH=键盘扫描码。调用示例:MOV AH,0INT 16H2AH1功能:读键盘缓冲区的字符,该子功能检查键盘是否有字符输入。调用返回:(1)若有键已按下在等待输入:ZF=0AH=键盘扫描码AL=字符的ASCII码(2)如无键按下:ZF=1,缓冲区为空。3AH2 功能:读键盘功能转换键返回参数:AL=键盘状态字节,其各状态位意义如下:当状态位为1时的含义。D7:Insert打开D6:Caps Lock打开D5:Num Lock打开D4:Scroll Lock打开D3:Alt键按下D2:Ctrl键按下D1:Left-shift键按下D0:Rghit-shift键按下调用例子:
7、要查看键盘的大写/小写状态,可编制以下的程序段:MOV AH,02HINT 16HTEST AL,40H ;测试CAPS LOCK键JNZ CAPS ;大写转CAPS ;小写CAPS:;大写 Ctrl-Break键。INT 21H的功能号8不回显字符,但检验Ctrl-Break键。单字符输入功能(前面章节已有介绍)的用途是很明显的,如:在交互程序中,常需要用户对一个提示做出应答,或通过输入一个字母或数字对菜单的项进行选择,这都要使用单字符的输入功能。【例141】编写程序段实现:当程序显示出一串信息时,要求回答Y或N,回答Y,程序转入标号为YES的程序段;回答N使程序转入标号为NO的程序段,而按
8、下其它键,程序就返回等待再按键。;设已显示一串信息INKEY:MOV AH,1 ;INT 21HCMP AL,YJZ YES ;是大写Y转YESCMP AL,yJZ YES ;是小写Y转YES,有这两步就可识别大小写CMP AL,NJZ NOCMP AL,nJZ NOJMP INKEYYES:NO:如果想要检测Enter(Return)的键是否已按下,就要求在指令中写出它的ASCII码0DH或13。如要求程序只有在按下Enter(Return)键后才能继续运行,可使用下面的指令序列:WENTER:MOV AH,7 ;使用7号功能,使按下的字符不回显INT 21HCMP AL,0DHJNZ WE
9、NTER ;不是回车键,返回继续按键如果要求程序能够接收功能键或数字组合键必须进行两次DOS调用,第一次回送00,第二次回送扫描码。【例142】当用户通过键入F1,F2或F3来选择3个不同的程序模块,若按下其它键输出错误信息,其检测与识别的主要程序段为:MOV AH,7INT 21HCMP AL,0 ;是功能键吗?JZ GLJ ;是,转GLJJMP ERROR ;不是功能键,转出错处理GLJ:MOV AH,7INT 21HCMP AL,3BH ;F1的扫描码为3BHJZ CXD1 ;是F1键按下,转程序段1 CMP AL,3CH ;是F2吗?JZ CXD2CMP AL,3DH ;是F3吗?JZ
10、 CXD3JMP ERROR ;按其它功能键,也转出错处理 2输入字符串输入字符串 在编写程序的过程中,需要用户输入姓名、地址、菜单项字符串或其它字符串等,DOS功能调用的中断类型号21H内的功能号0AH(10),能从键盘读入一串字符并把它存入程序员自己定义的缓冲区中。缓冲区的第一个字节存入缓冲区能接收的预订字符个数,该数值由程序员设置,其数值的范围为1255,不可为0,因为缓冲区只用一个字节存放字符数,所以预订的最大数为255;缓冲区的第二个字节存入本次调用实际输入的字符数(不含回车键),该值由DOS调用返回时系统自动填入;从缓冲区的第三个字节开始存放从键盘输入的字符,若实际输入的字符少于定
11、义的字节数,则多余字节补上零,但如果实际输入的字符多于事先预订的字节数,则多余字符将被略去,且响铃提示,直到输入一个回车键才算结束。字符串按字节存入缓冲区,最后结束字符串的回车符0DH还要占用一个字节,因此整个缓冲区的字节空间应为实际输入的最大字符数加2(包含系统自动填入的实际字符数与回车键0DH在内),实际字符数不包含回车键0DH。【例143】编写在数据区定义字符缓冲区以及输入字符串的指令集。LENMAX DB 100 ;字符缓冲区的定义ACTLEN DB?STRING DB 100 DUP(?);输入字符串指令为:MOV DX,OFFSET LENMAXMOV AH,0AHINT 21H
12、INT 21H的功能号0AH把实际字符数(不包括回车键0DH)填入缓冲区的第二个字节,并保持指针DS:DX指向缓冲区的第一个字节。注:从键盘输入字符串到内存缓冲区的同时,并自动送显示器显示。0AH功能号调用时,要求指针DS:DX指向整个缓冲区首地址。【例144】从键盘输入一组字符串信息。本程序将接收键入字符串并显示,直到遇回车键结束输入。DATA SEGMENTMESS1 DB 10 ;设置缓冲区空间 DB?DB 10 DUP(?)DATA ENDSSTAK SEGMENT STACK DB 100 DUP(?)STAK ENDSCODE SEGMENT ASSUME CS:CODE,DS:D
13、ATASTART:MOV AX,DATA MOV DS,AX MOV DX,OFFSET MESS1;置缓冲区地址指针MOV AH,0AHINT 21H MOV AX,4C00H INT 21H CODE ENDS END START 对DOS功能调用INT 21H中的功能号0AH,所输入的字符串的实际字符会显示在屏幕上,如果调用字符串显示功能号9重新在下一行再显示一次,其源程序如下所示:DATA SEGMENT DA1 DB 10 DB?DB 10 DUP(?)DATA ENDS STAK SEGMENT STACK DW 100 DUP(?)STAK ENDS CODE SEGMENT A
14、SSUME CS:CODE,DS:DATA GO:MOV AX,DATA MOV DS,AX LEA DX,DA1 ;指针指向缓冲区首址 MOV AH,10 ;输入字符串功能号 INT 21H LEA BX,DA1 MOV AL,DA1+1 ;取实际输入的字符个数 MOV AH,0 ADD BX,AX ;形成地址指针(偏移量)MOV BYTE PTR BX+2,$;用$取代0DH MOV AH,2 ;回车换行 MOV DL,10 INT 21H MOV DL,13 INT 21H LEA DX,DA1+2;指针指向实际输入字符首址 MOV AH,9 INT 21H MOV AH,4CH INT
15、 21H CODE ENDS END GO 3清除键盘缓冲区清除键盘缓冲区从键盘输入的字符实际上是先存放在一个16字节的键盘缓冲区内,功能1,7,8和0AH实际上都是从键盘缓冲区取得字符的DOS功能调用的功能号。DOS功能调用INT 21H的功能号AH=0CH,能够清除键盘缓冲区,而后执行存在AL中所指定的功能号,AL指定的功能号可以是1,6,7,8或0AH,我们可以利用功能号0CH使得在程序输入一个字符之前,将以前所键入的字符清除。功能号0CH的使用示例:MOV AH,0CHMOV AL,7INT 21H 这几条指令序列,是先清除键盘缓冲区,实际提供的是输入功能7,它不回显,不检测Ctrl-
16、Break或Ctrl_C来结束程序。4.检验键盘状态检验键盘状态DOS功能调用INT 21H的功能号0BH,能够检验一个键是否被按动,如果一个键被按下,就在AL寄存器中存入0FFH,如果键没有被按下,那就在AL中存放00H。请读者注意:无论是哪一种情况,都将继续执行程序中的下一条指令。有时这种功能是很有用的,例如,我们希望程序保持运行的状态,同时又可以检验键盘,看用户是否按下任意一个键来终止程序或是退出循环。【例145】用按键结束循环的例子。LOP:MOV AH,0BH ;检测键盘有键按下否INT 21HCMP AL,0JE LOP ;没有键按下,AL0NEXT1:以上指令序列的特点是,在未按
17、键之前,程序总是不断地执行循环,只要有按下任何一个键,程序就可以退出循环。14.2 显示器显示器I/O 单色适配器只能显示字符,只可用于显示黑白效果。字符由标准字母、数字、符号,加上一些简单图形所组成。如果显示器的屏幕被划分成80列25行,适配器就是在这个2000个(2580)网格位置上显示字符。屏幕上的每个字符位置都是与显示缓冲区中相应的存储单元一一对应,我们称此屏幕是“存储器映象”的。14.2.1 显示属性显示属性 单色显示的屏幕上,每个字符在存储器中都由两个字节表示,一个字节存放字符的ASCII码,另一个字节保存该字符的属性。字符的属性确定了要显示字符的特性,如字符是否要闪烁显示,是否需
18、要加亮,是否要反相显示。代表单色显示属性的字节各位含义如图141所示。2设置光标位置设置光标位置 利用BIOS功能调用INT 10H的功能号2设置光标位置。在字符显示方式下,设置字符坐标。功能调用前的设置:AH=02HBH=页号(在当前屏幕显示时,BH=0)DH=行号(Y坐标)DL=列号(X坐标)当屏幕显示25行,每行80个字符时,行与列设在(0,0)位置是屏幕的左上角,(24,79)是屏幕的右下角。BH中必须包含被输出的页号,对单色显示器来说,页号总是0。【例146】置光标的大小:开始行(扫描行)为0,结束行为3;置光标的位置:光标设置在第10行(字符行)第20列。编写的指令序列如下:MOV
19、 CH,0MOV CL,3MOV AH,1INT 10H ;控制光标大小;-MOV DH,9 ;第10行MOV DL,19 ;第20列MOV BH,0 ;页0MOV AH,2INT 10H 3读光标位置读光标位置 利用BIOS功能调用INT 10H的功能号3都光标的位置。在字符显示方式下,返回的是屏幕上光标的当前位置以及光标的大小。页号必须在BH中指定。功能调用之前:AH=03HBH=00H 在完成子功能调用之后,将把光标的位置行号回送给DH,列号回送给DL;光标大小的参数填入CH(光标开始行)和CL(光标结束行),实际上,在CH和CL中回收的是用功能号1所设置的光标参数。返回的光标位置和光标
20、大小的寄存器是:DH=光标当前行号(字符行)DL=光标当前列号CH=光标的起始线(扫描线)CL=光标的结束线 4读光笔位置读光笔位置BIOS功能调用的INT 10H中功能号4,是读取光笔的位置。其功能调用为:MOV AH,04HINT 10H此子功能调用返回时:当AH=0,表示光笔未触发;若AH=1,表示光笔已触发;返回的光笔位置为:DH=字符行DL=字符列CX=象素行BX=象素列 5.选择当前显示页选择当前显示页 利用BIOS功能调用INT 10H的功能号5是选择当前显示页,显示存储器可以存储几页(或屏)的显示信息,但是一次只能在屏幕上显示一页的信息,正在显示的那一页称为当前页(Active
21、 display page)。功能号05H就是选择哪一页作为当前显示页。对于不同的显示方式,适配器可用的页号也不同,如:显示方式 可用页号0,1 07(CGA)2,3 03(CGA)2,3,0DH 07(EGA)0EH 03(EGA)0FH,10H 01(EGA)功能调用前:AH05HAL当前显示页号如显示当前页:MOV AH,5MOV AL,0INT 10H 6清屏和屏幕上卷清屏和屏幕上卷 利用BIOS功能调用INT 10H的功能号6,能使屏幕内容上卷指定的行,这个功能需要设置7个参数:AH=06HAL=上卷行数(如AL=0,实际完成清屏幕功能)BH=新插入行的字符属性CH=上卷的左上角行号
22、CL=上卷的左上角列号DH=上卷的右下角行号DL=上卷的右下角列号 如果上卷屏幕的起始行列号不为(0,0),而结束的行列号不是(24,70),这里假设一个屏幕显示的字符为8025,则屏幕只有指定的那部分才具有上卷的功能,这个屏幕上的部分区域就称为窗口(Window),象这样的窗口可以在屏幕上设置多个,且都可独立使用。如果上卷超过指定窗口的顶部,这些行的内容就会被丢失,出现在窗口底部的新行被填为空格,其属性应由BH寄存器决定。如果AL=0,其实际完成的工作是清除屏幕的功能,或使指定的窗口为空白状态。7清屏和屏幕下卷 利用BIOS功能调用INT 10H的功能号7和功能号6相类似,也可使屏幕(或窗口
23、)初始化或使屏幕(或窗口)的内容下卷指定的行。这个功能也需要设置7个参数,子功能调用前:AH=07HAL=下卷行数(如AL=0,则指定屏幕上为空白)BH新插入行的字符属性CH=下卷的左上角行号CL=下卷的左上角列号DH=下卷的右下角行号DL=下卷的右下角列号 【例147】清除左上角行列号为(0,0),右下角行列号为(24,39)的窗口,初始化为反相显示,则这窗口相当于全屏幕的左半部分。MOV AH,7MOV AL,0MOV BH,70H ;反相显示MOV CH,0MOV CL,0MOV DH,24MOV DL,39INT 10H 【例148】要求编制一个完整的源程序,实现在屏幕的中部建立一个2
24、0列宽,9个字符行的窗口,并把键入的内容在这个窗口中显示出来。键入的字符在窗口的最下面一行显示,每当输入 20个字符,该行就向上卷动1行,当9行字符输入完后再输入,则顶端1行的内容就会丢失,以此就发生向上卷动。STAK SEGMENT STACKDB 100 DUP(?)STAK ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODESTART:PUSH DSSUB AX,AXPUSH AX;清屏幕并设置上卷功能MOV AH,6MOV AL,0 ;清屏MOV CH,0MOV CL,0MOV DH,24MOV DL,79MOV BH,07H ;显示属性,黑底白字I
25、NT 10H;-SZGB:MOV AH,2 ;设置光标位置MOV DH,16 ;16行MOV DL,30 ;30列MOV BH,0 ;0页INT 10H;-MOV CX,20 ;每行输入20个字符SRZH:MOV AH,1 ;输入字符 INT 21H ;DOS 21H的功能1调单字符输入CMP AL,1BH;判AL中是否为ESC键的ASCII码 JZ DONELOOP SRZH;MOV AH,6 ;设置上卷功能MOV AL,1 ;每次上卷一行MOV CH,8 ;左上角(,30)MOV CL,30 ;MOV DH,16 ;右下角(16,50)MOV DL,50 ;MOV BH,07HINT 10
26、HMP SZGBDONE:RET CODE ENDS END START 属性,在调用此功能前可用INT 10的02号功能设置当前光标位置。功能调用前设置:AH09AL字符的ASCII码BH页号BL字符属性CX写入的字符个数INT 10的功能号把一个字符与属性显示在光标指定的位置上,然后光标又返回到它的初始位置,所以在当前光标位置上写一个字符之后,必须用INT 10的功能号02移动光标到下一个字符的位置上。10在当前光标位置上只显示字符利用BIOS功能调用INT 10H的功能号0A,可用于输出字符,它的属性值就是这一位置上先前已具有的属性。0A功能在使用黑白显示器时就显得特别方便,因为,此时我
27、们就很少去改变显示字符的属性。功能调用前的设置:AH0AAL字符的ASCII码BH页号CX写入的字符个数 【例14】将光标设置在显示页的(20,30)位置上,并以黑底白字的属性,在光标所在位置上显示一个“”号。MOVAH,MOVBH,MOV DH,20MOV DL,30INT 10H ;设置光标在显示页0的(20,30)位置MOV AH,9MOV AL,MOV BH,0MOV BL,07H ;字符属性黑底白字MOV CX,1 ;字符重复的次数INT 10H11显示字符光标跟随字符移动利用BIOS功能调用INT 10H的功能号0E,可以在光标所在处显示字符并使光标跟随字符移动,功能调用前的设置:
28、AH0EH AL字符的ASCII码 BL前景彩色 12显示字符串利用BIOS功能调用INT 10H的功能号13,可以设置几种形式的显示效果。功能调用前的设置方式有:AH13HES:BP字符串首地址指针CX字符串的长度DH,DL起始行列的位置BH页号AL0,BL属性(字符统一属性)串:Char,Char,Char,Char;光标返回起始位置AL1,BL属性(字符统一属性)串:Char,Char,Char,Char;光标跟随移动AL2串:Char,attr,Char,attr;光标返回起始位置AL3串:Char,attr,Char,attr;光标跟随移动 【例10】在第13行40列的光标位置显示字
29、符串YES,其中Y为红底白字;E为白底红字;S为绿底红字。源程序为:STAK SEGMENT STACK DW 100 DUP(?)STAK ENDSCODE SEGMENTASSUME CS:CODE,ES:CODESTRING DB Y,47H,E,74H,S,24HGO:MOV AX,CODEMOV ES,AXLEA BP,STRINGMOV CX,3 ;字符与属性合在一起算1MOV DX,0C27H ;DH12为行号,DL39为列号MOV BH,0 ;当前页0MOV AX,1303H ;功能号AH13H,AL3INT 10H ;BIOS功能调用MOV AH,4CHINT 21HCODE
30、ENDSEND GO 14.2.3 DOS显示功能调用显示功能调用DOS显示功能调用中有两个单字符显示的功能,一个为字符串显示的功能,这些功能都可以自动随字符的显示向前移动光标。INT 21H的显示操作:显示一个字符(检验Ctrl+Break)(前头章节已经使用)功能号:AH调用参数:DL字符ASCII码,光标跟随字符移动显示一个字符(不检验trl+Break)功能号:AH调用参数:DLASCII码字符,光标跟随字符移动显示字符串功能号:AH调用参数:DS:DX字符串首地址,串必须以$结束,字符串以$字符(ASCII码为24)作为定界符,它以$作为标记来计算串的长度,光标跟随字符移动。而有些A
31、SCII码,如控制码,不能出现在该字符串中。显示字符串时,如果希望光标能自动换行,可在字符串开头或字符串结束之前($之前)加上回车和换行的ASCII码。如:STRINGDBHowoldareyou?,0DH,0AH,$要显示输出的信息一般在数据段中定义。输出以上字符串的指令序列为:MOVAX,SEGSTRING ;回收变量的段基值MOVDS,AXMOVAH,MOVDX,OFFSETSTRING;回收变量的偏移量INT 21H利用等值伪指令,可以使程序更加清晰,另外也可以根据显示格式的需求使用Tab符(ASCII码为09)。CR EQU 0DH (或CREQU 13)LF EQU 0AH (或L
32、F EQU 10)TAB EQU 09H STRING DB TAB,How old are you?,CR,LF,$注意:使用INT 21H的9号功能显示字符串时,一定要在显示串之后加上定界符$,丢失定界符可能会在屏幕上引起意想不到的结果,特此强调。【例1411】使用09号功能调用,输出显示一个菜单。DATA EGMENT STRI DB 请选择菜单!,0DH,0AH DB 1显示三角波,0DH,0AH DB 2显示方波,0DH,0AH DB 3退出,0DH,0AH,$DATA ENDS STAK SEGMENT STACK DW 50 DUP(?)STAK ENDS CODE SEGMEN
33、T ASSUME CS:CODE,DS:DATAMAIN:MOV AX,DATA MOV DS,AX MOV DX,OFFSET STRI MOV AH,9 INT 21H ;此处程序略 MOV AX,4C00H INT 21HCODE ENDS END MAIN 14.3 打印机打印机I/O打印机是计算机主要的输出设备,按照打印原理可分为字模式、针式、激光式、喷墨式、热转印式、等多种。字模式与针式是属于击打式打印机,其它的为非击打式印字机。随着打印字符种类的增加,特别是打印图形和汉字的需要,发展了点阵式打印机。打印机的接口有并行接口,即一次从处理器接收8位代码。还有串行打印接口,即每次从处理
34、器接收一位代码。IBM_PC适用于并行接口的打印机,所有打印机使用ASCII码标准。许多打印机都具有能存储几千个字符的缓存器。一台打印机必须能识别并处理从CPU来的信号,如换页、换行或列表符(TAB)。CPU也必须理解从打印机发来的表示忙或打印超边界等信息。不同类型的打印机,为什么它可以响应从CPU发来的不同信号?那就是,我们在编写打印机程序之前,必须先了解连接在计算机上的打印机的型号类别,认真查阅所使用的打印机技术手册。但是就打印机的处理过程而言,它要比屏幕处理、磁盘处理都要简便,它只是涉及很少的一些基本操作,它既可以利用DOS的INT 21H功能调用来实现,也可以用BIOS的INT 17H
35、功能调用来实现,如表144所示。字符数。主要程序段如下:STRING DB Character to print,call DOS!N EQU$N MOV CX,N MOV SI,OFFSET STRING LOP:MOV AH,5 MOV DL,SI INT 21H INC SI LOOP LOP 这些指令也适用于发送打印控制字符。例如STRING字符串定义如下:STRING DB 0CH,Character to print,call DOS!,0DH,0AH,0AH字符串中第一个字符0CH为换页码。使字符串打印在新的一页的顶部,并与下文有两个空行的距离(换行两次)。14.3.2 打印机的
36、控制字符打印机的控制字符 【例1413】TRING DB 0FH,IBH,30H,Title Binihex,0DH,0AH 上述数据区中的命令是设置紧缩方式,每英寸为8行,打印一个标题Title Binihex后,发送回车与换行字符。(2)直接使用指令方式 MOV AH,5 ;置请求打印功能号 MOV DL,0FH ;设置紧缩方式 INT 21H 这三条指令被执行后,打印机的字符都是以紧缩方式打印,只有当程序发送取消此方式的命令后,才变成正常的方式进行打印。以上介绍的特殊命令并不能适合于所有型号的打印机,应注意查阅有关打印机的手册,看其是否具有执行这些特殊命令的功能。14.3.3 BIOS打
37、印功能打印功能BIOS的功能调用INT 17H中断指令提供了由AH寄存器指定的三种不同的操作。1BIOS 中断INT 17H的功能号0是打印一个字符的功能。要打印输出的字符放在AL中,打印机号放在DX中,BIOS最多允许连接三台打印机,机号分别为0,1和2。如果只有一台打印机,那么就是0号打印机。打印机的状态信息可被回送到AH寄存器。MOV AH,0 ;置功能号 MOV AL,char ;char代表要打印字符的ASCII码 MOV DX,0 ;选择#0打印机 INT 17H ;BIOS中断17H 2BIOS中断INT 17H的功能号1是初始化打印机,并回送打印机的状态到AH寄存器。如果把打印
38、机电源开关关上然后又打开,打印机各部分就复位到初始值。这个功能和打开打印机时的作用一样。在每个程序的初始化部分,可以使用INT 17H的功能号1初始化打印机。MOV AH,1 MOV DX,0 ;选择#0打印机 INT 17H这个操作会发送一个换页符,因此这个操作能把打印头设置在一页的顶部。对于大多数打印机,只要一上电,就自动对打印机进行初始化。3BIOS中断INT 17H的功能号2把状态字节读入AH寄存器。打印机的状态字节如图142 所示。D7:打印机忙(Priter busy):表示打印机正在接收数据,或正在打印,或处于脱机状态。D6:应答位(acknowledge):表示打印机已发出一个
39、表明它已经接收到数据的信号。D5:选择位(Select):表示打印机是联机的。D0:超时位(Time out):表示打印机发出忙信号时间很长了,系统将不再给它传送数据。DW 100 DUP(?)P_STAK ENDSP_DATA SEGMENTINCHAR DB 20 DUP(?)P_DATA ENDS P_CODE SEGMENTP_INT PROC FAR ASSUME CS:P_CODE,DS:P_DATA,ES:P_DATA START:PUSH DS SUB AX,AX PUSH AX ;为执行INT 20H的需要,返回DOS MOV AX,P_DATA MOV DS,AX MOV
40、ES,AX STI ;开中断 CLD ;增址方向 MOV AH,1 ;初始化打印机 MOV DX,0 INT 17H MOV AH,6 ;清屏幕 MOV AL,0 MOV CH,0 ;左上角坐标 MOV CL,0 MOV DH,24 ;右下角坐标 MOV DL,79 MOV BH,7 ;正常显示,白底黑字 INT 10H MOV AH,2 ;显示PROMPT字符 MOV DL,10H INT 21HIN_CHAR:MOV AH,1 INT 21HCHK_CHAR:CMP AL,0 ;如果是任何非ASCII码 JE PEND ;则转结束OUT_CHAR:MOV DL,AL ;打印字符MOV AH
41、,5INT 21HCMP AL,0DH ;检测是否为CR键JNZ IN_CHARMOV DL,0AH ;命令打印机换行MOV AH,5INT 21HMOV AH,2 ;屏幕上也换行INT 21HJMP IN_ CHAR PEND:RET P_INT ENDP P_CODE ENDSEND START MOV BX,OFFSET BUFF MOV CX,COUNT LOP:MOV DL,BX MOV AH,4 INT 21H INC BX LOOP LOP DOS没有提供读辅助设备的状态和检测I/O错误(如丢失字符等)的功能,但在BIOS的INT 14H中提供了这些功能。14.4.3 BIOS串
42、行通讯口功能串行通讯口功能IBM_PC的串行口I/O通过中断INT 14H 调用 ROM BIOS串行通讯口例行程序。该例行程序包括将串行口初始化为指定的字节结构和传输速率,检查控制器的状态,读写字符等功能。个完整的数据字的传输时间。奇偶错:由通信线上的干扰信号而引起某些数据位的改变,产生奇偶错。超越错:在上一个字符还没有被处理机取走,又有字符传送到数据寄存器中,则会引起超越错,通常处理机处理字符的速率小于串行口的波特率,就会发生这种错误。也称为溢出错。【例1418】从通讯口0读入字符并且把它们显示出来,如果字符没有准备就绪则等待,如果传送出错则显示出错信息“?”。其主要程序段为:CHECK:
43、MOV AH,3 ;MOV DX,0 ;COM1口INT 14H ;调BIOS 14H中断 ADD AH,1JZ CHECK ;MOV AH,2 ;MOV DX,0 ;INT 14HTEST AH,80H ;AH7为1失败,否则成功JNZ ERROR ;AND AL,7FH ;显示字符信息MOV BX,0 ;MOV AH,0EHINT 10H ;JMP CHECK ;ERROR:MOV AL,?;显示出错信息MOV BX,0MOV AH,0EH ;INT 10H ;BIOS的INT 10H功能号0EH为显示字符,且光标前移。调用前有:AH=0EH;AL=字符;BL=前景色;INT 10H调用
44、14.5 显示方式显示方式编制图形程序是程序设计中有趣和有价值的工作之一。在图形领域中,汇编语言具有其潜在的优点,因为显示屏上的一个图象是由成千上万个基本元素所组成,处理这些图像元素就需要大量的指令。就速度来说,汇编语言的运行速度远比高级语言快得多,最高级的图形技术,例如动漫,只有用汇编语言设计才会更加逼真,更加有效。IBM_PC的标准显示适配器,一种是单色显示,它只能显示黑白字母、数字、符号和菱形、方块等简单的图形字符,很显然,它是以文本方式工作的。另一种是彩色/图形适配器EGA和VGA,它能以文本和图形两种方式工作。每种文本方式和图形方式只适合于特定的适配器,不同的显示方式,在屏幕上所显示
45、的像素分辨率、字符分辨率、颜色数及显示缓冲区的存储组织方式都不相同。在图形方式中,彩色/图形适配器把屏幕分成mn的点阵,每个点的坐标上的图象元素就是一个象素(Ples)。如VGA中的一种标准图形分辨率为:颜色数16;字符分辨率8025;像素分辨率720400;字形模式916。有关显示器和适配器的功能,在配置时要阅读说明书,才能根据硬件配置的情况,选择最能发挥显示器和适配器功能的显示方式。过两个例子来理解其用法。【例1420】在屏幕上以绿底红字正常显示字符串:“MY COMPUTER”STRING DB MY COMPUTER LEN_STR EQU$-STRING MOV AL,3 ;sele
46、ct 8025 color text MOV AH,0 ;change the mode INT 10H MOV BP,SEG STRING ;base of string MOV ES,BP MOV BP,OFFSET STRING;offset of string MOV CX,LEN_STR ;character count MOV DX,0 ;start at top left corner MOV BL,24H ;use blue_on_red lettering MOV AL,1 ;make curson return MOV AH,13H ;display the string
47、INT 10H ;call BIOS 【例【例1421】在屏幕上以红底兰字显示在屏幕上以红底兰字显示“WORLD”,然后分别以红底绿字和红底兰字相间,然后分别以红底绿字和红底兰字相间地显示地显示“SCENERY”。DATA SEGMENT STR1 DB WORLD STR2 DB S,42H,C,41H,E,42H,N,41H DB E,42H,R,41H,Y,42HLEN_STR2 EQU ($-STRING2)2 DATA ENDS MOV AL,3 ;select 8025 color text MOV AH,0 ;change the mode INT 10H MOV BP,SEG
48、STR1 ;base of first str1 MOV CX,STR2STR1 MOV DX,0 MOV BL,41H ;color is blue_on_red MOV AL,1 ;character STRING MOV AH,13H ;dsplay THE STRING1 INT 10H MOV AH,3 ;read the cursor posiitions INT 10H MOV BP,OFFSET STR2 ;offset of str2 MOV CX,LEN_STR2 ;character count MOV AL,3 ;display char and attr MOV AH
49、,13H ;display the str2 INT 10H ;call BIOS 14.7 字符图形字符图形文本方式一般用来显示信息,然而利用字符集中的方块图形字符也能产生一些较为简单的图形。多个方块图形字符也能组装成一个比较复杂的图形,显示的方法和一般字符大体一样,调用BIOS的字符显示功能,如INT 10H的功能号09H或0AH等。以下的【例1422】是一个单字符图形的显示程序,它能在屏幕上沿着一条斜线的轨迹显示出笑脸符:AH=0FH,把显示页号读入BH;AH=0,选择8025黑白文本方式;AH=2,移动光标;AH=0AH,显示一个字符。【例1422】试用“笑脸”符画一条斜线,设源程序名
50、为99.ASM。CSEG SEGMENT ASSUME CS:CSEGMAIN PROC FARSTART:PUSH DS SUB AX,AX PUSH AX MOV AH,0FH ;置BH为当前显示页 INT 10H MOV AH,0 ;选择8025黑白文本方式MOV AL,2INT 10HMOV CX,1 ;重复字符数MOV DX,0 ;光标初始位置(0,0)NEXT:MOV AH,2INT 10HMOV AL,2 ;显示笑脸符MOV AH,0AH ;写字符到屏幕INT 10H ;INC DH ;光标位置修改INC DL ;光标位置修改CMP DH,25 ;JNE NEXT ;光标未到屏幕