




已阅读5页,还剩72页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第九章 BIOS和DOS中断,1 BIOS与DOS中断调用概述 2 键盘I/O程序设计 3 显示器I/O程序设计 4 BIOS及DOS的时间功能调用,BIOS与DOS中断调用概述,在实际应用中,PC机与外部设备的传送数据大部分采用中断方式来实现,在主机系统主板上较高地址的ROM中,驻留着基本输入/输出系统(basic input / output system BIOS)的程序,它提供了系统加电自检、引导并装入操作系统、主要的I/O设备的处理程序等功能。用户可在不必了解中断服务程序的内部结构的基础上来使用中断服务程序。DOS是磁盘操作系统,是由BIOS在开机后自动装入内存的,DOS中断是建立在BIOS之上的中断,它借用了BIOS软中断的功能来调用系统的中断服务程序。,键盘I/O程序设计,1.基础知识 键盘是计算机最基本的输入设备,键盘上的键主要分成三种基本类型键:字符键、功能键、组合控制键。 (1)字符码与扫描码 键盘上的每一个键都有一个按位置进行的编码:扫描码,用户每按下一个键,都会产生一个键盘中断,BIOS中的键盘中断处理程序根据读到的扫描码就能唯一确定按下了哪个键。如果按下的是字符键,键盘处理程序求出对应的ASCII码,把扫描码和ASCII码一起存入一个BIOS定义的键盘缓冲区中;如果按下的不是字符键,就把扫描码和一个全0字节一起存入键盘缓冲区。,(2)键盘缓冲区 由于所按键并不会马上被用户读取,所以在BIOS的参数区中,定义了一个键盘输入缓冲区,它的位置在内存0040:001AH处,结构如下: 0040:001A BUFF_HEAD DW ? ;首指针 0040:001C BUFF_TAIL DW ? ;尾指针 0040:001 KB_BUFFER DW 16 DUP (?) ;16个字的缓冲区 0040:001 KB_BUFFER_END LABEL WORD;尾地址,2.BIOS键盘功能调用 BIOS提供的键盘中断类型号为16H,它的中断处理程序又分为3个功能,通过AH中的功能号来选择。 (1) 0号功能从键盘读入字符 输入参数:AH=0 返回结果:AH=键入字符的扫描码 AL=键入字符的ASCII码(如按下的是字符键) 或AL=0(如按下的是其它键) 0号功能读键盘是强制读。,例:从键盘读一字符,把扫描码存到KEY1单元,ASCII码存到KEY2单元。 MOV AH,0 INT 16H MOV KEY1,AH MOV KEY2,AL,(2)1号功能读键盘缓冲区的字符 输入参数:AH=1 返回结果:ZF=0时,AH=扫描码,AL=字符的ASCII码或0 ZF=1时表示无键按下,键盘缓冲区为空,1号功能读键盘是探测读。 例如:在一程序中,加入一段指令序列,检测是否按下了ESC键,如果按下,则退出程序,否则,继续执行程序。加入的指令序列如下: MOV AH,1 ;1号功能 INT 16H ;BIOS的读键盘缓冲区的字符 JZ CONT ;ZF=1,无键按下继续执行程序 CMP AH,01H ;ZF=0,有键按下,判是ESC键的扫描码? JZ EXIT ;是ESC键的扫描码退出程序 CONT: ;继续执行程序 EXIT: ;退出程序,(3)2号功能读键盘状态字节 输入参数:AH=2 返回结果:AL=键盘状态字节 键盘上有一些控制键和状态键,如Shift、Ctrl、Alt、NumLock、Scroll、Ins和CapsLock等,当按下这些键时,键盘处理程序并不返回扫描码,而是设置键盘状态字节的相应位。键盘状态字节如下图所示:,【例1】编写程序,当无键按下时,循环等待,当有键按下时,从键盘读10个按键,并将其扫描码和字符码保存到内存单元中。 (1)分析 1)利用INT 16H的1号功能为探测读键盘,当无键按下时循环等待,当有键按下时读键。 2)利用INT 16H的0号功能读取10个键的扫描码和字符码并保存到内存单元中。,DATA SEGMENT STRING DB 20 DUP (?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA MAIN PROC FAR MOV AX,DATA ;初始化DS MOV DS,AX L1: MOV AH,1 ;利用INT 16H的功能1探测读键盘 INT 16H JZ L1 ;无键按下则循环 LEA SI,STRING MOV CX,10,L2: MOV AH,0 ;用INT 16H的功能0读键盘 INT 16H MOV SI,AL ;保存字符码 MOV SI+1,AH ;保存扫描码 ADD SI,2 LOOP L2 ;循环10次 MOV AX,4C00H INT 21H MAIN ENDP CODE ENDS END MAIN,3.DOS键盘功能调用 上面介绍了BIOS键盘功能调用(16H),而在实际应用中,对于一般的键盘操作,最好使用对硬件依赖更少、更为方便的DOS键盘功能调用。下表中列出了DOS功能调用INT 21H中与键盘输入有关的功能调用。,【例2】 编写一程序,从键盘输入一字符,若为“Y”,则从键盘接收一个字符串;若为“N”,则结束程序;若都不是则循环读键盘。 (1)分析: 1)调用INT 21H的1号功能从键盘读入一个字符。 2)若键入的字符为Y,则调用INT 21H的0AH号功能从键盘输入一个字符串。 (2)程序流程图如下:,DATA SEGMENT STRING DB 20,?,20 DUP (?) ;定义存放字符串的缓冲区 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA MAIN PROC FAR START: MOV AX,DATA MOV DS,AX LOP1: MOV AH,1 ;从键盘读入一个字符 INT 21H CMP AL,Y ;若为“Y”,转输入字符串程序段 JZ IN_STRING CMP AL,N ;若为“N”,结束程序 JZ EXIT JMP LOP1 ;若都不是,循环读键盘字符 IN_STRING: LEA DX,STRING ;从键盘输入一字符串 MOV AH,0AH INT 21H EXIT: MOV AX,4C00H INT 21H MAIN ENDP CODE ENDS END START,显示器I/O程序设计,显示器通过显示适配器(显示卡)与PC机相连,显示卡是计算机和显示器的接口,现在常用的显示卡都支持字符显示和图形显示两种方式,每种显示方式还有多种显示模式。 字符方式也称为文本方式,在这种显示方式下,屏幕上只能显示字符及其属性。字符通常是指字母、数字、符号和一些简单的图形(如菱形、笑脸符等)。在字符方式下,屏幕被划分为若干行和列,较典型的是80列25行。显示字符有两种方法,一种是用BIOS和DOS功能调用,另一种是直接组织显示缓冲区。,显示的基础知识,(1)显示模式 在字符方式下包括几种显示模式,每种模式具有不同的分辨率和颜色,如下表所示。其中用得最普遍的是显示模式3,在这种模式下,显示器的屏幕被划分成80列(0-79)25行(0-24),可以用列号和行号组成的坐标来表示屏幕上的每个可显示位置,如左上角的坐标为(0,0),右下角的坐标为(79,24)。,BIOS显示功能调用,BIOS中提供的显示调用INT 10H功能如下: AH=0:设置显示模式 输入参数:AL=显示模式号(表8-10 常见的字符显示模式) 返回结果:无返回参数,只是屏幕设置为指定的模式 AH=1:设置光标类型 输入参数:(CH)4=0,光标显示,(CH)0-3=光标起始线 (CL)0-3=光标结束线,(CH)4=1,光标不显示(关闭) 返回结果:无,AH=2:设置光标位置 输入参数:BH=页号(一般为0) DH=新光标的行号 DL=新光标的列号 返回结果:无 AH=3:读光标位置 输入参数:BH=页号(要显示的当前页号) 返回结果:CH=光标开始线,CL=光标结束线 DH=光标当前行号,DL=光标当前列号,AH=5:选择当前显示页 输入参数:AL=选择的页号 返回结果:无 AH=6:屏幕初始化或向上滚动 输入参数:AL=要滚动的行数,AL=0,全屏滚动(清屏) CH=滚动窗口左上角行号, CL=滚动窗口左上角列号 DH=滚动窗口右下角行号, DL=滚动窗口右下角列号 BH=滚入行属性 返回结果:无,AH=7:屏幕初始化或向下滚动 输入参数:AL=要滚动的行数,AL=0,全屏滚动(清屏) CH=滚动窗口左上角行号,CL=滚动窗口左上角列号 DH=滚动窗口右下角行号,DL=滚动窗口右下角列号 BH=滚入行属性 返回结果:无 AH=8:读光标位置的属性和字符 输入参数:BH=显示页 返回结果:AH=光标位置的属性 AL=光标位置的字符,AH=9:在光标位置显示字符及属性 输入参数:BH=显示页 BL=字符的属性 AL=待显示字符的ASCII码 CX=字符重复次数(只显示一个字符时,CX=1) 返回结果:无 AH=0AH:在光标位置只显示字符,不改变属性 输入参数:BH=显示页 AL=待显示的字符 CX=字符重复次数(只显示一个字符时,CX=1) 返回结果:无,AH=0EH:显示字符且光标自动前移 输入参数:AL=要显示的字符 BL=前景色 返回结果:无 AH=0FH:获取当前的显示模式 输入参数:无 返回结果:AL=当前显示模式号 AH=当前显示模式每行的列数 BH=当前显示页号,AH=13H:显示字符串 输入参数:ES:BP=字符串首地址 CX=串长度 DH,DL=起始行、列号 BH=显示页号 AL=0,BL=属性,光标保持在原处,串由字符组成,仅显示字符 AL=1,BL=属性,光标到串尾,串由字符组成,仅显示字符 AL=2,光标保持在原位不动,串由字符及属性组成 AL=3,光标到串尾,串由字符及彩色字符属性和背景属性(两个属性由一个字节决定)组成 返回结果:无,【例3】在屏幕中间建立一个34列11行反相显示的小窗口,在窗口最上面一行以青底淡红字显示一个菜单栏:File Edit Search View Options Help,在屏幕最下面一行再显示该菜单栏,但每一项属性不同。,(1)分析 1)在屏幕中间建立一个34列11行反相显示的小窗口,应调用INT 10H的6号功能,定义左上角坐标为(7,23),右小角坐标为(17,56),即屏幕中间大小为34列11行的小窗口,把小窗口清为白底黑字的属性即为反相显示,指令序列如下: MOV AH,6 ;调用INT 10H的6号功能 MOV AL,0 ;AL=0,全屏滚动(清屏) MOV CH,7 ;CH=滚动窗口左上角行号7 MOV CL,23 ;CL=滚动窗口左上角列号23 MOV DH,17 ;DH=滚动窗口右下角行号17 MOV DL,56 ;DL=滚动窗口右下角列号56 MOV BH,70H ;白底黑字,反向显示 INT 10H,2)在窗口最上面一行显示一个菜单栏,应调用INT 10H的功能13H MOV AH,13H ;INT 10H的功能13H,在窗口最上面一行显示菜单栏 LEA BP,STRING1 ;BP字符串SRING1的首地址 MOV CX,ST1_LEN ;CX=串长度ST1_LEN MOV DH,7 ;DH=起始行号7 MOV DL,23 ;DL=起始列号23 MOV BH,0 ;BH=显示页号,一般为0 MOV AL,1 ;光标到串尾,串由字符组成,仅显示字符 MOV BL,3CH ;字符属性为青底淡红色 INT 10H,DATA SEGMENT STRING1 DB File Edit Search View Options Help ;窗口上面待显示的字符串 ST1_LEN EQU $-STRING1 ;显示串1的长度 STRING2 DB F,1ch,i, 1ch, l, 1ch, e,1ch, 20h, 1ch ;窗口下面待显示的字符串 DB E, 4ah, d, 4ah, i, 4ah, t, 4ah, 20h, 4ah DB S, 2dh, e, 2dh, a, 2dh, r, 2dh, c, 2dh, h, 2dh, 20h, 2dh DB V, 5ah, i, 5ah, e, 5ah, w, 5ah, 20h, 5ah DB O, 3eh, p, 3eh, t, 3eh, i, 3eh, o, 3eh, n, 3eh, s, 3eh, 20h, 3eh DB H, 6bh, e, 6bh, l, 6bh, p, 6bh ST2_LEN EQU ($-STRING2)/2 ;显示串2的长度 DATA ENDS,CODE SEGMENT ASSUME CS:CODE,DS:DATA MAIN PROC FAR MOV AX,DATA ;设置DS=ES MOV DS,AX MOV ES,AX MOV AH, 0 ;设置显示模式3 MOV AL,3 INT 10H,MOV AH,6 ;清屏 MOV AL,0 MOV CH,0 ;屏幕左上角坐标 MOV CL,0 MOV DH,24 ;屏幕右下角坐标 MOV DL,79 MOV BH,07 ;属性 INT 10H MOV AH,1 ;暂停,等待键盘输入单个字符 INT 21H MOV AH,6 ;建立小窗口 MOV AL,0 ;全屏滚动 MOV CH,7 ;左上角坐标 MOV CL,23 MOV DH,17 ;右下角坐标 MOV DL,56,MOV BH,70H ;白底黑字,反向显示 INT 10H MOV AH,13H ;在窗口最上面一行显示菜单栏 LEA BP,STRING1 ;ES:BP字符串首地址 MOV CX,ST1_LEN ;CX=串长度 MOV DH,7 ;DH,DL=起始行,列位置 MOV DL,23 MOV BH,0 MOV AL,1 MOV BL,3CH ;属性为青底淡红色 INT 10H MOV AH,1 ;暂停 INT 21H ;在窗口最下面一行以多种属性显示菜单栏,MOV AH,13H ;INT 10H的功能13H LEA BP,STRING2 ;串首地址 MOV CX,ST2_LEN ;显示串的长度 MOV DH,17 ;起始位置行号 MOV DL,23 ;起始位置列号 MOV BH,0 MOV AL,3 ;光标到串尾,串由字符及属性组成 INT 10H MOV AH,4CH ;返回DOS INT 21H MAIN ENDP CODE ENDS END MAIN,(4)程序说明: INT 10H的13H号功能有四种显示字符串的方式,前两种方式(AL=0,1),整个字符串只能以一种属性显示,后两种方式(AL=2,3)每个字符都可以不同属性显示。本程序中,显示窗口上面的菜单栏用AL=1的方式,显示字符的属性相同;显示窗口下面的菜单栏用AL=3的方式,每个字符以不同的属性显示。 (5)执行结果如下图:,3.DOS显示功能调用 DOS的INT 21H提供的显示功能调用如下: AH=2,显示一个字符,光标跟随字符移动,检测Ctrl_Break 输入参数:DL=待显示字符的ASCII码 返回结果:无 AH=6,显示一个字符,光标跟随字符移动,不检测Ctrl_Break 输入参数:DL=待显示字符的ASCII码 返回结果:无 AH=9,显示字符串,光标跟随字符串移动 输入参数:DS:DX=待显示字符串的首地址,字符串必须以$结尾。 返回结果:无,用INT 21H的9号功能显示一个字符串,首先要在数据段中定义一个待显示的字符串,这个字符串必须以$结尾。例如,定义一个字符串如下: STRING DB HOW ARE YOU,0DH,0AH,$ 然后,在代码段中,显示该字符串的指令为: LEA DX,STRING MOV AH,9 INT 21H,【例4】用DOS时间功能调用获取当前时间,并在屏幕上显示出来。 (1)分析 1)本程序首先调用DOS时间功能调用(INT 21H的2CH功能),读取系统当前时间: MOV AH,2CH INT 21H 执行后的返回结果:CH=小时(0-23) CL=分钟(0-59) DH= 秒(0-59) 2)然后按照一定的格式显示出来,其中需要多次把返回的二进制数结果转换成十进制并显示出来,所以用子程序来实现这一功能。,(2)编写程序如下: DATA SEGMENT TIME DB CURRETN TIME IS $ ;定义一个提示串 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA MAIN PROC FAR,LEA DX,TIME ;显示提示串 MOV AH,9 INT 21H MOV AH,2CH ;获取当前时间 INT 21H MOV AL,CH ;显示小时数 CALL P1 MOV DL,3AH ;显示一分隔符“:” MOV AH,2 INT 21H MOV AL,CL ;显示分钟数 CALL P1 MOV DL,3AH ;显示分隔符“:” MOV AL,2 INT 21H MOV AL,DH ;显示秒数 CALL P1 MOV AX,4C00H ;返回DOS INT 21H MAIN ENDP,;把寄存器中的内容转换成十进制显示出来 P1 PROC ;入口参数: AL为待显示的寄存器 PUSH BX ; PUSH DX XOR AH,AH ;(1)做除法 MOV BL,10 ;把二进制转换成十进制 DIV BL MOV BL,AH ;保存余数 MOV DL,AL OR DL,30H ;把十位数转换成ASCII码 MOV AH,2 ;显示十位数 INT 21H MOV DL,BL OR DL,30H ;把个位数转换成ASCII码 MOV AH,2 ;显示个位数 INT 21H POP DX POP BX RET P1 ENDP CODE ENDS END START,(3)程序说明: 1)因为当前时间的小时数、分钟数和秒数都不会超过两位十进制数,所以这里把二进制数转换成十进制时,只需做一次除法(除以10)即可,所得商和余数分别为十进制的十位数和个位数。,【例5】用BIOS时间功能调用获取当前日期,并在屏幕上显示出来。 (1)分析: 本程序与上例类似,调用BIOS时间功能调用(INT 1AH的功能4)获取当前日期并显示。不同之处在于,INT 1AH的功能4的返回结果是用压缩BCD码的形式表示的,因此转换成十进制并显示的程序段不同。 1)首先调用BIOS时间功能调用(INT 1AH的功能4)获取当前日期: MOV AH,04H INT 1AH 执行后的返回结果:CF=1表示失败 CF=0表示成功 CX=年(1980-2099) DH=月(1-12) DL=日(1-31) 2)INT 1AH的功能4的返回结果是用压缩BCD码的形式表示的,因此转换成十进制并显示的程序段不同。,2)编写程序如下: DATA SEGMENT DATE DB CURRETN DATE IS $ ;定义一个提示串 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA MAIN PROC FAR START: MOV AX,DATA ;初始化DS MOV DS,AX,LEA DX,DATE ;显示提示串 MOV AH,9 INT 21H MOV AH,04H ;获取当前日期 INT 1AH JC EXIT ;若失败,则转EXIT PUSH DX ;保存月、日 ;显示年份 MOV BX,CX ;BX=年份 MOV CX,4 ;年份4位,需循环4次 L1: PUSH CX ;(1)保存循环次数 MOV CL,4 ;循环左移取出BCD码 ROL BX,CL MOV DL,BL ;把BL内容取到DL中 AND DL,0FH ;屏蔽高四位 OR DL,30H ;转换成ASCII码 MOV AH,2 ;显示一位 INT 21H,POP CX ;恢复循环次数 LOOP L1 MOV DL,2DH ;显示一分隔符“” MOV AH,2 INT 21H ;显示月及日 POP BX ;BX=月,日 MOV CX,4 ;循环四次 L2:PUSH CX ;保存循环次数 MOV CL,4 ROL BX,CL ;采用ROL方式取出BCD码 MOV DL,BL ;取到DL中 AND DL,0FH ;清除高四位 OR DL,30H ;转换成ASCII码 MOV AH,2 ;显示在屏幕上 INT 21H,POP CX CMP CX,3 ;(2)CX=3,显示分隔符“” JNZ L3 MOV DL,2DH ;显示分隔符“” MOV AH,2 INT 21H L3: LOOP L2 ;循环4次 EXIT:MOV AX,4C00H INT 21H MAIN ENDP CODE ENDS END START,图形系统程序设计,1.显示模式 在图形方式下,显示屏幕上由像素点组成,屏幕按分辨率划分成像素行和列。可以通过读写屏幕上的各个点的像素,显示出各种单色和彩色的图形。在各种不同的显示模式下,屏幕显示的像素分辨率、颜色数以及显示存储器的组织方式都不同,与图形有关的显示模式及其适用的显示卡如下表所示。,用BIOS功能调用编写显示程序,INT 10H提供了两个图形方式下读写像素的功能: AH=0CH,写像素 输入参数:DX=像素行 CX=像素列 BX=显示页号 AL=像素颜色值 返回结果:无 AH=0DH,读像素 输入参数:DX=像素行 CX=像素列 返回结果:AL=像素颜色值,【例6】:编程实现,在屏幕上显示一个直角三角形,三边分别为红、黄、绿三种颜色。 (1)分析: 1)显示系统中默认的显示方式为文本方式,首先要读取当前的显示模式并保存,显示图形后再恢复原来的显示模式。 2)调用INT 10H的读写像素功能,分别画出三角形的三边。,CODE SEGMENT ASSUME CS:CODE MAIN PROC FAR MOV AX,0600H ;利用INT 10H的功能6清屏 MOV BH,7 ;黑底白字 MOV CX,0 ;窗口左上角坐标(0,0) MOV DX,184FH ;窗口右下角坐标(24,79) INT 10H MOV AH,0FH ;读取当前的显示模式 INT 10H PUSH AX ;压入堆栈保存 MOV AH,0 ;设置当前的显示模式为12H MOV AL,12H INT 10H,;(1)从坐标(200,200)处开始画一水平线 MOV CX,200 ;开始列 MOV DX,200 ;开始行 LOP1:MOV AH,0CH ;写像素功能 MOV AL,0AH ;浅绿色 MOV BH,0 INT 10H ;写像素 INC CX ;列坐标加1,准备画下一点 CMP CX,300 ;判断水平线是否结束 JNZ LOP1 ;未结束则循环,;(2)从坐标(200,200)处开始画一垂直线 MOV CX,200 ;开始列 MOV DX,200 ;开始行 LOP2:MOV AH,0CH ;写像素功能 MOV AL,0CH ;淡红色 MOV BH,0 INT 10H DEC DX ;行坐标减1,准备画下一点 CMP DX,100 ;判断垂直线是否结束 JNZ LOP2 ;未结束则循环 ;(3)从坐标(200,100)处开始画一斜线 MOV CX,200 ;开始列 MOV DX,100 ;开始行,LOP3:MOV AH,0CH ;写像素功能 MOV AL,0EH ;黄色 MOV BH,0 INT 10H INC CX ;行、列坐标同时加1,画斜线 INC DX CMP DX,200 ;判断斜线是否结束 JNZ LOP3 MOV AH,1 ;暂停 INT 21H POP AX ;恢复原来的显示模式 MOV AH,0 INT 10H,EXIT: MOV AX,4C00H INT 21H MAIN ENDP CODE ENDS END MAIN (4)程序说明: 1)从坐标(200,200)处开始向右画三角形的水平线段,每写一个象素,列坐标加1,加到列坐标为300则停止。 2)从坐标(200,200)处开始向上画三角形的垂直线段,每写一个象素,行坐标减1,减到行坐标为100则停止。 3)从坐标(200,100)处开始画三角形的斜直线段,每写一个象素,行列坐标同时加1,加到列坐标为(300,200)则停止。,直接组织显示缓冲区 (1)VGA的显示缓冲区 VGA显示卡的显示缓冲区容量为256KB,它除了兼容CGA、EGA的显示模式外,还提供了一种VGA独有的显示模式12H。这里主要以VGA的显示模式12H为例。 VGA的显示模式12H,分辨率为640480,可显示16种颜色,把256KB的显存分成4个64KB的显示页面。每个像素由4位来表示,每个页面一位,4个页面上的相应位确定屏幕上一个像素点的颜色,4个页面中的每个字节表示相邻的8个水平像素。所以,每个像素有16种颜色,要在屏幕上画出一个像素点,必须将一个像素的颜色写入显示缓冲区的4个页面。 若屏幕上像素的位置由坐标(x,y)来表示,像素位置转换为显示缓冲区中位置的计算公式为: 字节地址=A0000H + y80 + x/8,图形控制器 在图形方式下,直接编写驱动VGA内部寄存器和显示缓冲区来处理图形程序,是相当复杂的,我们这里只介绍部分硬件结构和编程方法。在VGA的图形方式下,CPU和显示缓冲区之间不是直接传送数据的,而是在图形控制器的控制和处理下,经过锁存器来传送的,每个页面对应一个8位的锁存器。 图形控制器内部有10个寄存器,系统只分配了两个端口地址:3CEH和3CFH。其中3CEH为索引寄存器,3CFH中实际上有9个寄存器,共用一个端口地址。访问3CFH中的9个寄存器的方法是:首先把要访问的寄存器的编号(即索引值)写入索引寄存器3CEH中,选择其中的一个寄存器为当前活动寄存器,然后访问3CFH就是访问指定的寄存器。,3)VGA的读写模式 VGA显示卡提供两种读模式:读模式0和读模式1,其中读模式0是默认的模式。读模式0可以读取某个页面的字节,选择哪一个页面的字节读入CPU,取决于读映像选择寄存器。当希望读取多个页面的内容时,使用读模式1为更方便。 VGA提供了4种写模式,其中写模式0为直接处理器写,这是最常用的方式,也是图形控制器的缺省模式。在写模式0中,所写入的CPU数据可以更新一个或是全部的页面,同时,还可以与一个事先定义好的值进行逻辑运算,以更新锁存器中的8个像素或其中任一个像素。在这些操作中,要用到置位/复位寄存器、数据循环/功能选择寄存器和位屏蔽寄存器。 (4)图形编程举例,【例7】用直接组织显示缓冲区的方法编程实现,在屏幕上显示一个直角三角形,三边分别为红、黄、绿三种颜色。 (1)分析 本程序的主要步骤与上例相同,区别只是具体写每个象素的方法不同,上例通过调用BIOS显示例程INT 10H来读写像素,本例通过对硬件编程来直接组织显示缓冲区。另外,为使程序简洁,计算像素的字节地址和位掩码以及写像素功能分别由子程序来实现。,CODE SEGMENT ASSUME CS:CODE MAIN PROC FAR MOV AX,0600H ;清屏 MOV BH,7 MOV CX,0 MOV DX,184FH INT 10H ;读取当前的显示模式并保存 MOV AH,0FH INT 10H PUSH AX ;设置显示模式为12H,MOV AH,0 MOV AL,12H INT 10H ;从(200,200)处开始画水平线 MOV CX,200 MOV DX,200 LOP1:CALL GET_ADDR ;1)计算像素的字节地址和位掩码 PUSH CX ;保存CX中的坐标值 MOV CL,AH MOV CH,0AH ;浅绿色 CALL WRITE0 ;(2)写像素 POP CX ;恢复CX中的坐标值,INC CX ;修改坐标 CMP CX,300 ;判断是否画完 JNZ LOP1 ;从(200,200)开始画垂直线 MOV CX,200 MOV DX,200 LOP2: CALL GET_ADDR ;计算像素的字节地址和位掩码 PUSH CX MOV CL,AH MOV CH,0CH ;淡红色 CALL WRITE0 ;写像素 POP CX DEC DX CMP DX,100 ;判断是否画完 JNZ LOP2 ;从(200,100)处开始画斜线 MOV CX,200 MOV DX,100,LOP3: CALL GET_ADDR ;计算像素的字节地址和位掩码 PUSH CX MOV CL,AH MOV CH,0EH ;黄色 CALL WRITE0 ;写像素 POP CX INC CX INC DX CMP DX,200 JNZ LOP3 MOV AH,1 ;暂停 INT 21H POP AX ;恢复原来的显示模式 MOV AH,0 INT 10H EXIT:MOV AX,4C00H ;返回DOS INT 21H MAIN ENDP,;计算像素的字节地址和位掩码子程序 GET_ADDR PROC NEAR ;入口:CX=X坐标,DX=Y坐标 PUSH CX ;出口:BX=字节地址,AH=位掩码 PUSH DX MOV AX,0A000H ;设置段地址 MOV ES,AX MOV AX,80 ;AX=Y*80 MUL DX MOV BX,AX ;BX=Y*80 MOV AX,CX ;计算X/8 MOV CL,8 DIV CL MOV CL,AH ;余数保存在CL中 MOV AH,0 ADD BX,AX ;BX=Y*80+X/8 MOV AH,80H SHR AH,CL ;AH=位掩码 POP DX POP CX RET GET_ADDR ENDP,;写像素子程序。 ;入口参数:BX=字节地址,CH=象素颜色值,CL=位掩码。 WRITE0 PROC NEAR ;出口参数:完成写一新象素 PUSH ES ;保护现场 PUSH AX PUSH BX PUSH DX PUSH CX ;(2)写像素颜色值到置位/复位寄存器 MOV DX,3CEH ;索引寄存器地址 MOV AL,0 ;置位/复位寄存器索引值 MOV AH,CH ;像素颜色值 OUT DX,AX ;写入寄存器 ;设置置位/复位允许寄存器为允许4个页面 MOV AL,1 ;置位/复位允许寄存器索引值 MOV AH,0FH ;允许4个页面 OUT DX,AX ;写入寄存器,;写位屏蔽码到位屏蔽寄存器 MOV AL,8 ;位屏蔽寄存器索引值 MOV AH,CL ;位屏蔽码 OUT DX,AX ;写入 MOV AL,ES:BX ;(3)读四个页面到锁存器 MOV ES:BX,AL ;写入新像素 MOV AL,1 ;置位/复位允许寄存器 MOV AH,0 ;禁止4个页面 OUT DX,AX,MOV AL,8 ;设屏蔽寄存器 MOV AH,0FFH ;允许8位写入 OUT DX,AX POP CX ;恢复现场 POP DX POP BX POP AX POP ES RET WRITE0 ENDP CODE ENDS END MAIN,发声系统程序设计,1.扬声器的驱动系统 计算机上的扬声器是由可编程定时/计数器8253(8254)和并行接口芯片8255共同控制发声的,发声系统的结构如下图所示。 在下图的扬声器驱动系统中,8255PB口第1位的输出与8253/54计数器2的输出,这两个信号经过一个与门后,如果能输出一个连续的方波脉冲信号,经驱动器驱动后就可以使扬声器发声,控制方波的频率和持续时间就可以发出不同音高和音长的声音。因为与门有两个输入信号,只要使其中一个信号输出方波,另一个的输出保持为1状态,就可以使扬声器发声,因此,发声程序有两种设计方法,在前面的8.1.3中介绍过直接控制8255的PB1输出,使扬声器发声的方法,这里介绍另一种方法。,对8253/54编程来使扬声器发声,另一种驱动扬声器发声的方式是使PB1为1,打开与门,由8253/54的计数器2输出方波。在编写发声程序时,首先要初始化8253/54(包括写控制字和计数初值),要计数器2输出方波,需工作在方式3,此时控制字为0B6H。8253/54初始化后,使PB0和PB1为1,打开计数器2的门控信号端GATE2,计数器2开始工作,输出方波,同时与门也打开,方波信号驱动扬声器发声,延时一段时间后,关闭扬声器。,【例8】:编写利用8253/54驱动发声的通用发声子程序GENSOUND。 入口参数:CX=发声的频率值,BX=持续的时间(ms) (1)分析: 首先要初始化8253/54,即写入控制字和计数除值,然后打开与门和8253/54的门控信号GATE2,开始发声,延时一段时间后,关闭与门和门控信号,停止发声。,GENSOUND PROC NEAR PUSH DX MOV AL,0B6H ;写8253/54控制字 OUT 43H,AL MOV DX,12H ;计算计数初值,结果在AX中 MOV AX,3208H DIV CX OUT 42H,AL ;送计数初值低字节 MOV AL,AH OUT 42H,AL ;送计数初值高字节 IN AL,61H ;读入61H端口原值 MOV AH,AL ;保存在AH中 OR AL,3 ;将第0、1位置1后送回61H端口 OUT 61H,AL,L2: MOV CX,0AB5EH ;延时(BX)1ms L3:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年ACCA国际注册会计师考试真题卷:企业风险管理试题(含答案)
- 2025小升初语文测试题及答案
- (2025)中小学生心理健康知识竞赛题库及参考答案
- 2025护师考试基础护理学练习题及答案
- (2025)学法用法考试题及答案
- 物联网技术试题及答案
- 技术文员考试试题及答案
- 2025年压力管道巡检维护证考试题库
- 2025电气设备购销合同范本
- 2025计算机硬件购销合同
- 《向长庚医院学管理》读后感
- 《建筑防水工程技术规程》
- DB11-T 1754-2024 老年人能力综合评估规范
- 《献给阿尔吉侬的花束》读书分享
- 电力项目全过程咨询服务方案
- T-CASME 1610-2024 淤泥土固化加固与处置技术规程
- 商用汽车金融方案
- 医药行业生产成本管控方案
- 上海市崇明区九校2024-2025学年六年级(五四制)上学期期中英语试题
- 预拌混凝土试验室作业指导书(完整版)
- 2024年10月自考00312政治学概论试题及答案含评分参考
评论
0/150
提交评论