簡體   English   中英

x86匯編-如果沒有“ \\ n”,printf不會打印

[英]x86 Assembly - printf doesn't print without “\n”

所以我很困惑。 我正在閱讀《從頭開始編程》一書,並正在使用庫。

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

另外,當我在32位模式下使用-m elf_i386和-dynamic-linker /lib/ld-linux.so.2 -lc進行鏈接時,會收到警告

ld:搜索-lc時跳過不兼容的/usr/lib64/libc.so

如果這樣做有什么區別,或者有人對如何直接加載32位庫有任何建議。

謝謝!

問題在於,默認情況下, printf僅將內容打印到標准輸出緩沖區中。 在刷新緩沖區之前,實際上不會打印任何內容。 取決於stdout的緩沖模式,但是默認情況下,它是行緩沖的,這意味着每次您打印換行符時都會刷新它。

要在C中顯式刷新,請調用fflush。 您可以在asm代碼中使用

pushl stdout
call fflush
addl $4, %esp

或者,您可以調用stdlib exit函數(該函數在實際退出之前先刷新所有I / O緩沖區),而不是使用_exit系統調用(不這樣做)。

似乎您嘗試將32位程序與(系統默認值)64Bit c庫鏈接。 檢查是否安裝了libs32軟件包。 要查找程序或其他程序動態加載了LD_LIBRARY_PATH的庫,請使用ldd <name_of_your_binary>至於為什么需要換行符,我只能推測它會刷新輸出緩沖區。 另請參見為什么在調用后printf不會刷新,除非格式字符串中包含換行符?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM