我需要在汇编中从命令行读取一堆字符串,但是似乎只发生了一次对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]