x86程序集 - 如果没有"\n",printf不会打印

Bit*_*ani 1 linux x86 assembly printf

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

printf工作得很好,只要我在字符串中包含一个"\n",但如果没有它,它将完全没有打印.

知道为什么会这样吗?

码:

.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位库有任何建议.

谢谢!

Chr*_*odd 7

问题是printf默认情况下只是将东西打印到stdout缓冲区.在刷新缓冲区之前,实际上不会打印任何内容.这取决于stdout的缓冲模式,但是,默认情况下,它是行缓冲的,这意味着每次打印换行符时都会刷新它.

要在C中明确刷新,请调用fflush; 你可以用asm代码做到这一点

pushl stdout
call fflush
addl $4, %esp
Run Code Online (Sandbox Code Playgroud)

或者,您可以调用stdlib exit函数(在实际退出之前刷新所有I/O缓冲区),而不是使用_exit系统调用.