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

键盘处理依次按下A,B,C,D,E,shift_A,A的过程:

我们知道,键盘有16字的缓冲区,可以存放15个按键的扫描码和对应的ASCII码值,如下:

  1. | | | | | | | | | | | | | | | | |

我们按下A时,引发键盘中断,CPU执行int 9中断例程,从60h端口读出A键通码,然后检测状态字,看是否有控制键或切换键按下,发现没有,将A的扫描码1eh和对应的ASCII码’a’61h写在缓冲区:

  1. |1e61| | | | | | | | | | | | | | | | |

然后BCDE同理:

  1. |1e61|3062|2e63|2064|1265| | | | | | | | | | | | | | | | |

在按下shift之后引发键盘中断,int 9程序接受了shift的通码之后设置0040:17处状态字第一位为1,表示左shift按下,接下来按A间,引发中断,int 9中断例程从60h端口督导通码之后检测状态字,发现左shift被按下,于是将A的键盘扫描码1eh和’A’的ASCII41h写入缓冲区:

  1. |1e61|3062|2e63|2064|1265|1e41| | | | | | | | | | | | | | | |

松开shift,0040:17第一位变回0,之后又按下A和之前一样。

int 16h读取键盘缓冲区

int 16h可以供程序员调用,编号为0的功能是从键盘缓冲区读一个键盘输入,(ah)=扫描码,(al)=ascii码。如:

  1. mov ah,0
  2. int 16h
  3. |3062|2e63|2064|1265|1e41| | | | | | | | | | | | | | | |

执行后,缓冲区第一个没了,然后ah中是1eh,al中是61h。如果缓冲区为空的时候执行,那么会循环等待知道缓冲区有数据,所以int 16h的0号功能的步骤是:

  1. 检测键盘缓冲区是否有数据
  2. 没有则继续1
  3. 读取第一个单元的键盘输入
  4. 扫描码送ah,ascii码送al

    int 13h读写磁盘

    3.5寸软盘分为上下两面,每面80个磁道,每个磁道18个扇区,每个扇区512字节,共约1.44MB。磁盘的实际访问时磁盘控制器进行的,我们通过控制磁盘控制器来控制磁盘,只能以扇区为单位读写磁盘,每次需要给出面号,磁道号,和扇区号,面号和磁道号从0开始,扇区号从1开始。BIOS提供int 13h来实现访问磁盘,读取0面0道1扇区的内容到0:200的程序: ``` mov ax,0 mov es,ax mov bx,200h

mov al,1 ;读取的扇区数 mov ch,0 ;磁道号 mov cl,1 ;扇区号 mov dl,0 ;驱动器号,0开始,0软驱A,1软驱B,磁盘从80h开始,80h硬盘C,81h硬盘D mov dh,0 ;磁头号(软盘面号) mov ah,2 ;13h的功能号,2表示读扇区 int 13h

  1. es:bx指向接收数据的内存区。操作成功(ah)=0,(al)=读入的扇区数,操作失败(ah)=错误代码。将0:200的数据写入001扇区:

es:bx指向写入磁盘的数据,操作成功(ah)=0,(al)=写入的扇区数,操作失败(ah)=错误代码 ```