首页 > 解决方案 > 如何在 NASM 中将字符一个接一个地组合成一个字符串?

问题描述

问题
发现问题ASM 用 ASCII 字符替换扫描码并使用它的答案(稍作修改以将特殊字符视为 ASCII,而是将特定值移动到缓冲区)我能够从键盘输入中获取单个字符,怎么可能然后组合成一个完整的字符串?

尝试
下一节中的过程 #1 工作并正确输出输入,直到它捕获 Enter 按键

但是当stosb被添加时,它甚至在输出第一个字符之前就停止这样做(过程#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

它大部分被复制了,但它似乎具有正确的价值,并且不太可能是问题的原因

标签: assemblyspecial-charactersnasmscancodes

解决方案


推荐阅读