汇编EAX寄存器表现奇怪

时间:2013-09-23 14:45:43

标签: assembly x86

我对汇编很新,并尝试从标准输入读取值(从C调用scanf函数)并将其打印回标准输出(使用printf)。


.text
readstr:    .asciz "%d"     #string used for calling scanf
printstr:   .asciz "%d\n"   #string used for calling printf

.global main

main:   movl    %esp, %ebp  #initialize base pointer
    call    inout

    pushl   %eax
    pushl   $printstr
    call    printf

    pushl   $0      #push exit code to stack
    call    exit    #exit with the exit code

inout:  pushl   %ebp
    movl    %esp, %ebp

    subl    $4, %esp
    leal    -4(%ebp), %eax
    pushl   %eax
    pushl   $readstr
    call    scanf

    movl    %ebp, %esp
    popl    %ebp
    ret

预期输出与输入的数字相同,但输出总是

1

注意:在64位suse linux企业桌面上编译,使用gcc -m32 -o inout inout.s

这里出了什么问题?

1 个答案:

答案 0 :(得分:5)

致电scanf()后,%eax包含该功能的返回值,即the number of input items assigned。在你的情况下,这总是1,因为总有一个输入项。

在从-4(%ebp)返回之前,您需要将值%eax放入inout()