【问题标题】:ASM Replacing scancodes with ASCII charactersASM 用 ASCII 字符替换扫描码
【发布时间】:2016-09-28 09:36:05
【问题描述】:

我有这个代码:

bits 16

org 0x7C00
start: jmp main

key: dw 0x1e, 'a', 0x30, 'b'

print:
    mov ah, 0x0E
    int 0x10

keyboard:
    cli
    in al, 0x64
    test al, 1
    jz return
    test al, 0x20
    jnz return

    in al, 0x60

    call convert

    call print
    sti

convert:
    mov bx, 0
    .LOOP:
        cmp al, [key+bx]
        je .conv
        add bx, 2
        jmp .LOOP
    .conv:
        mov al, [key+bx+1]
        ret

return:
    ret

main:
    call keyboard
    jmp main

times 510 - ($-$$) db 0
dw 0xAA55

它会检查按键情况,每次我按下一个键时,我都会将它保存到注册 al 然后想打印出来。

但它只是被保存的扫描码,我需要用 ASCII 字符替换它,我用数组“键”来做,但它不起作用,只打印出 1 个键,然后程序只是滞后。

【问题讨论】:

  • 当然,如果你按键它不会识别。你只有一个退出条件:当它找到与键码匹配的时候。如果没有,它将继续通过内存,直到找到一个。如果那段内存中没有一个,它将永远循环。
  • 我只按a和b..
  • 也许你想要一个字节数组 (db)?
  • 另外 0x9c for key b 听起来有点奇怪
  • 也许你应该考虑 256 字节长的表:scancode_to_ascii: db ascii_char_for_scancode_0, ascii_char_for_scancode_1, ... 然后转换将是:xor bx,bx mov bl,al mov al,[scancode_to_ascii+bx] ...顺便说一句,in 指令不会“等待”一些按键,所以你正在尝试打印“无扫描码”值。

标签: assembly ascii non-ascii-characters scancodes


【解决方案1】:

我通过分离 keydowns 和 keyups 来修复它 代码:

bits 16

org 0x7C00
mov cl, 0
start: jmp main

keydown: db 0x1e, 'a', 0x30, 'b'

keyup: db 0x9e, 'a', 0xb0, 'b'

print:
    mov ah, 0x0E
    int 0x10

keyboard:
    cli
    in al, 0x64
    test al, 1
    jz return
    test al, 0x20
    jnz return

    in al, 0x60

    cmp cl, 0
    je keypress
    jmp keyrelease

keyrelease:
    mov cl, 0
    sti
    ret

keypress:
    mov cl, 1
    call convert
    call print
    sti
    ret

convert:
    mov bx, 0
    .LOOP:
        cmp al, [keydown+bx]
        je .conv
        add bx, 2
        jmp .LOOP
    .conv:
        mov al, [keydown+bx+1]
        ret

return:
   ret

main:
    call keyboard
    jmp main

    times 510 - ($-$$) db 0
    dw 0xAA55

【讨论】:

  • 很高兴你解决了你的问题,但对于未来的读者,我不得不提一下,这是一个非常糟糕的方法来告诉 break 和 make 扫描码。测试扫描码的第 7 位(设置在“ketrelease”上)是唯一的方法。一些键发送多个扫描码!通常,此答案中的代码充其量也很笨拙。
  • 我知道这是糟糕的代码,我是汇编语言的新手,但感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
相关资源
最近更新 更多