分类: LINUX
2008-11-01 10:43:21
BIOS和DOS中断
在一些情况下,选择DOS中断或者是选择BIOS中断可以执行同样的功能。
DOS和BIOS功能都通过软件中断调用。在中断调用前需要把功能号装入AH寄存器,把子功能号装入AL寄存器,除此之外,通常还需要在CPU寄存器中提供专门的调用参数。
调用DOS或BIOS功能时,有以下几个基本步骤:
1、将调用数装入指定的寄存器中;
2、如需功能号,把它装入AH;
3、如需字功能号,将它装入到AL;
4、按中断号调用DOS或BIOS中断;
5、检查返回参数是否正确。
键盘 I/O
键盘的三种基本类型的键:字符数字键、扩展功能键、和其他键组合使用的控制键。
数字键盘给计算机提供一个ASCII码,而扩展功能则是产生一个动作。
键盘和主机通过五芯电缆相连:电源线、地线、复位线以及键盘数据线和键盘时钟线。按键的识别使用行列扫描法,即根据对行线和列线的扫描结果来确定闭合键的位置,并通过键盘数据线将闭合键所对应的扫描码送往主机。
DOS键盘功能调用
单个字符输入
键盘上的每个键都对应一个扫描码,从01到83,或者从01H到53H,所以根据扫描码就能唯一确定哪个键改变了状态。
BIOS键盘中断
类型16的中断提供了基本的键盘操作,它的中断处理程序包括3个不同的功能,分别格局AH的内容来选择:
AH=0,从键盘读取一个字符,返回参数:AL=字符码,AH=扫描码
AH=1,读键盘缓冲区的字符,返回参数:如果ZF=0,AL=字符码,AH=扫描码,如果ZF=1,缓冲区空。
AH=2,取键盘状态字节,AL=键盘状态字节
这里有个叫做KB_FLAG(键盘状态字节),各个位表示的状态即为键盘上所对应的键被操作的情况。
DOS键盘中断
与键盘输入有关的DOS 21H功能掉哦嗯,它包括将单字符读入AL和把一个字符串读入存储器等功能。
AH=1,从键盘输入一个字符并回显在屏幕上,返回参数:AL=字符
AH=6,读键盘字符,调用参数DL=0FFH,如果有字符可取,AL=字符,ZF=0,否则,AL=0,ZF=1
AH=7,从键盘输入一个字符,不回显,AL=字符
(这里的意思是:当AH=7,并使用中断操作INT 21H时,系统调用21H中断中的AH=7H所对应的功能,即从键盘键人一个字符,但是并不会显示在控制台,不像AH=1多对应的那样将字符显示到控制台,但是,此时AL是对应的输入的字符。)
AH=8,从键盘输入一个字符,不回显,检测Ctrl_Break,AL=字符
AH=A,输入字符到缓冲区,DS:DX=缓冲区首址
AH=B,读键盘状态 ,AL=0FFH有键人,AL=00无键人
AH=C,清除键盘缓冲区,并调用一种键盘功能,AL=键盘功能号(1,6,7,8,A)
如果要求程序能接收功能键或者是数字组合键必须进行两次DOS调用,第一次会送00,第二次会送扫描码。
例如下面的一个汇编程序:
1
MOV AH,7 //AH的值为07H
2
INT 21H //调用21H中断中的07H功能
3
CMP AL,0 //检查是否是功能键
4
JE GET_EC //是则进行功能键对应的处理
5
JMP ERROR
6 GET_EC: MOV AH,7
7 INT 21H
8 CMP AL,3BH
9 JE OPTION1
10 CMP AL,3CH
11 JE OPTION2
12 CMP AL,3DH
13 JE OPTION3
14 JMP ERROR
字符串输入
21H中断的功能A能从键盘读入一串字符并把它存入用户定义的缓冲区中。缓冲区的第一个字节保存最大字符数。这个最大的字符数是由用户程序给出的。如果实际键人的字符数比此数大,微机就会发出声音,而且光标不再向右移动。由于缓冲区仅仅使用一个字节来表示,所以缓冲区的逻辑上限制为255字节。第二个字节是实际输入字符的个数,这个数据是由动能A填入的。之后,字符串就按照字节存入缓冲区,最后结束字符串的回车0DH还要占用一个字节,因此,这个缓冲区的字节空间应该为最大字符数加2。
MAXLEN DB 32
ACTLEN DB ?
STRING DB 32 DUP(?)
输入字符串程序
15 mov ax,@data
16 mov ds,ax
17 lea dx,user_string
18 mov ah,0ah
19 int 21h
20 sub ch,ch
21 mov cl,user_string+1
22 add dx,2
23 exit:
24 mov ax,4c00h
25 int 21h
26
27 read_keys endp
清除键盘缓冲区
INT 21H的功能0CH能清除键盘缓冲区,然后执行在AL中指定的功能,使用0CH功能可以使程序在输入一个字符之前,将以前键入的字符清除掉。
检验键盘状态
DOS 21H的功能0BH能检验一个键是否被按动,如果按下一个键,则在AL寄存器中放入0FFH,如果没有按下键,则在AL中放00,