Ia32汇编中的scanf错误 - 获得2个字符,第二个为空

时间:2015-12-13 18:47:53

标签: assembly scanf ia-32

在尝试从用户那里获取2个字符时(单独),我遇到了下一个问题:第一个字符按预期接收,但第二个字符串始终为NULL。 第二个scanf的返回值是0,这意味着它确实没有收到任何东西。

这是代码:

    addl    $-4, %esp                   
    pushl   %ebx        #input goes to ebx
    pushl   $charInputFormat
    call    scanf
    addl    $8, %esp            
    movl    (%ebx), %ebx


    #get newChar
    addl    $-4, %esp           
    pushl   %esi        #input goes to esi
    pushl   $charInputFormat
    call    scanf
    addl    $8, %esp            
    movl    (%esi), %esi

当:

charInputFormat: .string " %c"

有人可以说出问题是什么吗?谢谢!

1 个答案:

答案 0 :(得分:1)

您的addl $-4, %esp非常可疑。你想对那些做什么?为输入分配空间?然后,您需要将该位置的地址传递给scanf。实际上,ebxesi未初始化并指出who-know-where(除非您在未显示的代码中初始化它们)。可能ebx偶然指向charInputFormat,并在第二次scanf来电之前覆盖它。

此代码在这里工作正常:

.globl main
main:
    subl    $4, %esp            # space for input

    pushl   %esp                # pointer to 1st char
    pushl   $charInputFormat    # pass as argument
    call    scanf
    addl    $8, %esp

    leal    1(%esp), %eax       # pointer to 2nd char
    push    %eax                # pass as argument
    pushl   $charInputFormat
    call    scanf
    addl    $8, %esp

    movb    (%esp), %al         # first input
    movb    1(%esp), %dl        # second input

    push %edx
    push %eax
    push $outputFormat
    call printf

    addl $16, %esp              # restore stack
    ret

.data
charInputFormat: .string " %c"
outputFormat: .string "Got %c and %c\n"