Chinaunix

标题: 键盘中断没看明白,求助。 [打印本页]

作者: shaohui973    时间: 2012-10-02 13:23
标题: 键盘中断没看明白,求助。
内核版本 linux0.11

do_self:
        lea alt_map,%ebx
        testb $0x20,mode                /* alt-gr ,如果mode == 0x20,则表示按下了右键alt或ctrl;如果mode == 0x10,则表示按下了左键alt或ctrl*/
        jne 1f                                /* jne:不相等则跳转;jnz:不等于0则跳转*/
        lea shift_map,%ebx
        testb $0x03,mode
        jne 1f
        lea key_map,%ebx
1:        movb (%ebx,%eax),%al
        orb %al,%al
        je none                 /*普通的按键从这返回*/
        testb $0x4c,mode                /* ctrl or caps */
        je 2f
        cmpb $'a,%al
        jb 2f
        cmpb $'},%al
        ja 2f
        subb $32,%al
2:        testb $0x0c,mode                /* ctrl */
        je 3f

不明白的是红色字体。如果我按键按下的是普通的按键,比如“A”或者左键"ctrl",那么mode != 0x20,但是这段代码(jne 1f)却说明了,这种情况下是使用alt_map的,正常的情况下,应该使用的是key_map吧。
求明白,谢谢!
作者: shaohui973    时间: 2012-10-02 18:29
咋都是 无痕过客 ???
作者: sonicling    时间: 2012-10-05 02:55
本帖最后由 sonicling 于 2012-10-05 02:56 编辑

你自己理解错了。再仔细想想吧。
作者: shaohui973    时间: 2012-10-06 09:33
网易-键盘扫描码.rar (9.86 KB, 下载次数: 4)
作者: shaohui973    时间: 2012-10-09 22:17
看明白了,汇编没理解对!
do_self:
        lea alt_map,%ebx
        testb $0x20,mode                /* alt-gr ,这里的汇编含义:0x20 & mode,如操作结果为0,则将标志寄存器zf置位*/
        jne 1f                               /* jne/jnz:标志寄存器eflag的ZF位没有被置位,则跳转*/
        lea shift_map,%ebx
        testb $0x03,mode
        jne 1f
        lea key_map,%ebx
1:        movb (%ebx,%eax),%al

由于一般的按键,mode值为0,故testb $0x20,mode之后,eflag寄存器的zf位被置位,所以,不会跳转到标号1处,同理,最后,%ebx指向了key_map。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2