Сборка - чтение строк с циклом scanf читает только одну строку - PullRequest
0 голосов
/ 11 декабря 2018

Мне нужно прочитать несколько строк из командной строки в сборке, однако, кажется, имеет место только один вызов scanf.Я уверен, что проблема связана с форматом scanf.Если я заменю то, что у меня есть, на простой "%s", он будет работать нормально, я должен прочитать целые строки, включая пробелы, поэтому "%s" не сработает."%[^c]s" должен продолжать читать символы до тех пор, пока не встретится c, но есть две проблемы с этим:

  1. Я на самом деле должен ввести символы \ и n для сканированиядо остановки.

  2. Как я уже сказал, он читает только одну строку.После этого все подсказки для оставшихся строк мгновенно печатаются в конце программы.

Я видел, что люди обычно предлагают использовать fread, однако я не совсем уверенкак получить доступ к stdin в сборке.

Вот мой код:

bits 32

global start        

extern exit, scanf, printf   
import exit msvcrt.dll   
import scanf msvcrt.dll
import printf msvcrt.dll

segment data use32 class=data
    msg DB "Enter a value for n", 13, 10, 0
    s_msg DB "Enter a string", 13, 10, 0
    n_format DB "%d", 0
    s_format DB "%[^\n]s", 0

segment bss use32 class=bss
    n DD 0
    s RESB 1000

segment code use32 class=code
    start:
        push    dword msg 
        call    [printf]
        add     ESP, 4 * 1

        push    dword n
        push    dword n_format
        call    [scanf]
        add     ESP, 4 * 2

        mov     ECX, [n]

        read_strings:
            pushad

            push    dword s_msg
            call    [printf]
            add     ESP, 4 * 1

            push    dword s
            push    dword s_format
            call    [scanf]
            add     ESP, 4 * 2

            popad
        loop    read_strings

        push    dword 0  
        call    [exit]      
...