0

問題
発見の質問ASMスキャンコードをASCII文字に置き換えてその答えを使用する(特殊文字をASCIIとしてではなく特定の値をバッファに移動するために少し変更された)キーボード入力から個々の文字を取得することができました。結合して 1 つの完全な文字列にしますか?

次のセクションの手順 1 を試行する
と、Enter キーが押されるまで入力が正しく出力されます。

しかし、stosbgets が追加されると、最初の文字を出力する前であってもそうしなくなります (手順 #2)。

#1

gets:
.repeat:
call keyboard
cmp byte[switch], 0x020 ; buffer named above being checked for Enter value
je .end
jmp .repeat
.end:
ret

#2

gets_modified:
mov di, buffer
.repeat:
call keyboard
cmp byte[switch], 0x020 ; buffer named above being checked for Enter value
stosb 
je .end
jmp .repeat
.end:
ret

期待される結果:バッファ内の文字列
実際の結果:なし

編集:コメントで要求された プロシージャキーボード

keydown: db 0x1E, 'a',0x30, 'b',0x2E, 'c',0x20, 'd',0x12, 'e',0x21, 'f',0x22, 'g',0x23, 'h',0x17, 'i',0x24, 'j',0x25, 'k',0x26, 'l',0x32, 'm',0x31, 'n',0x18, 'o',0x19, 'p',0x10, 'q',0x13, 'r',0x1F, 's',0x14, 't',0x16, 'u',0x2F, 'v',0x11, 'w',0x2D, 'x',0x15, 'y',0x2C, 'z',0x0B, '0',0x02, '1',0x03, '2',0x04, '3',0x05, '4',0x06, '5',0x07, '6',0x08, '7',0x09, '8',0x0A, '9',0x29, '~',0x0C, '-',0x0D, '=',0x2B, '\',0x1A, '[',0x1B, ']',0x27, '\59',0x28, '\39',0x33, ',',0x34, '.',0x35, '/'
keyup: db 0x9E, 'a', 0xB0, 'b', 0xAE, 'c', 0xA0, 'd', 0x92, 'e', 0xA1, 'f', 0xA2, 'g', 0xA3, 'h', 0x97, 'i', 0xA4, 'j', 0xA5, 'k', 0xA6, 'l', 0xB2, 'm', 0xB1, 'n', 0x98, 'o', 0x99, 'p', 0x90, 'q', 0x93, 'r', 0x9F, 's', 0x94, 't', 0x96, 'u', 0xAF, 'v', 0x91, 'w', 0xAD, 'x', 0x95, 'y', 0xAC, 'z', 0x8B, '0', 0x82, '1', 0x83, '2', 0x84, '3', 0x85, '4', 0x86, '5', 0x87, '6', 0x88, '7', 0x89, '8', 0x8A, '9', 0x89, '~', 0x8C, '-', 0x82, '=', 0xAB, '\', 0x9A, '[', 0x9B, ']', 0xA7, '\59', 0xA8, '\39', 0xB3, ',', 0xB4, '.', 0xB5, '/'
switch: db 0
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
    cmp al, 1Ch
    je .ent
    call convert
    mov ah, 0x0E
    int 0x10
    jmp .end
    .ent:
    mov byte[switch], 0x020
    .end:
    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

ほとんどがコピーされましたが、正しい値を持っているようで、問題の原因である可能性は低いです

4

0 に答える 0