Printf без новой строки в сборке - PullRequest
6 голосов
/ 14 декабря 2011

Я недавно читал эту статью об использовании printf и scanf в сборке:

Значение intfmt: дБ "% d", 10, 0 в сборке

В частности, это говорит "В 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.

Заранее спасибо!

Ответы [ 4 ]

3 голосов
/ 14 декабря 2011

В FASM

push [_iob]
call [fflush] 

Для фолка NASM

extern fflush
extern stdout
...
push dword [stdout]
call fflush
add esp, 4
etc...
3 голосов
/ 16 декабря 2011

Правильный ответ на мой вопрос, как предлагает BasileStarynkevitch в комментарии выше. Мне нужно было добавить в мой код:

extern fflush
...
xor rax, rax
call fflush
...
3 голосов
/ 14 декабря 2011

Позвоните fflush(stdout);, чтобы показать, что в данный момент находится в буферах.

1 голос
/ 16 декабря 2011

Другая возможность - удалить буферизацию строки по умолчанию для потока stdout.Здесь C призывают сделать это.Перевод в сборку, пусть как упражнение, поскольку я не думаю, что имеет смысл даже делать файловый / потоковый ввод / вывод в ASM, цена / выгода чрезвычайно неправильна.

setvbuf(stdout, NULL, _IONBF, 0);

Таким образом, каждый printffputs, putc, puts и т. д.) будут иметь неявное значение fflush

...