如何检查装配中是否按下箭头键16位裸骨

时间:2017-10-15 11:34:05

标签: assembly keyboard ascii x86-16 bios

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

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

1 个答案:

答案 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。

  • 当使用数字键盘上的 up 键时,您将获得AX = 48E0h。
  • up 键与 Shift Alt (或 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