- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
BIOS和DOS中断概论
9.1 键盘 I/O
9.2 显示器 I/O;BIOS和DOS中断; BIOS和DOS中断层次;用户编程原则;BIOS和DOS中断例程的安装过程;中断例程调用方法;例:DOS功能调用:int 21h 中断例程是DOS提供的中断例程,其中包含了DOS提供给程序员在编程时调用的子程序。
;键盘输入一个字符
MOV AH, 01 ;设置功能号:键盘输入
INT 21H ;DOS功能调用
MOV CHAR, AL ;返回参数: (AL)=字符ASCII码
;显示输出一个字符
MOV DL, ’A’ ;调用参数: 待输出字符的ASCII码
MOV AH, 02 ; DOS功能号: 显示输出
INT 21H ; DOS调用 ;与子程序调用的比较; 9.1 键盘I/O;字符码与扫描码;BIOS键盘中断处理程序功能:
◢ 从键盘接口(60H)读取操作键的扫描码;
◢ 将扫描码转换成字符码;
◢ 将键的扫描码、字符码存放在ROM BIOS数据区的键盘缓冲区KB_BUFFER, 供其它有关键盘的中断子程应用。
◢键盘状态字节(KB_FLAG)中的各位表示是否按下变换键Shift,Ctrl,Alt,NumLock,Scroll,Ins和Caps Lock
;640KB RAM
基本内存;类型 9中断例程对键盘输入的处理;键盘输入演示;(1) BIOS键盘中断 ( INT 16H) ;int 16h读键盘缓冲区演示;使用int 16h中断例程读取键盘缓冲区;DOS键盘中断 ( INT 21H);例:检测键盘输入的字符是否为回车键;例: 输入字符串到缓冲区STRING
DATA SEGMENT
MAXLEN DB 32
ACTLEN DB ?
STRING DB 32 DUP(?)
DATA ENDS
CODE SEGMENT
…
LEA DX,MAXLEN
MOV AH,0AH
INT 21H
…
CODE ENDS
END;
① 若(DS:DX)字节单元的值为0,则不等待从键盘输入,结束调用。
② 若(DS:DX) 字节单元的内容大于0,则等待从键盘输入,
并把输入键的ASCII码顺序存放在DS : DX+2开始的单元,
按回车键表示结束输入。
当按下键的个数超过( DS : DX )中值,发出警告声’ 嘟嘟 ’,
不再接收输入的数据, 直到输入回车键。
③ 将实际输入的字符个数(不包括回车键)填入(DS:DX+1),
结束调用。;◢ 输入的字符均带回显,且光标随字符移动。当输入回车符结束时,也回显回车符。表现为功能调用结束后,光标回到了行首。
◢ 回车符0DH作为一个输入的字符存放在字符串尾,但计算输入个数时,不包括回车键。
实际最多能输入的字符数 = 限制的最多数-1
(回车符占一个)
◢ 执行完0AH功能后,DS和DX的值不变, DS:DX仍指向缓冲区的首地址。
◢ 整个缓冲区的大小应为:限制的最多数 +2
max DB 11, ? , 11 dup (?)
缓冲区必须定义为字节类型,不能定义为字类型。;9.2 显示器I/O;文本方式
将屏幕划分为 m列和n行 (m × n),在每个网格位置上显示像素,一个字符是一个像素。在这种显示方式下,显示缓冲存储区中存放的是字符的ASCII码和对应的显示属性,每个字符占用两个字节的空间。;~;文本方式 ASCII字符;显示存储器:
MDA显存的起始地址为B000:0000,CGA、EGA、VGA的是B800:0000。 1屏幕的字符数据称为1页数据。据显存大小,可存储若干页的字符象素。
例: 16KB 显存能存储:(1000B=1KB)
25×80方式,4页( 0 ~ 3 ), 80×25×2×4 =16000
25×40方式,8页( 0 ~ 7 ), 40×25×2×8 =16000
对CGA、EGA、VGA的80列显示方式,0页显存中的起始地址是B800:0000, 1页B800:1000, 2页B800:2000,3页B800:3000。屏幕上某一字符位置在显存中的偏移地址计算公式:
Char_offset=Page_offset+((row*width)+column)
文档评论(0)