汇编EAX寄存器表现奇怪

rch*_*out 2 x86 assembly

我对汇编很新,并试图从标准输入读取一个值(从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
Run Code Online (Sandbox Code Playgroud)

预期输出与输入的数量相同,但输出始终为

1
Run Code Online (Sandbox Code Playgroud)

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

这里出了什么问题?

NPE*_*NPE 5

调用后scanf(),%eax包含函数的返回值,即返回的输入项数.在你的情况下总是如此1,因为总有一个输入项.

您需要在返回之前将值-4(%ebp)放入.%eaxinout()