第十七章 使用 BIOS 进行键盘输入和磁盘读写
本章概述:
大多数有用的程序都需要处理用户的输入,键盘输入是最基本的输入。
程序和数据通常需要长期存储,磁盘是最常用的存储设备。BIOS为这两种外设的I/O提供了最基本的中断例程。
一、 int 9 中断例程对键盘输入的处理
键盘输入将引发9号中断,BIOS提供了int9中断例程。CPU在9号中断发生后,执行int 9中断例程,从60h端口读出扫描码,并将其转化为相应的ASCII码或状态信息,存储在内存的指定空间(键盘缓冲区或状态字节)中。
一般的键盘输入,在CPU执行完int 9中断例程后,都放到了键盘缓冲区中。键盘缓冲区中有16个字单元,可以存储15个按键的扫描码和对应的ASCII码。
二、 使用int16h 中断例程读取键盘缓冲区
BIOS提供了int 16h中断例程供程序员调用。int 16h中断例程中包含的一个最重要的功能是从键盘缓冲区中读取一个键盘输入,该功能的编号为0。下面的指令从键盘缓冲区中读取一个键盘输入,并且将其从缓冲区中删除。
mov ah,0
int 16h
结果: (ah)=扫描码,(al)=ASCII码
int 16h中断例程检测键盘缓冲区,发现缓冲区空,则循环等待,直到缓冲区中有数据。
int 16h中断例程的0号功能,进行如下的工作:
检测键盘缓冲区中是否有数据;
没有则继续做第1步;
读取缓冲区第一个字节单元中的键盘输入;
将读取的扫描码送入ah,ASCII码送入al;
将已读取的键盘输入从缓冲区中删除。
BIOS的int 9中断例程和int 16h中断例程是一对相互配合的程序,int 9中断例程向键盘缓冲区中写入,int 16h中断例程从缓冲区中读出。它们写入和读出的时机不同,int 9中断例程是在有键按下的时候向键盘缓冲区中写入数据;而int 16h中断例程是在应用程序对其进行调用的时候,将数据从键盘缓冲区中读出。
三、 字符串的输入
最简单的字符串输入程序,需要具备下面的功能:
在输入的同时需要显示这个字符串;
一般在输入回车符后,字符串输入结束;
能够删除已经输入的字符。
以栈的方式处理字符串的输入,需要的功能有入栈、出栈、显示。
四、 应用int13h 中断例程对磁盘进行读写
3.5英寸软盘分为上下两面,每面有80个磁道,每个磁道又分为18个扇区,每个扇区的大小为512个字节。则:2面*80磁道*18扇区*512字节=1440KB~=1.44MB
磁盘的实际访问由磁盘控制器进行,我们可以通过控制磁盘控制器来访问磁盘。只能以扇区为单位对磁盘进行读写。在读写扇区的时候,要给出面号、磁道号和扇区号。面号和磁道号从0开始,而扇区号从1开始。
如果我们通过直接控制磁盘控制器来访问磁盘,则需要涉及许多硬件细节。BIOS提供了对扇区进行读写的中断例程,这些中断例程完成了许多复杂的和硬件相关的工作。我们可以通过调用BIOS中断例程来访问磁盘。
BIOS提供的访问磁盘的中断例程为int 13h。
五、 实验17 编写包含多个子功能程序的中断例程
六、 课程设计2