我想使用箭头键在汇编语言中指示一个形状,我的代码是这样的:
call getkey
cmp al, ...
je direct
我应该在诊断用户按下哪个箭头键之后放什么?
这在 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 读取。
考虑到 al 包含键值,将键值与所需箭头的 ascii 值进行比较。尝试以下 ascii 值 37(左箭头) 38(上箭头) 39(右箭头) 40(下箭头)
键盘缓冲区位于段 0,偏移量 1054(41E 十六进制)
向下箭头是 0150
向上箭头是 0148
左箭头是 014B
右箭头是 014D
我记得在 DOS 中使用 16h(或 21h)中断第一次为您提供了 0,然后您必须再次读取密钥才能获得实际代码。功能键和“插入”或“主页”之类的东西也是如此。只有可以映射到 ASCII 的键才能在一次中断调用中直接进入。也许这也适用于此。
这取决于您在 getkey 函数中对密钥检测所做的工作。大多数情况下,如果您进行直接硬件访问,则密钥会以扫描码的形式返回。你应该寻找扫描码表