2013-11-14 6 views
3

Этот фрагмент кода отпечатков Привет на экранеASM Printf странное поведение

.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 

Но если я удалю «\ п» из строки приветствия, например:

.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 

Программа не работает , Какие-либо предложения?

+1

Define _ "Безразлично «работа» _. – Michael

+1

Не печатает "Hello" – Dima

+0

Вы уверены, что это не просто перезаписывается приглашением вашей оболочки? Что делать, если вы используете очень длинную строку (но все же без '\ n')? – Michael

ответ

6

Выходной столбец выхода (эквивалент _exit в C) не очищает буфер stdout.

Вывод строки новой строки приводит к потоку в потоках с линейной буферизацией, который будет иметь значение stdout, если он указывает на терминал.

Если вы хотите позвонить printf в libc, вам не следует плохо звонить по телефону exit таким же образом. Наличие int $0x80 в вашей программе не делает вас голой грязью.

Как минимум вам нужно до push stdout;call fflush перед выходом. Или push $0;call fflush. (fflush(NULL) вымывает все выходные потоки)

3

Вы должны очистить аргументы, которые вы прошли в printf, а затем смывать выходной буфер, так как вы не имеете новую строку в строку:

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

    push $hello 
    push $format 
    call printf 
    addl $8, %esp 
    pushl stdout 
    call fflush 
    addl $4, %esp 
    movl $1, %eax #exit 
    movl $0, %ebx 
    int $0x80 
Смежные вопросы