如何检测装配中的箭头键

时间:2013-06-05 12:03:00

标签: assembly

我想使用箭头键在汇编语言中指导一个形状,我的代码是这样的:

call getkey
cmp al, ...
je direct

如果用户按下箭头键,我应该把它放到哪个诊断区?

5 个答案:

答案 0 :(得分:5)

这在DOS下适用于我(在DOSBox下测试):

[org 0x100]

repeat:
; Get keystroke
mov ah,0
int 0x16
; AH = BIOS scan code
cmp ah,0x48
je up
cmp ah,0x4B
je left
cmp ah,0x4D
je right
cmp ah,0x50
je down
cmp ah,1
jne repeat  ; loop until Esc is pressed

mov ah,0x4c
int 0x21

up:
mov dx,upstring
mov ah,9
int 0x21
jmp repeat

down:
mov dx,downstring
mov ah,9
int 0x21
jmp repeat

left:
mov dx,leftstring
mov ah,9
int 0x21
jmp repeat

right:
mov dx,rightstring
mov ah,9
int 0x21
jmp repeat

upstring db "Up pressed",13,10,'$'
downstring db "Down pressed",13,10,'$'
leftstring db "Left pressed",13,10,'$'
rightstring db "Right pressed",13,10,'$'

如果你不能/不想使用int 0x16(例如因为你需要读取非阻塞),你可以尝试从端口0x60读取。

答案 1 :(得分:1)

考虑al包含键值,将键值与所需箭头的ascii值进行比较。 请尝试以下ascii值 37(左箭头) 38(向上箭头) 39(右箭头) 40(向下箭头)

答案 2 :(得分:1)

我记得在DOS下使用16h(或21h)中断,第一次提供0,然后你必须再次读取密钥才能获得实际代码。功能键和“插入”或“主页”之类的东西也是如此。只有可以映射到ASCII的密钥直接在一个中断调用中进行。也许这也适用于此。

答案 3 :(得分:1)

键盘缓冲区位于段0,偏移1054(十六进制41E)

http://webcache.googleusercontent.com/search?hl=en-GB&q=cache:HTLtXndIlCQJ:http://support.microsoft.com/kb/60140%2Bdos+keyboard+buffer+location&gbv=2&ct=clnk

downarrow是0150

uparrow是0148

左箭头是014B

右箭头是014D

答案 4 :(得分:0)

这取决于你在getkey函数中为密钥检测做了什么。 大多数情况下,如果您直接进行硬件访问,则会以扫描代码的形式返回密钥。你应该寻找scan codes table