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

については

3

fflush(stdout);を呼び出して、現在バッファにあるものを表示します。 NASM民俗

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

を持っているでしょうか?私はアセンブリでそれを呼び出す方法を探しています。 –

+0

C標準では、 'stdout'は' FILE * '型の式に展開されるマクロです。私はそれがあなたのコンパイラでどのように定義されているのか分かりません。 'stdio.h'から値を抽出する必要があります。 –

+3

'fflush(NULL)'を呼び出すことができます。これはおそらく 'xor%eax、%eax;コールfflush' –

3
FASM

push [_iob] 
call [fflush] 

BasileStarynkevitchは、上記のコメントで示唆するように、私の質問に対する正しい答えがあります。 私は自分のコードに追加する必要:

extern fflush 
... 
xor rax, rax 
call fflush 
... 
+0

NASMでこれをどのように達成しますか?それは同じですか? –

1

他の可能性はstdoutストリームのデフォルトのラインバッファリングを取り除くことであろう。ここでそれを行うCの呼び出し。アセンブリへの変換は、ASMでファイル/ストリームI/Oを行うのが理にかなっているとは思わないので、コスト/メリットは非常に間違っています。

setvbuf(stdout, NULL, _IONBF, 0); 

この方法で、すべてのprintf(およびfputsputcputsなどが...)私はCの構文だと思う暗黙のfflush