我尝试检查是否按下了箭头键,然后我用向上键开始了
cmp al, 48h ;if you press the up arrow
je .up_pressed
,也不
cmp al, 48 ;if you press the up arrow
je .up_pressed
工作,它是8或没有,我找不到任何适合我的东西!有谁知道正确的代码是什么?它可以是十六进制ascii或二进制。 (我需要左,右,下和上键)
但这些DO有效:
cmp al, 13 ;if you press enter
je .done
cmp al, 8 ;if you press backspace
je .backspace
我没有通过以下方式获得输入:
mov ah, 00h
int 16h
但:
cmd:
call newline
mov si, prompt
call Print
mov di, input_buffer
mov al, 0
mov cx, 256
rep stosb
mov ax, input_buffer
mov di, input_buffer
;check for characters typed
.loop:
call keyboard
cmp al, 13 ;if you press enter
je .done
cmp al, 8 ;if you press backspace
je .backspace
cmp al, 27 ;if you press ESC
je .escape_pressed
cmp al, 48h ;if you press the up arrow
je .up_pressed
jmp .character ;otherwise just register a character
.up_pressed:
call newline
mov si, debug
call Print
jmp cmd
.backspace: ;remove a character
mov ah, 0Eh
mov al, 8
int 10h
mov al, 32
int 10h
mov al, 8
int 10h
dec di
jmp .loop
.escape_pressed:
call newline
mov si, escape_pressed_message
call Print
jmp cmd
.character: ;register a character
mov ah, 0Eh
int 10h
stosb
jmp .loop
.done: ;start comparing input<->commands
mov ax, 0
stosb
call newline ;but first make a new line
mov si, input_buffer
cmp BYTE [si], 0
je cmd
键盘上有一个键盘,所以这里是键盘代码:
keyboard:
pusha
mov ax, 0
mov ah, 10h
int 16h
mov [.buffer], ax
popa
mov ax, [.buffer]
ret
.buffer dw 0
答案 0 :(得分:3)
首先,简化代码。在这里推动和弹出是没用的。
keyboard:
mov ah, 00h
int 16h
mov [.buffer], ax
ret
.buffer dw 0
如果没有特殊原因,请不要在int 16h
上使用10h功能。坚持使用00h功能从int 16h
中检索密钥。
对于 up 键,此功能会在AH
寄存器中为您提供扫描码,因此 是您的程序需要查看的位置:
cmp al, 27 ;if you press ESC
je .escape_pressed
cmp AH, 48h ;if you press the up arrow
je .up_pressed
jmp .character ;otherwise just register a character
不要通过比较整个AX
寄存器来查找 up 键!
你不会总是收到AX = 4800h。
其他关键是:
cmp AH, 50h ;if you press the down arrow
je .down_pressed
cmp AH, 4Bh ;if you press the left arrow
je .left_pressed
cmp AH, 4Dh ;if you press the right arrow
je .right_pressed