2

我对汇编相当陌生,并试图从标准输入中读取一个值(从 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

这里出了什么问题?

4

1 回答 1

5

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

在从. -4(%ebp)_%eaxinout()

于 2013-09-23T14:50:40.257 回答