2011-12-14 44 views
6

换行符我最近读到这篇文章在装配用printf和scanf:printf的没有装配

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汇编语言。

在此先感谢!

回答

3

我的问题的正确答案是BasileStarynkevitch的意见提出以上。 我需要添加到我的代码:

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

拨打fflush(stdout);显示当前坐在缓冲区中的内容。

+0

我认为这是C语法?我正在寻找如何在装配中调用它。 – 2011-12-14 10:41:28

+0

根据C标准,`stdout`是一个扩展为`FILE *`类型表达式的宏。我不知道它是如何在你的编译器中定义的。你需要从`stdio.h`中提取值。 – 2011-12-14 11:43:01

3

在FASM

push [_iob] 
call [fflush] 

对于NASM民间

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

的另一种可能性是,除去stdout流的默认的行缓冲。这里的C调用来做到这一点。因为我认为在ASM中执行文件/流I/O是不合理的,所以成本/收益是非常错误的。

setvbuf(stdout, NULL, _IONBF, 0); 

这样每printf(和fputsputcputs等)将有一个隐含的fflush