0

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

call getkey
cmp al, ...
je direct

我应该在诊断用户按下哪个箭头键之后放什么?

4

5 回答 5

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 读取。

于 2013-06-05T12:52:47.750 回答
1

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

于 2013-06-05T12:06:39.747 回答
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

向下箭头是 0150

向上箭头是 0148

左箭头是 014B

右箭头是 014D

于 2013-06-06T00:09:07.317 回答
1

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

于 2013-06-05T13:33:40.377 回答
0

这取决于您在 getkey 函数中对密钥检测所做的工作。大多数情况下,如果您进行直接硬件访问,则密钥会以扫描码的形式返回。你应该寻找扫描码表

于 2013-06-05T12:08:59.263 回答