Printf在装配时没有换行符

时间:2011-12-14 10:29:09

标签: c assembly newline printf nasm

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

Meaning of intfmt: db "%d", 10, 0 in assembly

特别是它说 “在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

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

我正在使用NASM汇编语言。

提前致谢!

4 个答案:

答案 0 :(得分:3)

调用fflush(stdout);以显示当前位于缓冲区中的内容。

答案 1 :(得分:3)

在FASM中

push [_iob]
call [fflush] 

对于NASM民间

extern fflush
extern stdout
...
push dword [stdout]
call fflush
add esp, 4
etc...

答案 2 :(得分:3)

我的问题的正确答案是BasileStarynkevitch在上面的评论中提出的。 我需要添加到我的代码中:

extern fflush
...
xor rax, rax
call fflush
...

答案 3 :(得分:1)

另一种可能性是删除stdout流的默认行缓冲。这里是C调用来做到这一点。翻译到汇编作为练习,因为我认为在ASM中进行文件/流I / O甚至没有意义,成本/收益是非常错误的。

setvbuf(stdout, NULL, _IONBF, 0);

这样每个printf(以及fputsputcputs等......)都会隐含fflush