汇编-用scanf in循环读取字符串仅读取一个字符串

时间:2018-12-11 13:43:18

标签: windows assembly x86 scanf

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

0 个答案:

没有答案