LINUX.ORG.RU

fasm

 , ,


0

1

Добрый день. У меня возник вопрос по ассемблеру FASM. Суть в том, что я не могу нагуглить команду executable. Вот пример использования (нашел в example) :

  format ELF64 executable 3

Насколько я понял format - обозначение формата выходящего файла. А вот с executable не разберусь. Что оно делает и зачем параметр 3 ?


flat assembler 1.71 Programmer's Manual

To create executable file, follow the format choice directive with the executable keyword and optionally the number specifying the brand of the target operating system (for example value 3 would mark the executable for Linux systems).

d ★★★★
()

в мануале же написано

Harald ★★★★★
()
Ответ на: комментарий от Kenny

Англюцкий не по мне

Тогда что ты делаешь в программировании?

stormblastt ★★★
()
Ответ на: комментарий от Kenny

1. директива db (define/data byte) говорит положить указанные байты сразу после всего, что написано в файле выше. Чтобы руками не считать, сколько байт заняли данные выше, используется метка msg, которой ассемблер присваивает значение, равное смещению начала этих байт.

2. $ имеет значение текущего смещения. Так как после 'Hello world',0xa никаких данных положено не было, то значение $ будет больше msg как раз на длину строки. Тогда длина строки msg_size равна разности $-msg.

Вот более подробный вариант твоего кода:

msg:
msg_begin:
db 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21, 0x0A
msg_end:
msg_size = msg_end - msg_begin

При этом msg == msg_begin, т.к. между ними никаких данных не объявлено.

d ★★★★
()
Ответ на: комментарий от Kenny

В бинарник попадают только код (mov, sub, ...) и данные (db, dw, ...).

Размер данных легко вычисляется: db — байт, dw — два байта и так далее. Размер каждой инструкции (mov, sub, ...) не столь очевиден, но тоже фиксирован. У каждой инструкции свой.

1. Допустим, у тебя выше в файле уже был какой-то код и немного данных, всего 234 байта.

2. Ты ставишь метку msg и ассемблер запоминает: msg = 234. Текущее смещение $ пока тоже равно 234.

3. Потом ты пишешь db 'Hello world!',0xA, и ассемблер добавляет в бинарник эти байты в текущую позицию, т.е. начиная со смещения 234. На колво записанных байт увеличивается и текущее смещение, теперь $ = 247.

msg db 'Hello world!',0xA суть сокращение и есть не что иное, как синтаксический сахар. По факту оно выгляддит так:

msg:
db 'Hello world!',0xA
А в бинарник попадёт только
0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x21, 0x0A

3. Директивой db ты сказал ассемблеру дописать в файл свою строку. Значит, текущее смещение в файле увеличилось на длину строки. Ты не знаешь её, но знаешь смещение после записи строки (текущее, хранится в $) и смещение до записи (сохранилось в метке msg). Тогда размер записанных директивой db 'Hello world!',0xA данных равен $-msg == 247-234 = 13.

d ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.