печать новых строк с помощью printf - PullRequest
3 голосов
/ 16 декабря 2011

Привет. Я пытаюсь написать ассемблерный код, который использует printf для печати заданной строки.Я объявляю свои строки перед использованием в разделе .data, и тестовый пример выглядит следующим образом:

extern printf
extern fflush

LINUX        equ     80H      ; interupt number for entering Linux kernel
EXIT         equ     60       ; Linux system call 1 i.e. exit ()

section .data
    outputstringfmt: db "%s", 0
    sentence0: db "Hello\nWorld\n", 0


segment .text
    global  main


main:
    mov r8, sentence0
    push r8
    call print_sentence
    add rsp, 8
    call os_return

print_sentence:
    push rbp
    mov rbp, rsp
    push r12
    mov r12, [rbp + 16]
    push rsi
    push rdi
    push r8
    push r9
    push r10
    mov rsi, r12
    mov rdi, outputstringfmt
    xor rax, rax
    call printf
    xor rax, rax
    call fflush
    pop r10
    pop r9
    pop r8
    pop rdi
    pop rsi
    pop r12
    pop rbp
    ret

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

Затем я компилирую следующим образом:

nasm -f elf64 test.asm; gcc -m64 -o test test.o

И, наконец, выполняю:

./test

Мой вывод выглядит следующим образом:

Hello\nWorld\n

Я действительно не хочу разбивать предложение 0 на следующее:

sentence0: db "Hello", 10, 0
sentence1: db "World", 10, 0

и затем вызыватьпечать дважды.Есть ли лучший способ сделать это?

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

Ответы [ 2 ]

10 голосов
/ 18 декабря 2011

NASM принимает строки в одинарных кавычках ('...') или в двойных кавычках ("..."), которые эквивалентны и не обеспечивают никаких выходов; или в кавычках (`...`), которые обеспечивают поддержку экранирования в стиле C, что вам и нужно.

(см. раздел 3.4.2, «Строки символов», в документации .)

Чтобы получить фактические символы новой строки ASCII в ваших данных в памяти, а не буквальную обратную косую черту n:

sentence0: db `Hello\nWorld\n`, 0

Или сделать это вручную:

sentence0: db 'Hello', 10, 'World`, 10, 0

YASM (еще один ассемблер синтаксиса NASM) не принимает обратные метки, поэтому здесь вы можете выбирать только вручную.

И, кстати, вы можете позвонить puts вместо printf, если у вас нет фактического форматирования в строке формата (пропустите завершающий перевод строки).

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

У вас есть новые строки (\ n) в строке для вывода.Они должны быть в формате строки, которые будут рассматриваться как переводы строки.Это решает половину вашей проблемы:

outputstringfmt: db "%s\n%s\n", 0
sentence0: db "Hello", 0
sentence1: db "World", 0

И что-то вроде этого должно печатать переводы строк после каждого слова:

outputstringfmt: db "%s", 0
sentence0: db "Hello", 10 , "World", 10 , 0
...