汇编第十七节-使用BIOS进行键盘输入和磁盘读写

来源:互联网 发布:php nginx 一键安装包 编辑:程序博客网 时间:2024/05/22 18:22

第十七节:使用BIOS进行键盘输入和磁盘读写

1.int9中断例程对键盘输入的处理:

CPU在9号中断发生后,执行int9中断例程,从60h端口读出扫描码,并将其转化为相应的ASCII码或状态信息,存储在内存的指定空间(键盘缓冲区或状态字节)中
比如 A键的扫描码1eh和对应的ASCII码,即字母’a’的ASCII码61h,写入键盘缓冲区。缓冲区的字单元中,高位字节存储扫描码,低位字节存储ASCII码

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

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

mov ah,0int 16h

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

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

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

int 9中断例程和int 16h中断例程是一对相互配合的程序。
int 9 中断例程向键盘缓冲区写入,有键按下的时候向键盘缓冲区中写入数据。
int 16h 中断例程从缓冲区中读出,有应用程序对其进行调用的时候,将数据从键盘缓冲区中读出

3.字符串的输入:

最基本的字符串输入程序,需具备以下功能:
1.在输入的同时需要显示这个字符串
2.一般在输入回车符后,字符串输入结束
3.能够删除已经输入的字符

(dh),(dl)=字符串在屏幕上显示的行,列位置
ds:si指向字符串的存储空间,字符串以0为结尾符
分析如下:

1.字符的输入和删除:按照栈的访问规则进行,后进后出,字符栈中的所有字符,从栈底到栈顶,组成一个字符串2.在输入回车符后,字符串输入结束:输入回车符后,可以在字符串中加入0,表示字符串结束3.在输入的同时需要显示这个字符串:每次有新的字符输入和删除一个字符的时候,都应该重新显示字符串。4.程序的处理过程:    a.调用int 16h读取键盘输入    b.如果是字符,进入字符栈,显示字符栈中所有的字符;继续执行a    c.如果是退格键,从字符栈中弹出一个字符,显示字符栈中所有字符;继续执行a    d.如果是enter键,向字符栈中压入0,返回

子程序:字符栈的入栈,出栈和显示
参数说明:

                  (ah)=功能号,0表示入栈,1表示出栈,2表示显示                  ds:si指向字符栈空间                  对于0号功能:(al)=入栈字符                  对于1号功能:(al)=返回的字符                  对于2号功能:(dh),(dl)=字符串在屏幕上显示的行,列位置
charstack:  jmp short charstarttable       dw charpush,charpop,charshowtop         dw 0                            ;栈顶charstart:  push bx            push dx            push di            push es            cmp ah,2            ja sret            mov bl,ah            mov bh,0            add bx,bx            jmp word ptr table[bx]charpush:   mov bx,top            mov [si][bx],al            inc top            jmp sretcharpop:    cmp top,0            je sret            dec top            mov bx,top            mov al,[si][bx]            jmp sretcharshow:   mov bx,0b800h            mov es,bx            mov al,160            mov ah,0            mul dh            mov di,ax            add dl,dl            mov dh,0            add di,dx            mov bx,0charshows:  cmp bx,top            jne noempty            mov byte ptr es:[di],' '            jmp sretnoempty:    mov al,[si][bx]            mov es:[di],[al]            mov byte ptr es:[di+2],' '            inc bx                add di,2            jmp charshowssret:       pop es            pop di            pop dx            pop bx

在显示栈中字符的时候,要注意清楚屏幕上上一次显示的内容。写出完整的接受字符串输入的子程序

getstr:     push axgetstrs:    mov ah,0            int 16h            cmp al,20h            jb nochar           ;ASCII码小于20h,说明不是字符            mov ah,0            call charstack      ;字符入栈            mov ah,2            call charstack      ;显示栈中的字符            jmp getstrsnocharL:    cmp ah,0eh          ;退格键的扫描码            je backspace            cmp ah,1ch          ;enter键的扫描码            je enter            jmp getstrsbackspace:  mov ah,1            call charstack      ;字符出栈            mov ah,2            call charstack      ;显示栈中的字符            jmp getstrsenter:      mov al,0            mov ah,0            call charstack      ;0入栈            mov ah,2            call charstack      ;显示栈中的字符            pop ax            ret

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

3.5英寸软盘分为上下两面,每面有80个磁道,每个磁道又分为18个扇区,每个扇区的大小为512个字节
则:2面*80磁道*18扇区*512字节=1440KB~~1.44MB
磁盘的实际访问由磁盘控制器进行,我们可以通过控制磁盘控制器来访问磁盘,只能以扇区为单元对磁盘进行读写。在读写扇区的时候,要给出面号,磁道号和扇区号,面号的磁道号从0开始,而扇区号从1开始。
BIOS提供的访问磁盘的中断例程为int 13h。
读取0面0道1扇区的内容到0:200的程序如下

mov ax,0mov es,axmov bx,200hmov al,1mov ch,0mov cl,1mov dl,0mov dh,0mov ah,2int 13h
入口参数:(ah)=int 13h的功能号(2表示读扇区)(al)=读取的扇区数(ch)=磁道号 (cl)=扇区号(dh)=磁头号(对于软盘即面号,一个面用一个磁头来读写)(dl)=驱动器号   软盘从0开始,0:软驱A,1:软驱B                硬盘从80h,80h:硬盘C81h:硬盘Des:bx 指向接受从扇区读入数据的内存区返回参数:操作成功:(ah)=0,(al)=读入的扇区数操作失败:(ah)=出错代码

将0:200中的内容写入0面0到1扇区。

mov ax,0mov es,axmov bx,200hmov al,1mov ch,0mov cl,1mov dl,0mov dh,0mov ah,3int 13h
入口参数:(ah)=int 13h的功能号(3表示写扇区)(al)=读取的扇区数(ch)=磁道号 (cl)=扇区号(dh)=磁头号(对于软盘即面号,一个面用一个磁头来读写)(dl)=驱动器号   软盘从0开始,0:软驱A,1:软驱B                硬盘从80h,80h:硬盘C81h:硬盘Des:bx 指向将写入磁盘的数据返回参数:操作成功:(ah)=0,(al)=写入的扇区数操作失败:(ah)=出错代码
阅读全文
0 0