2011-12-14 43 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