int 9中断例程对键盘输入的处理
键盘处理依次按下A,B,C,D,E,shift_A,A的过程:
我们知道,键盘有16字的缓冲区,可以存放15个按键的扫描码和对应的ASCII码值,如下:
| | | | | | | | | | | | | | | | |
我们按下A时,引发键盘中断,CPU执行int 9中断例程,从60h端口读出A键通码,然后检测状态字,看是否有控制键或切换键按下,发现没有,将A的扫描码1eh和对应的ASCII码’a’61h写在缓冲区:
|1e61| | | | | | | | | | | | | | | | |
然后BCDE同理:
|1e61|3062|2e63|2064|1265| | | | | | | | | | | | | | | | |
在按下shift之后引发键盘中断,int 9程序接受了shift的通码之后设置0040:17处状态字第一位为1,表示左shift按下,接下来按A间,引发中断,int 9中断例程从60h端口督导通码之后检测状态字,发现左shift被按下,于是将A的键盘扫描码1eh和’A’的ASCII41h写入缓冲区:
|1e61|3062|2e63|2064|1265|1e41| | | | | | | | | | | | | | | |
松开shift,0040:17第一位变回0,之后又按下A和之前一样。
int 16h读取键盘缓冲区
int 16h可以供程序员调用,编号为0的功能是从键盘缓冲区读一个键盘输入,(ah)=扫描码,(al)=ascii码。如:
mov ah,0
int 16h
|3062|2e63|2064|1265|1e41| | | | | | | | | | | | | | | |
执行后,缓冲区第一个没了,然后ah中是1eh,al中是61h。如果缓冲区为空的时候执行,那么会循环等待知道缓冲区有数据,所以int 16h的0号功能的步骤是:
- 检测键盘缓冲区是否有数据
- 没有则继续1
- 读取第一个单元的键盘输入
- 扫描码送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
es:bx指向接收数据的内存区。操作成功(ah)=0,(al)=读入的扇区数,操作失败(ah)=错误代码。将0:200的数据写入0面0道1扇区:
es:bx指向写入磁盘的数据,操作成功(ah)=0,(al)=写入的扇区数,操作失败(ah)=错误代码 ```