2016-04-19 3 views
0

У меня есть следующий код, который печатает количество параметров, переданных ./main. Обратите внимание на fmt в разделе rodata. Я включил новую линию \n, так же, как в C, но вместо того, чтобы печатать новую строку, она печатает:Сборка: printf not printing new line

Количество параметров: 1 \ п

Мой код:

;main.asm 
GLOBAL main 
EXTERN printf 

section .rodata: 
fmt db "Number of parameters: %d \n", 0 

section .text: 

main: 

    push ebp 
    mov ebp, esp ;stackframe 

    push dword[ebp+8]  ;prepara los parametros para printf 
    push fmt 
    call printf 
    add esp, 2*4 

    mov eax, 0  ;return value 

    leave   ;desarmado del stack frame 
    ret 

Я знаю, что в том числе 10 до 0, и после того, как «Количество ...» в fmt будет печатать, но я хочу printf, чтобы сделать это. Я собираю код с NASM, а затем свяжу его через GCC, чтобы создать свой исполняемый файл.

+1

Вы не компилируете такой код ассемблера, а используете _assembler_. И вы не «компилируете» результирующий объектный файл, а _link_ it. Во всяком случае, это не связано с gcc и, наконец, не с C-языком. Не добавляйте несвязанные теги. – Olaf

ответ

4

При использовании кавычки или двойные кавычки строки в NASM, он не принимает C стиль управляющие последовательности. В Linux вы можете кодировать \n, как ASCII 10, как это:

fmt db "Number of parameters: %d", 10, 0 

Существует альтернатива. NASM поддерживает обратные кавычки (backticks), которые позволят NASM обрабатывать символы между ними как C escape-последовательности стиля. Это должно работать, а также:

fmt db `Number of parameters: %d \n`, 0 

Пожалуйста, обратите внимание: Это не одиночные кавычки, но обратные кавычки. Это описано в NASM documentation:

3.4.2 Строки символов

Строка символов состоит из восьми символов, заключенных в одинарные кавычки («...»), двойные кавычки (».. . ") или обратные кавычки (...). Одиночные или двойные кавычки эквивалентны NASM (за исключением того, что окружающая константа с одинарными кавычками допускает появление в ней двойных кавычек и наоборот); содержание которых представлено дословно. Строки, заключенные в backquotes, поддерживают стили C-стиля для специальных символов.

+0

Обратите внимание, что версия YASM для синтаксиса NASM не поддерживает строковые литералы с обратными кавычками. Я не думаю, что у YASM есть способ написать строковые константы с escape-последовательностями. Это имеет значение только в том случае, если вы заботитесь о ясности, а также о самом официальном прошлом. –

+0

@PeterCordes: оригинальный вопрос в последнем абзаце сказал _NASM_, мой ответ для _NASM_. Если бы я имел в виду _YASM_, я бы сказал это. _YASM_ не _NASM_ таким же образом _TASM_ не _MASM_ ..Если бы речь шла о синтаксисе GAS, YASM, MASM (и других вариантах, некоторые из которых разделяют некоторые функции, а не другие), я бы предоставил ответ, который бы их охватил. Если вы хотите получить ответ, который охватывает каждый ассемблер на рынке, и варианты будут моим гостем. –

+0

Я не утверждал, что ваш ответ был неполным или что вы должны были упомянуть об этом. Я просто подумал, что это интересное дополнение, поскольку YASM почти полностью совместим с синтаксисом NASM. –

3

Ассемблер не является C. Компилятор C понимает \ n как escape-код для ASCII 10. Ассемблер не выполняет и обрабатывает его как два символа. Добавьте 10, как вы описали.