汇编语言程序设计(十七)使用BIOS进行键盘输入与磁盘读写
引言
- 最基本的IO设备有两种,一种是键盘,用于让用户进行最基本的输入,一种是磁盘,程序和数据通常需要长期存期,即存储在磁盘中。
键盘IO
9号中断例程对键盘输入进行处理
- 9号中断对应60H端口
- 对于键盘,cpu监测60H端口,一旦监测到有键盘输入,就会引发9号中断,BIOS提供了9号中断的中断例程。
- cpu在9号中断发生后,执行int 9中断例程,从60H端口读出扫描码,并将其转化为相应的asxii码或状态信息,存储在内存的指定空间中,这段空间称为键盘缓冲区。
- 因此,一般的键盘输入,在CPU执行完int 9中断例程后,都放到了键盘缓冲区中。键盘缓冲区中有16个字单元,可以存储15个按键的扫描码和对应的ascii码。
使用int 16h中断例程读取键盘缓冲区
- int 16h中断例程由BIOS提供。
- 我们已知9号中断例程执行完后键盘输入的数据都放在了键盘缓冲区中,16号中断例程则用来从键盘缓冲区中读取一个键盘输入,16号中断例程有很多功能,实现读取键盘缓冲区的功能编号是0。
- 16号中断例程的0号功能从键盘缓冲区中读数据,并将键盘缓冲区中的数据随之删除,工作例程如下:
![]()
int 9与int 16h中断例程配合使用
- 可见,BIOS的9号中断例程和16h中断例程是一对相互配合的程序,int 9中断例程向键盘缓冲区写入,int 16h中断例程从键盘缓冲区读出。
- 他们写入读出时机不同,int 9中断例程在有键按下的时候向键盘缓冲区写入数据,int 16h中断例程在应用程序调用它的时候,将数据从键盘缓冲区读出(不知道是只需要调用一次就一直读出来全部,还是说需要循环调用?应该不需要循环调用,只需要调用一次,16h中断本身就是个死循环,不断检测键盘缓冲区有没有数据,只要有,就读出来)。
字符串的输入
-
用户通过键盘通常不仅仅输入单个字符,更一般的情况是输入字符串。
![]()
-
接收字符串的子程序,实现以上三个基本功能,因为输入过程中需要显示,子程序的参数为:
** (dh)、(dl)分别是字符串在屏幕上显示的行、列位置
** ds:si指向字符串的存储空间,字符串以0为结尾符 -
(1)字符的输入和删除
![]()
** 可看出字符串输入过程中,字符的输入和输出是按照栈的访问规则进行的,即后进先出。因此,字符串的存储空间实际上就是一个字符栈,栈中的所有字符,从栈底到栈顶,组成一个字符串。
- (2)输入回车符后,字符串输入结束
** 此时在字符串中加入0,作为字符串结束的标识符 - (3)在输入的同时要显示这个字符串
** 即每次有新的字符输入和删除一个字符的时候,都应该重新显示字符串,即从字符栈的栈底到栈顶,显示所有的字符。 - (4)程序处理流程如下:
![]()
磁盘IO
- 磁盘的实际访问时由磁盘控制器进行的,我们可以通过控制磁盘控制器来访问磁盘,但直接通过磁盘控制器访问磁盘要设计需要硬件细节,因此可以使用int 13h中断例程(BIOS提供)对磁盘进行读写。




浙公网安备 33010602011771号