2016-09-28 2 views
0

Ich habe diesen Code:ASM Ersetzen Scancodes mit ASCII-Zeichen

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 

Es ist für keypressess prüft und jedes Mal wenn ich eine Taste drücken, ich spare es al registrieren und dann wollen ausdrucken.

Aber es ist nur der scancode gespeichert und ich muss es mit ASCII-Zeichen ersetzen, ich mache das mit dem Array "key", aber es funktioniert nicht und druckt nur nur 1 Schlüssel und dann das Programm liegt nur nach.

+0

Natürlich, wenn Sie Tasten drücken sie nicht erkennt. Sie haben nur eine Ausstiegsbedingung: wenn sie eine Übereinstimmung für den Schlüsselcode findet. Wenn nicht, wird es durch die Erinnerung weiter und weiter gehen, bis es eins findet. Und wenn es in diesem Speichersegment keinen gibt, wird es für immer eine Schleife bilden. –

+0

Ich drücke nur a und b .. –

+3

Vielleicht möchten Sie ein Array von Bytes ('db')? –

Antwort

0

ich es durch die Trennung keydowns fixiert und keyups Der Code:

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 
+2

Ich bin froh, dass Sie Ihr Problem gelöst haben, aber für zukünftige Leser bin ich gezwungen zu erwähnen, dass dies eine sehr schlechte Methode ist, Breaks von make scancodes zu erzählen. Das Testen von Bit7 des Scancodes (gesetzt auf "ketrelease") ist der einzige Weg zu gehen. Ein Schlüssel sendet mehrere Scancodes! Im Allgemeinen ist der Code in dieser Antwort bestenfalls ungeschickt. –

+0

Ich weiß, dass es schlechter Code ist, ich bin neu in Assembler, aber danke für Ihre Hilfe! –