Как объединить символы в строку один за другим в NASM? - PullRequest
0 голосов
/ 05 мая 2019

Проблема
Обнаружение вопроса 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

Ожидаемый результат: Строка в буфере
Фактический результат: Нет

EDIT: Процедура клавиатура запрашивается в комментариях

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

В основном он был скопирован, но, похоже, имеет правильное значение и вряд ли является причиной проблемы

...