汇编语言 第十七章 使用 BIOS 进行键盘输入和磁盘读写

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

一般的键盘输入,在 CPU 执行完 int 9 终端例程后,都放到了键盘缓冲区。键盘缓冲区中有 16 个子单元,可以存储 15 个按键的扫描码和对应的 ASCII 码。其实键盘缓冲区是环形队列结构管理的内存区。

通过按下 A、B、C、D、E、Shift_A、A 的输入过程来看 int 9 中断例程对键盘输入的处理方法。

17.2 使用 int 16h 中断例程读取键盘缓冲区

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

1
2
mov ah,0
int 16h

结果:(ah)=扫描码,(al)=ASCII 码。

借着上一节,看键盘缓冲区变化:

由上课的,int 16h 中断例程的 0 号功能,进行如下工作:

  1. 检测键盘缓冲区中是否有数据;
  2. 没有则继续第 1 步;
  3. 读取缓冲区第一个字单元中的键盘输入;
  4. 将读取的扫描码送入 ah,ASCII 码送入 al;
  5. 将已读取得键盘输入从缓存区中删除。

BIOS 的 int 9 中断例程和 int 16h 中断例程是一对相互配合的程序,int 9 中断例程向键盘缓冲区写入,int 16h 中断例程从缓冲区读出。

17.3 字符串的输入

最简单的字符串输入程序,需具备以下的功能:

  1. 在输入的同时显示这个字符串;
  2. 一般在输入回车符之后,字符串输入结束;
  3. 能够删除已经输入的字符。

在字符串输入过程中,字符的输入和输出是按照栈的访问规则进行的,即后进先出。我们可以用栈的方式来管理字符串的存储空间。

简单的定义程序处理过程如下:

  1. 调用 int 16h 读取键盘输入;
  2. 如果是字符,进入字符栈,显示字符栈中的所有字符;继续执行 1;
  3. 如果是退格键,从字符栈中弹出一个字符,显示字符栈中的所有字符;继续执行 1;
  4. 如果是 Enter 键,向字符栈中压入 0,返回。

17.4 应用 int 13h 中断例程对磁盘进行读写

以 3.5 英寸软盘为例,3.5 英寸软盘分为上下两面,每面 80 个磁道。诶个磁道分为 18 个扇区。每个扇区的大小为 512 个字节。

则 2 面 * 80 磁道 * 18 扇区 * 512 字节 = 1440KB ≈ 1.44MB

我们通过控制磁盘控制器来访问磁盘。只能以扇区为单位对磁盘进行读写。在读写扇区时,要给出面号、磁道号和扇区号。面号和磁道号从 0 开始, 而扇区号从 1 开始。

BIOS 提供的访问磁盘的中断例程为 int 13h。读取 0 面 0 道 1 扇区的内容到 0:200 的程序如下:

1
2
3
4
5
6
7
8
9
10
11
mov ax,0
mov ex,ax
mov bx,200h

mov al,1 ;读取的扇区数
mov ch,0 ;磁道号
mov cl,1 ;扇区号
mov dl,0 ;驱动器号,软驱从 0 开始,硬盘从 80h 开始
mov dh,0 ;磁头号
mov ah,2 ;2 表示读扇区,3表示 写扇区
int 13h

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×