博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用BIOS进行键盘输入和磁盘读写01 - 零基础入门学习汇编语言75
阅读量:7107 次
发布时间:2019-06-28

本文共 1751 字,大约阅读时间需要 5 分钟。

第十七章:使用BIOS进行键盘输入和磁盘读写01

 

让编程改变世界

Change the world by program


 

引言

  大多数有用的程序都需要处理用户的输入,键盘输入是最基本的输入。 程序和数据通常需要长期存储,磁盘是最常用的存储设备。 BIOS 为这两种外设的I/O提供了最基本的中断例程,在本章中,我们对它们的应用和相关的问题进行讨论。  

int 9中断例程对键盘输入的处理

  我们已经讲过,键盘输入将引发9 号中断,BIOS 提供了int 9 中断例程。 CPU 在9 号中断发生后,执行int 9中断例程,从60h 端口读出扫描码,并将其转化为相应的ASCII 码或状态信息,存储在内存的指定空间(键盘缓冲区或状态字节)中。   所以,一般的键盘输入,在CPU 执行完int 9 中断例程后,都放到了键盘缓冲区中。 键盘缓冲区中有16 个字单元,可以存储15个按键的扫描码和对应的入ASCII 码。   下面我们按照键盘缓冲区的逻辑结构,来看一下键盘输入的扫描码和对应 ASCII 码是如何写入键盘缓冲区的。  
下面,我们通过下面几个键:
A、B、C、D、E、shift_A、A  
请看动画演示过程! [kml_flashembed publishmethod="static" fversion="8.0.0" movie="http://blog.fishc.com/wp-content/uploads/2012/07/17_int9写键盘缓冲区.swf" width="400" height="300" targetclass="flashmovie" wmode="transparent"] [/kml_flashembed]  

BIOS提供了int 16h 中断例程供程序员调用

  int 16h 中断例程中包含的一个最重要的功能是从键盘缓冲区中读取一个键盘输入,该功能的编号为0。 下面的指令从键盘缓冲区中读取一个键盘输入,并且将其从缓冲区中删除:

mov ah,0

int 16h

结果:(ah)=扫描码,(al)=ASCII码。   下面,我们接着上一节中的键盘输入过程,看一下 int 16h 如何读取键盘缓冲区。    
int 16h读键盘缓冲区演示! [kml_flashembed publishmethod="static" fversion="8.0.0" movie="http://blog.fishc.com/wp-content/uploads/2012/07/17_int16读键盘缓冲区.swf" width="400" height="300" targetclass="flashmovie" wmode="transparent"] [/kml_flashembed]  

从上面我们可以看出,int 16h 中断例程的 0 号功能,进行如下的工作:

(1)检测键盘缓冲区中是否有数据; (2)没有则继续做第1 步; (3)读取缓冲区第一个字单元中的键盘输入; (4)将读取的扫描码送入ah,ASCII 码送入al; (5)将己读取的键盘输入从缓冲区中删除。   可见,B1OS 的int 9 中断例程和int 16h 中断例程是一对相互配合的程序,int 9 中断例程向键盘缓冲区中写入,int 16h 中断例程从缓冲区中读出。 它们写入和读出的时机不同,int 9 中断例程在有键按下的时候向键盘缓冲区中写入数据; 而int 16h 中断例程是在应用程序对其进行调用的时候,将数据从键盘缓冲区中读出。   我们在编写一般的处理键盘输入的程序的时候,可以调用int 16h 从键盘缓冲区中读取键盘的输入。 编程,接收用户的键盘输入,输入“r”,将屏幕上的字符设置为红色:输入“g”, 将屏幕上的字符设置为绿色;输入“b ”,将屏幕上的字符设置为蓝色。  
程序实现源码: [buy]   [/buy] [Downlink href='http://kuai.xunlei.com/d/LBWTXRLBYBVV']视频下载[/Downlink]

转载于:https://www.cnblogs.com/LoveFishC/archive/2011/06/08/3847083.html

你可能感兴趣的文章
Java实现视频网站的视频上传、视频转码、视频关键帧抽图, 及视频播放功能
查看>>
ActiveMQ消息队列介绍(转)
查看>>
web前端知识体系小结(转)
查看>>
拔高你的Java代码质量吧:推荐使用枚举定义常量(转)
查看>>
javascript 获取元素相对于浏览器的位置 ie 5,6,7,8,9,10 测试通过
查看>>
nginx精简真实案例配置和参考说明
查看>>
linux如何安装多个jdk?
查看>>
PHP 利用CURL(HTTP)实现服务器上传文件至另一服务器
查看>>
工欲善其事,必先利其器 之 WPF篇: 随着开发轨迹来看高效WPF开发的工具和技巧...
查看>>
初学Java——类和方法(2)继承和多态
查看>>
一道很经典的线程笔试题-子线程打印30次,主线程打印20次,如此一轮,循环50轮。...
查看>>
AVS 端能力之蓝牙模块
查看>>
UNIX网络编程——关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
查看>>
Connection Reset By Peer 解析
查看>>
Python装饰器
查看>>
php编程规范
查看>>
swift -- 基础
查看>>
java 数组
查看>>
JVM — 虚拟机内存模型
查看>>
冒泡排序优化版
查看>>