我对汇编很新,并尝试从标准输入读取值(从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
这里出了什么问题?
答案 0 :(得分:5)
致电scanf()
后,%eax
包含该功能的返回值,即the number of input items assigned。在你的情况下,这总是1
,因为总有一个输入项。
在从-4(%ebp)
返回之前,您需要将值%eax
放入inout()
。