所以我很困惑。我正在阅读“从头开始编程”一书,并正在使用库。
只要我在字符串中包含“\ n”,printf就可以正常工作,但如果没有它,它将完全打印出来。知道为什么会这样吗?
代码:
.section .data my_str: .ascii "Jimmy Joe is %d years old!\n\0" my_num: .long 76 .section .text .globl _start _start: pushl my_num pushl $my_str call printf movl $1, %eax movl $0, %ebx int $0x80
此外,当我使用-m elf_i386进行32位模式并使用-dynamic-linker /lib/ld-linux.so.2 -lc进行链接时,我收到警告
ld:在搜索-lc时跳过不兼容的/usr/lib64/libc.so
如果这有任何区别,或者是否有人建议如何直接加载32位库。
谢谢!
答案 0 :(得分:7)
问题是printf
默认只是将内容输入到stdout缓冲区。在刷新缓冲区之前,实际上不会打印任何内容。这取决于stdout的缓冲模式,但默认情况下,它是行缓冲的,这意味着每次打印换行符时都会刷新它。
要在C中明确刷新,请调用fflush;您可以使用
在asm代码中执行此操作pushl stdout
call fflush
addl $4, %esp
或者,您可以调用stdlib exit
函数(在实际退出之前刷新所有I / O缓冲区),而不是使用_exit
系统调用,而不是。{/ p>
答案 1 :(得分:0)
您似乎尝试将32位程序与(系统默认)64Bit c库链接。
检查是否安装了libs32软件包。
要找出程序或其他动态加载哪些库,请使用ldd <name_of_your_binary>
LD_LIBRARY_PATH
至于为什么需要换行,我只能推测它会刷新输出缓冲区。
另请参阅Why does printf not flush after the call unless a newline is in the format string?