|
LiveOnLove
中级用户
积分 493
发帖 161
注册 2002-10-29 来自 ZHCN
状态 离线
|
『楼 主』:
请教一下这几行汇编是什么意思?
实例为一个键盘测试程序
以下为请教的部分:(具体关键程序段详见后)
;INT 9
1867: PUSH AX 保存ax寄存器,这与下面的内容无关,不管。
1868: IN AL,60 读键盘扫描码
186A: PUSH AX 先保存在堆栈中
186B: IN AL,61 取控制寄存器值
186D: OR AL,80 高位置位
186F: OUT 61,AL 送到控制寄存器,表示按键认可
1871: AND AL,7F 高位清除
1873: OUT 61,AL 送到控制寄存器,表示键盘复位
1875: POP AX 从堆栈中恢复所按键的扫描码
其中有以下语句,不知与AL作比较的是代表什么意思?
CMP AL,E0
CMP AL,E1
CMP AL,FA
CMP AL,AA
TEST AL,80
CMP AL,F1
CMP AL,F2
CMP AL,9D
CMP AL,BA
CMP AL,C5
CMP AL,C6
CMP AL,B8
CMP AL,38
CMP AL,1D
CMP AL,36
CMP AL,01
CMP AL,3B
...
MOV AL,20 ;复位8259控制芯片
OUT 20,AL
POP AX
IRET
有以下几处调用1856的,请问放入到AL寄存器的值代表什么意思啊?
MOV AL,F3
CALL 1856
MOV AL,2A
CALL 1856
MOV AL,ED
CALL 1856
MOV AL,00
CALL 1856
MOV AL,ED
CALL 1856
MOV AL,07
CALL 1856
MOV AL,2C
CALL 1856
=====================================
下面为反汇编出的程序片段
=====================================
1135:1856 E660 OUT 60,AL ;不明白这句??
1135:1858 2E CS:
1135:1859 F6060F0101 TEST BYTE PTR [010F],01
1135:185E 74F8 JZ 1858
1135:1860 2E CS:
1135:1861 C6060F0100 MOV BYTE PTR [010F],00
1135:1866 C3 RET
1135:1867 50 PUSH AX
1135:1868 E460 IN AL,60
1135:186A 50 PUSH AX
1135:186B E461 IN AL,61
1135:186D 0C80 OR AL,80
1135:186F E661 OUT 61,AL
1135:1871 247F AND AL,7F
1135:1873 E661 OUT 61,AL
1135:1875 58 POP AX
1135:1876 3CE0 CMP AL,E0 ;???? 就是这些判断语句不知代表什么按键还是键盘的扫描码,如果是扫描码,却是E0???真的不清楚。。。
1135:1878 7509 JNZ 1883
1135:187A 2E CS:
1135:187B C606080101 MOV BYTE PTR [0108],01
1135:1880 E94401 JMP 19C7
1135:1883 3CE1 CMP AL,E1 ;????
1135:1885 7509 JNZ 1890
1135:1887 2E CS:
1135:1888 C606090101 MOV BYTE PTR [0109],01
1135:188D E93701 JMP 19C7
1135:1890 3CFA CMP AL,FA ;????
1135:1892 7509 JNZ 189D
1135:1894 2E CS:
1135:1895 C6060F0101 MOV BYTE PTR [010F],01
1135:189A E99F00 JMP 193C
1135:189D 3CAA CMP AL,AA ;????
1135:189F 7522 JNZ 18C3
1135:18A1 2E CS:
1135:18A2 F606080101 TEST BYTE PTR [0108],01
1135:18A7 7517 JNZ 18C0
1135:18A9 2E CS:
1135:18AA F6060D0101 TEST BYTE PTR [010D],01
1135:18AF 7509 JNZ 18BA
1135:18B1 2E CS:
1135:18B2 C6060A0101 MOV BYTE PTR [010A],01
1135:18B7 EB7D JMP 1936
1135:18B9 90 NOP
1135:18BA 2E CS:
1135:18BB C6060D0100 MOV BYTE PTR [010D],00
1135:18C0 EB7A JMP 193C
1135:18C2 90 NOP
1135:18C3 A880 TEST AL,80
1135:18C5 747E JZ 1945
1135:18C7 3CF1 CMP AL,F1
1135:18C9 747A JZ 1945
1135:18CB 3CF2 CMP AL,F2
1135:18CD 7476 JZ 1945
1135:18CF 3C9D CMP AL,9D
1135:18D1 7522 JNZ 18F5
1135:18D3 2E CS:
1135:18D4 F606090101 TEST BYTE PTR [0109],01
1135:18D9 7561 JNZ 193C
1135:18DB 2E CS:
1135:18DC F606080101 TEST BYTE PTR [0108],01
1135:18E1 7509 JNZ 18EC
1135:18E3 2E CS:
1135:18E4 80260C01FE AND BYTE PTR [010C],FE
1135:18E9 EB51 JMP 193C
1135:18EB 90 NOP
1135:18EC 2E CS:
1135:18ED 80260C01FD AND BYTE PTR [010C],FD
1135:18F2 EB48 JMP 193C
1135:18F4 90 NOP
1135:18F5 3CBA CMP AL,BA
1135:18F7 7509 JNZ 1902
1135:18F9 2E CS:
1135:18FA C606100100 MOV BYTE PTR [0110],00
1135:18FF EB3B JMP 193C
1135:1901 90 NOP
1135:1902 3CC5 CMP AL,C5
1135:1904 7517 JNZ 191D
1135:1906 2E CS:
1135:1907 F606090101 TEST BYTE PTR [0109],01
1135:190C 2E CS:
1135:190D C606090100 MOV BYTE PTR [0109],00
1135:1912 7528 JNZ 193C
1135:1914 2E CS:
1135:1915 C606110100 MOV BYTE PTR [0111],00
1135:191A EB20 JMP 193C
1135:191C 90 NOP
1135:191D 3CC6 CMP AL,C6
1135:191F 7511 JNZ 1932
1135:1921 2E CS:
1135:1922 F606080101 TEST BYTE PTR [0108],01
1135:1927 7513 JNZ 193C
1135:1929 2E CS:
1135:192A C606120100 MOV BYTE PTR [0112],00
1135:192F EB0B JMP 193C
1135:1931 90 NOP
1135:1932 3CB8 CMP AL,B8
1135:1934 7506 JNZ 193C
1135:1936 2E CS:
1135:1937 C6060B0100 MOV BYTE PTR [010B],00
1135:193C 2E CS:
1135:193D C606080100 MOV BYTE PTR [0108],00
1135:1942 E98200 JMP 19C7
1135:1945 2E CS:
1135:1946 A20701 MOV [0107],AL
1135:1949 3C38 CMP AL,38
1135:194B 7509 JNZ 1956
1135:194D 2E CS:
1135:194E C6060B0101 MOV BYTE PTR [010B],01
1135:1953 EB42 JMP 1997
1135:1955 90 NOP
1135:1956 3C1D CMP AL,1D
1135:1958 751F JNZ 1979
1135:195A 2E CS:
1135:195B F606090101 TEST BYTE PTR [0109],01
1135:1960 7565 JNZ 19C7
1135:1962 2E CS:
1135:1963 F606080101 TEST BYTE PTR [0108],01
1135:1968 7509 JNZ 1973
1135:196A 2E CS:
1135:196B 800E0C0101 OR BYTE PTR [010C],01
1135:1970 EB07 JMP 1979
1135:1972 90 NOP
1135:1973 2E CS:
1135:1974 800E0C0102 OR BYTE PTR [010C],02
1135:1979 3C2A CMP AL,2A
1135:197B 750E JNZ 198B
1135:197D 2E CS:
1135:197E F606080101 TEST BYTE PTR [0108],01
1135:1983 7542 JNZ 19C7
1135:1985 2E CS:
1135:1986 C6060D0101 MOV BYTE PTR [010D],01
1135:198B 3C36 CMP AL,36
1135:198D 7508 JNZ 1997
1135:198F 2E CS:
1135:1990 F606080101 TEST BYTE PTR [0108],01
1135:1995 7530 JNZ 19C7
1135:1997 3C01 CMP AL,01
1135:1999 7511 JNZ 19AC
1135:199B 2E CS:
1135:199C F6060B0101 TEST BYTE PTR [010B],01
1135:19A1 741E JZ 19C1
1135:19A3 2E CS:
1135:19A4 C606050101 MOV BYTE PTR [0105],01
1135:19A9 EB1C JMP 19C7
1135:19AB 90 NOP
1135:19AC 3C3B CMP AL,3B
1135:19AE 7511 JNZ 19C1
1135:19B0 2E CS:
1135:19B1 F6060B0101 TEST BYTE PTR [010B],01
1135:19B6 7409 JZ 19C1
1135:19B8 2E CS:
1135:19B9 C606040101 MOV BYTE PTR [0104],01
1135:19BE E97BFF JMP 193C
1135:19C1 2E CS:
1135:19C2 C606060101 MOV BYTE PTR [0106],01
1135:19C7 B020 MOV AL,20
1135:19C9 E620 OUT 20,AL
1135:19CB 58 POP AX
1135:19CC CF IRET
=====================================
1135:1A2B FA CLI
1135:1A2C B009 MOV AL,09
1135:1A2E B435 MOV AH,35
1135:1A30 CD21 INT 21
1135:1A32 8CC0 MOV AX,ES
1135:1A34 8ED8 MOV DS,AX
1135:1A36 8BD3 MOV DX,BX
1135:1A38 B060 MOV AL,60
1135:1A3A B425 MOV AH,25
1135:1A3C CD21 INT 21
1135:1A3E 1F POP DS
1135:1A3F BA6718 MOV DX,1867
1135:1A42 B009 MOV AL,09
1135:1A44 B425 MOV AH,25
1135:1A46 CD21 INT 21
1135:1A48 FB STI
1135:1A49 B0F3 MOV AL,F3
1135:1A4B E808FE CALL 1856
1135:1A4E B02A MOV AL,2A
1135:1A50 E803FE CALL 1856
1135:1A53 2E CS:
1135:1A54 C606040100 MOV BYTE PTR [0104],00
1135:1A59 2E CS:
1135:1A5A C6060A0100 MOV BYTE PTR [010A],00
1135:1A5F B0ED MOV AL,ED ;AL的值到底代表什么?
1135:1A61 E8F2FD CALL 1856
1135:1A64 B000 MOV AL,00
1135:1A66 E8EDFD CALL 1856
...
|
|
2005-12-21 19:07 |
|
|
LiveOnLove
中级用户
积分 493
发帖 161
注册 2002-10-29 来自 ZHCN
状态 离线
|
|
2005-12-26 13:40 |
|
|
vptdosme
初级用户
积分 97
发帖 32
注册 2005-12-3
状态 离线
|
『第
3 楼』:
具体代码我就没看了
1.OUT 60,AL ;不明白这句??
向60端口写入一个字节(存储在AL中)
2.
1135:1A5F B0ED MOV AL,ED ;AL的值到底代表什么?
1135:1A61 E8F2FD CALL 1856
可以用调试软件跟踪到 CALL 1856,要看该CALL怎样使用这个参数了
|
|
2005-12-29 13:39 |
|
|
LiveOnLove
中级用户
积分 493
发帖 161
注册 2002-10-29 来自 ZHCN
状态 离线
|
『第
4 楼』:
RE:vptdosme
1:OUT 60,AL,这个端口不是放键盘扫描码的吗?难道可以直接修改它??
2:CALL在这里:
=====================================
1135:1856 E660 OUT 60,AL ;不明白这句??
1135:1858 2E CS:
1135:1859 F6060F0101 TEST BYTE PTR [010F],01
1135:185E 74F8 JZ 1858
1135:1860 2E CS:
1135:1861 C6060F0100 MOV BYTE PTR [010F],00
1135:1866 C3 RET
|
|
2005-12-29 16:06 |
|
|
LiveOnLove
中级用户
积分 493
发帖 161
注册 2002-10-29 来自 ZHCN
状态 离线
|
『第
5 楼』:
只有发生INT9键盘中断时,才有可能会修改010F处的值。
详见INT9自编中断处的:
1135:1985 2E CS:
1135:1986 C6060D0101 MOV BYTE PTR [010D],01
1135:198B 3C36 CMP AL,36
|
|
2005-12-29 16:08 |
|
|
vptdosme
初级用户
积分 97
发帖 32
注册 2005-12-3
状态 离线
|
『第
6 楼』:
好长时间没玩16位汇编了,有些都忘了。不过有一点可以肯定,DOS下程序可以直接访问端口
另外,一个键盘测试程序没有必要搞得这么复杂吧
这有我N年前写的一个例子,看看有没有用吧:
;显示键盘输入字符的ASSIC码,按ESC退出
.model tiny
.stack
.code
org 100h
bejin: jmp start
include lib.hsq
key_ASII0 db 0dh
key_ASII1 db '?','?','$'
key_statue db 'Cops Lock',13,10,'$'
start: mov ax,cs
mov ds,ax
again: mov ah,0
int 16h
cmp ah,01h
je exit@
mov key_ASII0,al
lea bx,key_ASII0
Char_data
lea bx,key_ASII1
mov [bx],ah
mov [bx].1,al
jmp go
exit@: jmp exit
go: mov ah,02H
int 16h
mov cl,6
shr al,cl
and al,00000001b
cmp al,1
jne nokey
;测试Cops Lock键是否按下
print key_statue
nokey: print key_ASII1
wait_Enter
clear_screen
locate: mov ah,2
mov dh,0 ;行
mov dl,0
mov bh,0 ;页号
int 10h ;置光标位置
jmp again
exit:
mov ah,4ch
int 21h
end bejin
[ Last edited by vptdosme on 2005-12-29 at 16:28 ]
附件
1: W.rar (2005-12-29 16:27, 312 bytes, 下载附件所需积分 1 点
,下载次数: 9)
|
|
2005-12-29 16:21 |
|
|
LiveOnLove
中级用户
积分 493
发帖 161
注册 2002-10-29 来自 ZHCN
状态 离线
|
『第
7 楼』:
Quote: | Originally posted by vptdosme at 2005-12-29 04:21 PM:
好长时间没玩16位汇编了,有些都忘了。不过有一点可以肯定,DOS下程序可以直接访问端口
另外,一个键盘测试程序没有必要搞得这么复杂吧
这有戠... |
|
端口也有只读和读写的区别啊。据我所知,60端口是放置键盘扫描码的,怎么还能直接写呢,看来这部分,以前我是没有见过的。
至于这个测试程序吧,这个是做键盘COB邦定时,厂家提供的测试程序,不可能有什么问题的(我们都做了几十万个键盘了,包括Acer明基,罗技等键盘)。当然,因为它涉及的东东比较多,所以它全部是自己写INT9.
|
|
2005-12-31 08:41 |
|
|
xingxing168
新手上路
积分 11
发帖 6
注册 2006-4-13
状态 离线
|
『第
8 楼』:
看看int 16h的调用就应该知道了
|
|
2008-11-1 16:09 |
|
|
zhengxm
新手上路
积分 8
发帖 4
注册 2008-11-1
状态 离线
|
『第
9 楼』:
底层驱动一定要结合硬件原理图看,才能明白
|
|
2008-11-1 22:46 |
|
|
netwinxp
高级用户
积分 741
发帖 366
注册 2007-7-25
状态 离线
|
『第
10 楼』:
1、键盘/键盘控制器并不是只读的,比如重启PC、复位键盘、设置键盘速率和延时、要求重发扫描码、设置LED状态、设置扫描码集、屏蔽一类键等等。
2、INT 16H得到的有ASCII码和伪扫描码,所以INT 9要对取得的数据进行分析(E0的扫描码是指小键盘按键)。
3、INT 9不仅仅要取得扫描码转换成伪扫描码和或ASCII码,而且要对一些特殊按键进行处理,比如PrtSrc、Ctrl+Break就要调用对应的中断,对于NumLock、ScrollLock、CapsLock要设置LED状态(彻底死机的话按这些键就不会改变LED状态<程序死循环不影响硬件中断>,另外还要修改BIOS通讯区的键盘缓冲区的首尾指针和数据。6楼的那个硬件中断例程考虑过于简单了,很多该做的工作都没做,存在一定的BUG。
***9楼的不要翻出古董帖好不好***
[ Last edited by netwinxp on 2008-11-2 at 07:24 ]
|
|
2008-11-2 00:08 |
|
|