我最近阅读了有关在汇编中使用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汇编语言。
提前致谢!
答案 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
(以及fputs
,putc
,puts
等......)都会隐含fflush