Мне нужно прочитать несколько строк из командной строки в сборке, однако, кажется, имеет место только один вызов scanf
.Я уверен, что проблема связана с форматом scanf.Если я заменю то, что у меня есть, на простой "%s"
, он будет работать нормально, я должен прочитать целые строки, включая пробелы, поэтому "%s"
не сработает."%[^c]s"
должен продолжать читать символы до тех пор, пока не встретится c
, но есть две проблемы с этим:
Я на самом деле должен ввести символы \
и n
для сканированиядо остановки.
Как я уже сказал, он читает только одну строку.После этого все подсказки для оставшихся строк мгновенно печатаются в конце программы.
Я видел, что люди обычно предлагают использовать 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]