基本输入输出系统BIOS---键盘输入
基本输入输出系统BIOS概述
硬盘操作系统DOS建立在BIOS的基础上,通过BIOS操纵硬件,例如DOS调用BIOS显示I/O程序完成输入显示,调用打印I/O完成打印输出
通常应用程序应该调用DOS提供的系统功能完成输入输出或者其他操作,这样做不仅容易实现,而且对硬件依赖性最少,但是有时候DOS不提供某种服务,因此就不能利用DOS实现
也就是说,BIOS比DOS更加接近于硬件
键盘输入:
键盘中断处理程序
当用户按键时,键盘接口上会得到一个代表被按键的键盘的扫描码,同时产生一个中断请求,如果中断请求时允许的(中断屏蔽字的位1为0 )并且CPU处于开中断状态,那么CPU通常就会相应中断请求,由于键盘中断类型安排为9,所以CPU响应键盘中断,就是转入9号中断处理程序,我们把9号中断处理程序称为键盘中断处理程序
键盘中断处理程序首先从键盘接口取得代表按键的扫描码,然后根据扫描码判定用户所按下的键盘并作出相应的处理 最后通知中断控制器中断结束并实现中断返回
我们把键盘上简单地分成5种类型,字符键盘(字母,数字还有符号)功能键(如F1和pgup)控制键(CTRL,ALT和左右SHIFT)双态键盘(NUMlock,Caps lock)特殊请求键盘(print Screen)键盘中断处理程序对五种键盘的处理方法如下
如果用户按下的是双态键盘,那么就设置标志位,在AT以后上档次的系统要求改变LED指示器的状态
如果用户按下的是控制键,那么就设置有关标志位
如果用户按下的是功能键,那么就根据键盘扫描吗和时候按下某些控制键如(ALT)确定系统扫描码把系统扫描码存入缓冲区,
如果用户按下的是字符,那么就根据扫描码和ASCII一起存入键盘的缓冲区
如果用户按下的是特殊请求键,那么就调用对应的中断进行处理
缓冲区
键盘缓冲区是一个 先进先出的环形队列,队列占用的内存区域如下
buff_hade dw ?
buff_tail dw ?
kb_buffer dw 16 dup(?)
buff_hade和BUff_tail是缓冲区的头指针和尾指针,这两个指针相等表示缓冲区为空,由于缓冲区本身长度为16个字,而存放一个键盘的扫描码和ASCII需要占用一个字,所以键盘缓冲区实际可以存放15个键的扫描码和ASCII,键盘的中断程序吧所按下的字符键或功能键的扫描码和ASCII依次存入缓冲区,如果缓冲区已经满了,那么发出嘟的一声
键盘的I/O 程序
键盘的I/O程序以16H号中断处理程序的形式出现,它属于软中断处理程序这一类,他的主要功能是进行键盘输入,在一般情况下面,系统程序和应用程序的键盘输入都是有他完成的,简单地键盘I/O程序从键盘缓冲区中取出所按下的ASCII码和扫描码返回给调用者
键盘I/O的调用方法,调用键盘I/O功能,吧功能编号置入AH寄存器,然后发出中断指令INT 16H
主要功能标号
AH = 0,从键盘中读走一个字符,AL = ASCII,AH = 字符扫描码
AH = 1,判断有无按键可读,ZF = 1,表示无按键可读,ZF = 0,表示有按键可读
AH = 2,表示变换按键当前状态
从键盘中读取一个字符
MOV AH ,
INT 16H
例题1:程序功能,;程序功能:写一个程序完成如下功能,读取键盘,并把所按的键显示出来,在检测到按下SHIFT的时候,就结束运行
;程序功能:写一个程序完成如下功能,读取键盘,并把所按的键显示出来,在检测到按下SHIFT的时候,就结束运行
;
L_SHIFT = 00000010B
R_SHIFT = 00000001B
CSEG SEGMENT
ASSUME CS:CSEG
START:MOV AH, ;取变换键状态字节
INT 16H
TEST AL,L_SHIFT+R_SHIFT ;判断是否按下SHIFT
JNZ OVER;
MOV AH,;判断是否有按键按下
INT 16H;
JZ START;
MOV AH,;有的话读取按键
INT 16H;
MOV DL,AL;显示所读按键
MOV AH,;
INT 21H;
JMP START;
OVER:MOV AH,1H
INT 21H
MOV AH,4CH
INT 21H
CSEG ENDS
END START
首先,取变换键状态字节,进行判断是否按下了SHIFT,
MOV AH,2取变换键状态字节
INT
TEST AL,L_SHIFT+R_SHIFT JNZ OVER
在调用0号功能之前,检测是否有按键可读
MOV AH,1;判断时候有按键按下
INT 16H
JZ START
如果有按键按下,读取键盘
MOV AH,0
INT 16H
显示所读按键,调用显示功能
MOV DL,AL
MOV AH,
INT 21H
JMP START
版权所有,转载请注明链接地址:http://www.cnblogs.com/fengdashen/p/3720733.html
基本输入输出系统BIOS---键盘输入的更多相关文章
- 系统软键盘">Android在外接物理键盘时,如何强制调用系统软键盘?
第一次写,写的不好请见谅 物理键盘映射过程: 手机/system/usr/keylayout/*.kl :内核将keyCode映射成有含义的字符串KeycodeLabels.h : framework ...
- BIOS(Basic Input/Output System)是基本输入输出系统的简称
BIOS(Basic Input/Output System)是基本输入输出系统的简称 介绍 操作系统老师说,平时面试学生或者毕业答辩的时候他都会问这个问题,可见这个问题对于计算机专业的学生来说是如此 ...
- [汇编学习笔记][第十七章使用BIOS进行键盘输入和磁盘读写
第十七章 使用BIOS进行键盘输入和磁盘读写 17.1 int 9 中断例程对键盘输入的处理 17.2 int 16 读取键盘缓存区 mov ah,0 int 16h 结果:(ah)=扫描码,(al) ...
- 使用BIOS进行键盘输入和磁盘读写
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- C语言 投票系统:给定候选人,从键盘输入候选人的名字,统计票数,并输出最终获胜者
投票系统:给定候选人名单,从键盘输入候选人的名字,统计票数,并输出最终获胜者.若投票人输入的名字不在其候选名单上,则该票数无效. //凯鲁嘎吉 - 博客园 http://www.cnblogs.com ...
- 汇编学习笔记(14)BIOS对键盘输入的处理
字符的处理 键盘输入的字符一般由int9中断例程从60h端口中读取,并存放在键盘缓冲区中,由int16h例程从键盘缓冲区中读取相应字符,CPU对键盘输入a.shift_a的处理过程如下 1.一开始没有 ...
- Java -- 键盘输入 Scanner, BufferedReader。 系统相关System,Runtime。随机数 Randrom。日期操作Calendar
1. Scanner 一个基于正则表达式的文本扫描器,他有多个构造函数,可以从文件,输入流和字符串中解析出基本类型值和字符串值. public class Main { public static v ...
- VB模拟键盘输入的N种方法
VB模拟键盘输入的N种方法http://bbs.csdn.net/topics/90509805hd378发表于: 2006-12-24 14:35:39用VB模拟键盘事件的N种方法 键盘是我们使用计 ...
- 使用C#模拟键盘输入、鼠标移动和点击、设置光标位置及控制应用程序的显示
1.模拟键盘输入(SendKeys) 功能:将一个或多个按键消息发送到活动窗口,就如同在键盘上进行输入一样. 语法:SendKeys.Send(string keys);SendKeys.SendWa ...
随机推荐
- 区间dp笔记√
区间DP是一类在区间上进行dp的最优问题,一般是根据问题设出一个表示状态的dp,可以是二维的也可以是三维的,一般情况下为二维. 然后将问题划分成两个子问题,也就是一段区间分成左右两个区间,然后将左右两 ...
- 【nginx运维基础(1)】Nginx的编译安装与使用
nginx的官方手册: http://nginx.org/en/docs/ 编译安装 下载地址: http://nginx.org/en/download.html # 为了支持rewrite功能,我 ...
- Tomcat部署Web应用方法总结
转载:http://m.blog.csdn.net/blog/u012516903/15741727 Tomcat部署Web应用方法总结 在Tomcat中部署Java Web应用程序有两种方式:静态部 ...
- Android:PopupWindow简单弹窗改进版
Android:PopupWindow简单弹窗 继续上一节的内容,改进一下,目标是点击菜单后把菜单收缩回去并且切换内容,我使用的是PopupWindow+RadioGroup public class ...
- C++:对象指针
对象指针概念:每一个对象在初始化后都会在内存中占有一定的空间.因此,既可以通过对象名访问, 也可以通过一个对象地址来访问一个对象.对象指针就是用于存放对象地址的变量. 声明对象指针的一般语法格式为:类 ...
- Java API —— System类
1.System类概述 System 类包含一些有用的类字段和方法.它不能被实例化. 2.成员方法 public static void gc():运行垃圾回收器 ...
- 转:[Android问答] 开发环境问题集锦
工欲善其事,必先利其器. 和iOS开发相比,Android的开发环境的版本比较多,随之而来的问题也多.显然,我们不应该浪费宝贵的时间在解决开发环境带来的问题上,为此本文总结了常见的开发环境问题和解决方 ...
- 02-语言入门-02-ASCII码排序
题目地址: http://acm.nyist.net/JudgeOnline/problem.php?pid=4 描述 输入三个字符(可以重复)后,按各字符的ASCII码从小到大的顺序输出这三个 ...
- HDU 3949 XOR(高斯消元)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3949 题意:给出一个长度为n的数列A.选出A的所有子集(除空集外)进行抑或得到2^n-1个数字,去重排 ...
- oj放苹果
题目描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 输入 每个用例包含二个整数M和N.0<=m< ...