2011-12-16 3 views
2

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

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 

Я действительно не хочу, чтобы разделить sentence0 на следующие:

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

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

Заранее благодарен!

+0

лучший способ сделать то, что именно? –

+0

Я не хочу разбить строку на несколько объявлений строк. Я просто хочу иметь возможность печатать новые строки как часть строки и только объявлять ее в предложении0. –

+0

Вы говорите, что \ n: s напечатаны дословно? –

ответ

9

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

(см section 3.4.2, "Character Strings", in the documentation.)

Итак, попробуйте:

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

Это исправляет его! –

3

У вас есть строки новой строки (\ 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 
+0

У меня нет контроля над тем, где будут появляться новые строки в строке, это был всего лишь тестовый пример. Я пробовал использовать printf в C, и вам не нужно указывать новые строки в формате, и все еще кажется, что они отлично справляются с ними. Мне было интересно, почему моя сборка тоже не справляется с ними? –

+0

Может быть чувствительным к реализации. Я не знаю, как это должно «вести себя». –

+0

компилятор C переводит \ n в один символ 0xA. это синтаксический анализатор в компиляторе, а не printf. Разберите то, что nasm производит, и, возможно, есть возможность для nasm анализировать, как компилятор C, а не как ассемблер. –

Смежные вопросы