[英]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.