assembly - 如何在 NASM 中等待指定的按键被按下?

标签 assembly nasm x86-16 bootloader bios

我正在创建自定义 MBR,它将加载我的消息,在按下指定的键 CTRL+ALT+ESC 后,它将加载原始 MBR,除了等待按键之外,我已经完成了所有操作。我找到了等待任何按键的代码,但我已经指定了按键,我知道我可以使用AL来设置按下按钮的ASCII字符,但我有3个组合键,而且它们也不是 ASCII 字符。那么我怎样才能实现这一点呢?

这是我的代码的一部分,这只是示例:

org 0x7c00
bits 16

    ; wait for key
    mov ah,0
    int 16h

    ; reboot
    int 19h


MBR_signature:
times 510-($-$$) db 0 
db 55h,0aah

最佳答案

您可以使用Int 16/AH=00h等待下一次击键。您可以继续检查击键,直到按下 ESCAPEscan code对于 ESCAPE 来说是 01h。如果已按下,则可以使用 Int 16/AH=02h获取换档标志,其中包括当前是否按下 CONTROL 和/或 ALTAL 的位 2 和 3 将包含它们的当前状态。此代码片段应演示对 CONTROLALT ESCAPE 的检测:

org 0x7c00
bits 16

getkey:
    xor ah,ah          ; AH = 0
    int 16h            ; Wait for key
    cmp ah, 01h        ; Scan code 1 = Escape
    jne getkey         ; If Escape not pressed get another key

    mov ah,2h
    int 16h            ; Query keyboard status flags
    and al, 0b00001111 ; Mask all the key press flags
    cmp al, 0b00001100 ; Check if ONLY Control and Alt are pressed and make sure
                       ;    Left and/or Right Shift are not being pressed
    jne getkey         ; If not go back and wait for another keystroke
                       ;    Otherwise Control-Alt-Escape has been pressed
    ; reboot
    int 19h

MBR_signature:
times 510-($-$$) db 0
db 55h,0aah

关于assembly - 如何在 NASM 中等待指定的按键被按下?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51900324/

相关文章:

c - 初学者内联程序集段错误

assembly - 减数较大时如何设置进位标志?

c - 修改我不是其所有者的程序

assembly - xor 不同长度的十六进制字符串 NASM

c - 将新部分插入二进制文件?

assembly - 汇编器 8086 将 32 位数除以 16 位数

linux - 如何在 32 位 Linux 上运行 16 位代码?

nasm - 了解用于在电传打字机模式下输出字符的 nasm 汇编

assembly - 我正在尝试在程序集中以图形模式打印消息,但控制台 d :\is still there

assembly - LEA 指令的目的是什么?