汇编笔记

  • 使用BIOS进行键盘输入和磁盘读写
  • 17.1 int 9中断例程对键盘输入的处理
  • 17.2 使用int 16h中断例程读取键盘缓冲区
  • 17.3 字符串的输入
  • 17.4 应用int 13h中断例程对磁盘进行读写
  • 实验17 编写包含多个功能子程序的中断例程


使用BIOS进行键盘输入和磁盘读写

大多数有用的程序都需要处理用户的输入,键盘输入是最基本的输入。程序和数据通常需要长期存储,磁盘是最常用的存储设备。BIOS为这两种外设的I/O提供了最基本的中断例程。


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

键盘缓冲区的一个概念,很简单。按下shift键的同时按下字母键会改变大小写,改变的是编码!如下:a的变化

bios写微码 bios写入_磁道


第一个是在没有按下shift的情况下,按下A键,编码将是小写的“a”;而第二个是在按下shift的情况下,按下A键,编码将是大写的“A”。


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

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

下面的指令从键盘缓冲区中读取一个键盘输入,并且将其从缓冲区中删除:

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中断例程是一堆互相配合的程序。

检测点 17.1
“在int 16h中断例程中,一定有设置IF=1的指令。”这种说法对吗?
错误,当键盘缓冲区为空时,如果设置IF=1,int 9中断无法执行。


17.3 字符串的输入

写出重要内容吧,其他略过略过。

字符串显示过程如下:

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

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

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

则:bios写微码 bios写入_bios写微码_02

在读写扇区的时候,要给出面号、磁道号和扇区号。面号和磁道号从0开始,而扇区号从1开始。

入口参数:

  1. (ah)=int 13h的功能号(2表示读扇区)
  2. (al)=读取的扇区数
  3. (ch)=磁道号
  4. (cl)=扇区号
  5. (dh)=磁头号(对于软盘即面号,因为一个面用一个磁头来读写)
  6. (dl)=驱动器号
  7. es:bx指向接收从扇区读入数据的内存区

对于驱动器号:

  1. 软盘从0开始:0:软驱A、1:软驱B
  2. 硬盘从80h开始:80h:硬盘C、81h:硬盘D

返回参数:

  1. 操作成功:(ah)=0,(al)=读入的扇区数
  2. 操作失败:(ah)=出错代码

实验17 编写包含多个功能子程序的中断例程

略过

本书完,最后3章可能没有什么耐心看了,不过内容的很简单。实验和课程设计还有综合研究以后有时间必定补上,后面将学习操作系统。