我如何检查是否在装配 16 位裸机中按下了箭头键

How do i check if the arrow keys are pressed in assembly 16 Bits bare bones

我尝试检查是否按下了箭头键,然后我开始使用向上键,但是

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 或 none,但我找不到适合我的东西!有谁知道正确的代码是什么?它可以是十六进制的 ascii 或二进制。 (我需要左、右、下和上键)

但这些确实有效:

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

首先,稍微简化一下代码。在这里push和pop都没用

keyboard:
    mov  ah, 00h
    int  16h
    mov  [.buffer], ax
    ret
    .buffer  dw  0

如果没有特殊原因,请不要在 int 16h 上使用 10h 函数。坚持使用 00h 函数从 int 16h 检索密钥。

对于 up 键,此函数将在 AH 寄存器中为您提供扫描码,因此 that 就是您的位置程序需要看:

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。

  • 当使用数字键盘上的向上键时,您将得到AX=48E0h。
  • 当您将 up 键与 ShiftAlt(或 AltGr), 或 Ctrl 你会分别得到像 4838h, 0008h, 8D00h, 48E0h, 9800h, 8DE0h 这样的值。

其他键是:

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