我最近读到了一篇关于在汇编中使用printf和scanf的文章:
特别是它说:“在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汇编语言。
提前感谢!
fflush
接受一个 FILE* 类型的参数(存储在 RDI 中)。如果你想传递一个 NULL 指针(表示刷新所有打开的流),你需要将 RDI 清零,而不是 RAX;或者你需要mov rdi, [rel stdout]
来加载特定全局变量的值。fflush
不是可变参数函数,因此它不关心 AL 的值。(编辑:我会自己修复这个问题) - Peter Cordescall exit
退出程序,而不是使用原始的 _exit 系统调用。 - Peter Cordes