assembly 使用int 0x16获取输入结果

w1e3prcc  于 2023-05-07  发布在  其他
关注(0)|答案(1)|浏览(169)

我做了这个简单的输入函数,当用户按回车键时完成:

input:
    mov ah, 0x00
    int 0x16
    cmp al, 0x0d
    je enter_press
    jne enter_not_press

enter_press:
    ret

enter_not_press:
    jmp input

我如何得到输入结果并将其放入变量中?

qf9go6mv

qf9go6mv1#

你的“简单”输入功能已经太复杂了!没有真实的使用所有这些标签和分支。接下来是更好的、功能等效的代码:

WaitForEnter:
    mov  ah, 0x00     ; BIOS.GetKeyboardKey
    int  0x16         ; -> AX
    cmp  al, 13
    jne  WaitForEnter ; enter_not_pressed
    ret               ; enter_pressed

我如何得到输入结果并将其放入变量中?
这取决于你的用例。

  • 如果您只想存储输入的键码(AL=ASCII,AH=Scancode)以供以后检查,那么您可以:
mov  ah, 0x00     ; BIOS.GetKeyboardKey
  int  0x16         ; -> AX
  mov  [MyKey], ax

  ...

MyKey: dw 0
  • 如果您的输入是从用户检索一些文本,则可以使用以下内容:
GetString:
  mov bx, MyString  ; Get pointer to the allocated space (100 bytes in this case)
.again:
  mov  ah, 0x00     ; BIOS.GetKeyboardKey
  int  0x16         ; -> AX
  cmp  al, 13
  je   .done
  mov  [bx], al     ; Only storing the character code (ASCII)
  inc  bx           ; Incrementing the pointer by 1, size of an ASCII character
  jmp  .again
.done:
  mov  byte [bx], 0 ; Make the string zero-terminated
  ret

  ...

MyString: times 100 db 0

相关问题