Printf在装配时没有换行符

Sar*_*all 6 c assembly printf newline nasm

我最近阅读了有关在汇编中使用printf和scanf的这篇文章:

intfmt的含义:db"%d",10在程序集中

特别是它说"在printf中,换行符打印换行符然后(如果输出处于行缓冲模式,它可能是),刷新内部输出缓冲区,以便您可以实际看到结果.所以当你删除10 ,没有同花顺,你看不到输出."

但是,如果我在汇编文件中输出后不想要换行,我不知道该怎么办.这是一个简单的测试文件,我写的是尝试打印而没有换行:

extern printf


LINUX        equ     80H      ; interupt number for entering Linux kernel
EXIT         equ     60       ; Linux system call 1 i.e. exit ()




section .data
    int_output_format: db "%ld", 0


segment .text
    global  main


main:
    mov r8, 10
    push rdi
    push rsi
    push r10
    push r9
    mov rsi, r8
    mov rdi, int_output_format
    xor rax, rax
    call printf
    pop r9
    pop r10
    pop rsi
    pop rdi
    call os_return      ; return to operating system


os_return:
    mov  rax, EXIT      ; Linux system call 1 i.e. exit ()
    mov  rdi, 0     ; Error code 0 i.e. no errors
    syscall     ; Interrupt Linux kernel 64-bit
Run Code Online (Sandbox Code Playgroud)

但正如我读过的那篇文章所暗示的那样,stdout没有被刷新.我想也许我输出数字后需要以某种方式冲洗?但我真的不确定.

我正在使用NASM汇编语言.

提前致谢!

Sar*_*all 6

fflush()在行或全缓冲 stdio 流中刷新缓冲输出:

extern fflush
...
xor  edi, edi          ; RDI = 0
call fflush            ; fflush(NULL) flushes all streams
...
Run Code Online (Sandbox Code Playgroud)

或者,mov rdi, [stdout]/call fflush也可以仅刷新该流。(default rel用于高效的 RIP 相对寻址,您也需要extern stdout。)