Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1031088
  • 博文数量: 123
  • 博客积分: 5051
  • 博客等级: 大校
  • 技术积分: 1356
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-14 10:56
文章分类
文章存档

2012年(1)

2011年(21)

2010年(13)

2009年(55)

2008年(33)

分类: LINUX

2008-11-01 10:43:21

这个星期时间安排得比较乱,参加这样那样的活动比平时多了一些,结果就是很多学习时间挪用了,接下来的工作就是将失去的补回来, 不然心里感觉不爽,因为花费在linux内核这块的时间少了,这样可不是我想要的,如今发现,在进行内核学习的过程中,无论何时都不能间断对内核代码的阅读,如果一间断,那种感觉就会失去很多,当再次接触的时候,又需要一小段时间去寻找那种感觉,所以,在今后的学习中,应该注意的一点就是:内核代码或者是内核知识无论在何时都不能停顿,即使是一天一个小时也要去争取。这是这些天的一点反省,留着,把记忆留住。

言归正传,前几天买了一本《80x86汇编语言程序设计》,在对其中的内容进行了一次学习,因为在进行linux内核块设备和字符设备驱动的学习中,遇到了很多硬件方面的知识,搞得一头雾水,后来发现,是自己在汇编硬件知识方面几乎就是空白的,所以需要充一下电。键盘I/O又是比较重要的,所以就做了一下笔记。

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,


阅读(1670) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~