3

このコードは、Hello を画面に出力します。

.data
    hello: .string "Hello\n"
    format: .string "%s" 
.text
    .global _start 
    _start:

    push $hello
    push $format
    call printf

    movl $1, %eax   #exit
    movl $0, %ebx
    int $0x80

しかし、hello 文字列から '\n' を削除すると、次のようになります。

.data
    hello: .string "Hello"
    format: .string "%s" 
.text
    .global _start 
    _start:

    push $hello
    push $format
    call printf

    movl $1, %eax   #exit
    movl $0, %ebx
    int $0x80

プログラムが動作しません。助言がありますか?

4

2 に答える 2

6

exit syscall (C の と同等_exit) は stdout バッファーをフラッシュしません。

改行を出力すると、ラインバッファリングされたストリームでフラッシュが発生します。これは、端末を指している場合の stdout になります。

libcを呼び出す意思がある場合は、同じ方法でprintf呼び出すことに気を悪くする必要はありません。exitプログラムに が含まれていても、ベアメタルint $0x80のワルにはなりません。

少なくともpush stdout;call fflush終了する前に必要です。またはpush $0;call fflush。(fflush(NULL)すべての出力ストリームをフラッシュします)

于 2013-11-14T16:37:05.157 に答える