Ошибка сборки - ожидается инструкция при записи строки

При написании простейшей сборки для шеллкода я написал этот код

BITS 64
global _start
section .data
_start:
  ;ssize_t write(int fd, const void *buf, size_t count);
  ;rax = 1

jmp poziv

vracajse:
xor rsi,rsi
pop rsi
xor rax,rax
mov al,1 ; were calling write
;The parameters are in rdi, rsi, rdx, r10, r8, r9. in that order
xor rdi,rdi ;
xor rcx,rcx ; need low 8 bytes dont want null in machine code
mov cl,1
mov edi,ecx ; edi =1 writing to stdout
xor rdx,rdx
mov dl,15 ; were writing 15 chars
syscall

poziv:
call vracajse

poruka:
.ascii "Pozdrav svete!\n"

и получил следующую ошибку

writing_2nd_try.nasm:28: error: parser: instruction expected

Почему он говорит мне, что мой код poruka: .ascii «Некоторая строка» не является допустимой инструкцией (метка и сообщение), но если я напишу ее как db, тогда все в порядке.

(Мне также интересно, если я пишу данные .section вместо раздела .data, я получаю следующие ошибки

writing_2nd_try.nasm:3: error: attempt to define a local label before any non-local labels
writing_2nd_try.nasm:3: error: parser: instruction expected

)

Я новичок во всем этом, но я думал, что знаю, что делаю.


person daniels_pa    schedule 11.08.2013    source источник
comment
Добро пожаловать в Stackoverflow, сайты pastebin здесь не одобряются, так как контент доступен только временно   -  person Uku Loskit    schedule 11.08.2013


Ответы (1)


Почему он говорит мне, что мой код poruka: .ascii "Some string" не является допустимой инструкцией (метка и сообщение), но если я напишу его как db, тогда все в порядке.

Синтаксис и директивы различаются в зависимости от ассемблера. .ascii — это директива, распознаваемая ассемблером GNU, но с NASM вместо нее вы используете db (объявление байта), как вы уже обнаружили.

(Мне также интересно, если я пишу данные .section вместо раздела .data, я получаю следующие ошибки

Потому что section — это директива, распознаваемая NASM, а .section — нет. Таким образом, NASM считает, что вы объявляете локальную метку с именем section (имена меток, начинающиеся с точки, считаются локальными в синтаксисе NASM). Таким образом, NASM видит локальную метку с именем section, за которой следует слово data, что не имеет смысла.

person Michael    schedule 11.08.2013
comment
Помимо использования db, Nasm позволит вам заключать строку в одинарные, двойные или обратные кавычки (символ, который мы используем здесь для обозначения code). Обратные кавычки, но не две другие, позволят Nasm распознавать \n и другие управляющие последовательности C-ish. В противном случае вы просто увидите \n как текст. - person Frank Kotler; 12.08.2013