在AT&;中调用printf和scanf;T组件

在AT&;中调用printf和scanf;T组件,c,assembly,printf,scanf,att,C,Assembly,Printf,Scanf,Att,我有以下代码: .align 32 .data input1: .string "Give short: \n" input2: .string "Give char: \n" arg1: .string "%hu" arg2: .string "%c" output1: .string "%hu\n" output2: .string "%c\n" short: .short 1 char: .byte 1 .global main main: pushl %ebp movl %esp,

我有以下代码:

.align 32

.data
input1: .string "Give short: \n"
input2: .string "Give char: \n"
arg1: .string "%hu"
arg2: .string "%c"
output1: .string "%hu\n"
output2: .string "%c\n"
short: .short 1
char: .byte 1

.global main

main:
pushl %ebp
movl %esp, %ebp

pushl $input1
call printf
addl $4, %esp

pushl $short
pushl $arg1
call scanf
addl $8, %esp

pushl (short)
pushl $output1
call printf
addl $8, %esp

pushl $input2
call printf
addl $4, %esp

pushl $char
pushl $arg2
call scanf
addl $8, %esp

pushl (char)
pushl $output2
call printf
addl $8, %esp

movl %ebp, %esp
popl %ebp
ret

我想输入short,打印它,输入char并打印它,但是在打印'Give char'后,程序结束,留下两行空白。你知道为什么吗?当我在一个函数调用中得到参数时,它就工作了。

这是一个直接的C问题,与汇编代码无关。您可能应该再次阅读
scanf
文档。它只处理任何可以转换为数字的初始部分,其余的输入留在缓冲区中。对于行为良好的输入,这只是终止换行符,但可以是任何内容。然后,与所有其他转换相反,
%c
不会自动跳过空白,因此它将愉快地从缓冲区接受换行符。解决方案:在格式说明符之前显式添加空格将使
scanf
跳过空白。注意,您仍然可以在一行中提供输入。如果您不想这样做,则需要手动放弃该行的其余部分,或读取该行