庞大资源库的计算机教程网站!
设为首页
加入收藏
总编信箱
投稿或申请专栏请先 [登 陆]
首页 操作系统 程序设计 图形图像 媒体动画 机械电子 WEB开发 数 据 库 办公系列 路由技术 网络原理 网络应用
认证考试 安全技术
首页>安全技术>软件破解>反汇编>正文
资料搜索
Google搜索
Google
返回上级列表

推荐文章

快速保存网页中所有图片的方法
Windows中让光驱巧妙“隐身”技
防范非法用户入侵Win 2000/XP系
两款比较典型的ASP木马防范方法
有关表格边框的css语法整理
Windows XP中可以被禁用的服务
SQL Server导出导入数据方法
Javascript所有对象的属性的获
网页(HTML)中的特殊字符
与篮球共舞,尽显模式本色
QQ病毒的手工清除方法
Photoshop为极品美女打造性感睫
天衣无缝:IIS与PHP水火也相容
SQL Server存储过程编写和优化

获得键盘扫描码

 作者:本站收集   日期:2005-5-26
字号选择〖 〗/ 双击滚屏 单击停止   
概述:

    在编制键盘输入程序时常常要用到一个键的扫描码或ASC码,如用到 Foxpro 的 inkey() 函数,以及用到 BIOS 的 INT 16H时,但找一个编码表不太容易,有时候找到的编码表又不全,无法查到组合键的编码,本程序就是一个随时用来显示按键的ASC码及扫描码的程序,可以用 16 进制和 10 进制同时显示一个键按下和放开的扫描码,以及ASC码,同样也支持组合键。这里是编译好的可执行文件:scancode.com
    在本程序中,查表的编程方法可用做参考,一般来说,如果程序有以下的结构:

       ...
       cmp     al,value1
       jz      offset1
       cmp      al,value2
       jz      offset2
       cmp     al,value3
       jz      offset3
       ...

且要比较的值很多时,可以考虑查表的方法。程序改为以下结构后,修改起来很容易,可读性也大大增强了,如果要继续添加分支时,只需在表中加上一项就行。

       ...
table  db     value1,value2,value3 ...
table1 dw     offset1,offset2,offset3 ...

        mov    di,offset table
        mov    cx,table的长度
        repnz  scasb
        jnz    not_found

        dec    di
        sub    di,offset table         ;取出表的地址
        mov    si,di
        shl    si,1                    ;x2
        add    si,offset table1
        jmp    [si]                    ;跳转到表中的地址
        ...

   
源程序:

;    Scan code viewer
;    Aug 3,1995
;    by Luo Yun Bin

.286
CODE      SEGMENT
          ASSUME     CS:CODE,DS:CODE
          ORG    100H
start:
          jmp    install

KEY_BUFF  DB    ?             ;INT 9H中按下一个键产生的扫描码
KEY_BUFF1 DB    ?             ;INT 9H中松开一个键产生的扫描码
AAH       DB    ?
AAL       DB    ?

D_COPYRIGHT    DB    "<< ScanCode viewer >>",0dh,0ah
        DB    '(C) Copyright by Luo Yun Bin, May 26,1996',0dh,0ah
        DB    'Phone: 0576-4114689.',0dh,0ah,0ah
        DB    "Press any key to view it's scan code...",0dh,0ah
        DB    'or press Esc key to return DOS...',0dh,0ah,0ah,24h
D_MES1  DB    'Scan Code: %02shh (%2sd) ... '
        DB    'Release: %02shh (%3sd) ... Key: ',0
        DW     KEY_BUFF,KEY_BUFF,KEY_BUFF1,KEY_BUFF1
D_MES2  DB    0dh,0ah,0
D_MES3  DB    'Key value: %02sh%02shh ...... '
        DB     '(AH=%sd,AL=%sd)',0dh,0ah,0ah,0
        DW    AAH,AAL,AAH,AAL
D_MES4  DB    'This is Scan Code viewer by LYB.',0dh,0ah,24h

;键盘扫描码编码表
;                    0123456789abcdef ;
KEY_TABLE    DB    '??1234567890-=??' ;0
             DB     'QWERTYUIOP[]??AS' ;1
             DB     "DFGHJKL;'`?\ZXCV" ;2
             DB     'BNM,./?*????????' ;3
             DB     '??????????-?5?+?' ;4
             DB     '????????????????' ;5
             DB     '????????????????' ;6
             DB     '????????????????' ;7

;特殊键的说明字符串编码表
KEY_TABLE1   DB     3bh,3ch,3dh,3eh,3fh,40h,41h,42h,43h,44h,57h,58h
             DB     0eh,0fh,3ah,2ah,1dh,38h,36h,1ch,39h,1
             DB     52h,53h,47h,4fh,49h,51h,48h,50h,4bh,4dh,46h,45h

;对应上表
KEY_TABLE1_END    EQU    THIS BYTE
          DW     f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12
          DW     bks,tab,cap,lsh,ctr,alt,rsh,ent,spa,_esc
          DW     _ins,del,hom,_end,pgu,pgd,up,dow,lef,rig,sco,num

;特殊键的说明字符
f1        db    'F1',0         ;
f2        db    'F2',0
f3        db    'F3',0
f4        db    'F4',0
f5        db    'F5',0
f6        db    'F6',0
f7        db    'F7',0
f8        db    'F8',0
f9        db    'F9',0
f10       db    'F10',0
f11       db    'F11',0
f12       db    'F12',0
bks       db    'Back Space',0
tab       db    'Table',0
cap       db    'Caps Lock',0
lsh       db    'Left Shift',0
ctr       db    'Ctrl',0
alt       db    'Alt',0
rsh       db    'Right Shift',0
ent       db    'Enter',0
spa       db    'Space',0
_ins      db    'Insert',0
del       db    'Delete',0
hom       db    'Home',0
_end      db    'End',0
pgu       db    'Page Up',0
pgd       db    'Page Down',0
up        db    'Up',0
dow       db    'Down',0
lef       db    'Left',0
rig       db    'Right',0
sco       db    'Scroll Lock',0
num       db    'Num Lock',0
_esc      db    'Esc',0

PRINT_KEY    PROC

        mov    bl,key_buff             ;取扫描码到BL
        xor    bh,bh
        mov    al,key_table [bx]       ;查扫描码表

        cmp    al,'?'                  ;如果为?则继续查特殊码表
        jz     pk1
pk0:
        call   prt_to_scr
        ret
pk1:
        mov    al,key_buff             ;在特殊码表内扫描
        mov    di,offset key_table1
        mov    cx,offset key_table1_end-offset key_table1
        repnz  scasb
        jnz    pk0

        dec    di
        sub    di,offset key_table1    ;取出说明字符串地址
        mov    si,di
        shl    si,1
        add    si,offset key_table1_end
        mov    si,[si]
        call   printf                  ;显示到屏幕

        ret

PRINT_KEY    ENDP

;新的 INT 09H 键盘中断程序
int9:
        pushf
        pusha
        push    ds
        push    es

        push    cs
        pop     ds
        push    cs
        pop     es

        in      al,60h                 ;读入扫描码
        mov     key_buff,al

        test    al,80h                 ;如果>80H则为放开一个键
        jnz     int9_quit

        or      al,80h
        mov     key_buff1,al

        mov     si,offset d_mes1
        call    printf
        call    print_key
        mov     si,offset d_mes2
        call    printf
int9_quit:
        pop     es
        pop     ds
        popa
        popf

        DB      0EAH
OFF9    DW      ?
SEG9    DW      ?

install:
        mov    ah,9              ;显示版权信息
        mov    dx,offset d_copyright
        int    21h

        mov    ax,3509h          ;保留INT 09H的中断向量
        int    21h
        mov    off9,bx
        mov    seg9,es
        mov    ax,2509h          ;把INT 09H指到 offset int9
        mov    dx,offset int9
        int    21h
        push   cs
        pop    es
lop:
        mov    ah,10h             ;扩展键盘输入
        int    16h

        mov    aah,ah             ;显示键盘输入的编码
        mov    aal,al
        mov    si,offset d_mes3
        call   printf

        cmp    key_buff,1         ;如果非按下Esc,继续循环
        jnz    lop

        lds    dx,dword ptr off9 ;恢复INT 09H中断向量
        mov    ax,2509h
        int    21h

        push   cs
        pop    ds

        mov    ah,9
        mov    dx,offset d_mes4
        int    21h

        int    20h

INCLUDE PRINTF.ASM                ;一个公用的显示子程序

CODE    ENDS
        END    START
上一篇:用汇编计算圆周率    下一篇:如何检测CPU的主频  
[发送给好友]  [关闭窗口]  [返回顶部]   转载请注明来源:www.it00.com   
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 原点 投稿作者: 本站收集
信息来源: 网络 录入时间: 2005-5-26
关于我们 - 广告服务 - 版权申明 - 网站地图 - 联系方式 - 总编信箱 - 会员投稿