x86组装 - printf没有" \ n"

时间:2014-06-07 03:18:32

标签: linux assembly x86 printf

所以我很困惑。我正在阅读“从头开始编程”一书,并正在使用库。

只要我在字符串中包含“\ 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位库。

谢谢!

2 个答案:

答案 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?