我如何检查是否在装配 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 键与 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
我尝试检查是否按下了箭头键,然后我开始使用向上键,但是
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 键与 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