Fasm

Материал из Википедии — свободной энциклопедии
Это старая версия этой страницы, сохранённая 217.65.240.234 (обсуждение) в 08:36, 2 апреля 2007 (Формат выходных файлов). Она может серьёзно отличаться от текущей версии.
Перейти к навигации Перейти к поиску
Fasm
Файл:Fasmw.gif
Тип компилятор, линкер
Разработчик Tomasz Grysztar
Написана на язык ассемблера
Операционные системы dos, win, linux, bsd
Первый выпуск 1999
Последняя версия 1.67.18 (27 декабря 2006)
Репозиторий github.com/tgrysztar/fasm
Лицензия GNU GPL
Сайт flatassembler.net

Fasm (Flat Assembler) — свободно распространяемый многопроходной ассемблер, написанный Приваловым (псевдоним Tomasz Grysztar). Fasm написан на самом себе, обладает небольшими размерами и очень высокой скоростью компиляции, имеет богатый и ёмкий макро-синтаксис, позволяющий автоматизировать множество рутинных задач. Поддерживаются как объектные форматы, так и форматы исполняемых файлов. Это позволяет в большинстве случаев обойтись без линковщика. Однако в некоторых случаях без него не обойтись. В этом случае нужно использовать сторонние линковщики, поскольку линковщик вместе с Fasm’ом не распространяется.

Помимо базового набора инструкций процессора и сопроцессора fasm поддерживает наборы инструкций MMX, SSE, SSE2, SSE3 и 3DNow!, а также AMD64.

Компиляция программы в Fasm’e состоит из 2 стадий: препроцессирование и ассемблирование.

Препроцессирование

На стадии препроцессора раскрываются все макросы, символические константы обрабатываются директивы препроцессора.

В отличие от стадии ассемблирования, препроцессирование выполняется только 1 раз. Смешивание стадий ассемблирования и препроцессирования — распространенная ошибка начинающих.

Ассемблирование

На стадии ассемблирования определяются адреса меток, обрабатываются условные директивы, раскрываются циклы и генерируется собственно программа. Fasm — многопроходной ассемблер, что позволяет ему делать некоторую оптимизацию, например, генерирование короткого перехода на метку вместо длинного. Во время прохода компилятор не всегда может вычислить выражение в условных директивах. В этом случае он делает какой-нибудь выбор и пытается скомпилировать дальше. Благодаря тому, что вычисленные адреса меток на N-ном проходе используется на N+1-проходе, это процесс обычно сходится.

Формат записи инструкций

Используется Intel-синтаксис записи инструкций.

Единственное существенное отличие от формата, принятого в других ассемблерах (MASM, TASM) — значение ячейки памяти всегда записывается как [label_name], а просто label_name означает адрес (то есть порядковый номер) ячейки. Это позволяет обходится без ключевого слова offset. Также в fasm’e при переопределении размера операнда вместо byte ptr пишется просто byte, вместо word ptrword и т. д. Не позволяется использовать несколько квадратных скобок в одном операнде, таким образом вместо [bx][si] необходимо писать [bx+si]. Эти изменения синтаксиса привели к более унифицированному и легкому для прочтения коду.

Пример программы

Это пример Windows - программы Hello world, которая выводит это знаменитое сообщение и завершается:

format PE
entry start
include 'win32a.inc'

mes db 'Hello, World!',0

start:
  invoke MessageBox,HWND_DESKTOP,mes,mes,MB_OK
  invoke ExitProcess,0

data import
  library kernel, 'kernel32.dll', \
          user, 'user32.dll'

  import kernel, ExitProcess, 'ExitProcess'
  import user, MessageBox, 'MessageBoxA'
end data     

Или так:

include 'win32ax.inc'
main:
  invoke MessageBox,HWND_DESKTOP,'Hello, World!','Fasm message box:',MB_OK
  invoke ExitProcess,0
.end main

Более усложненный вариант, с уточнением секций в PE файле:

format PE
entry start
include 'win32a.inc'

section '.data' data readable writeable

mes db 'Hello, World!',0

section '.code' code readable executable

start:
invoke MessageBox,HWND_DESKTOP,mes,mes,MB_OK
invoke ExitProcess,0

section '.idata' import data readable writeable

  library kernel, 'kernel32.dll', \
          user, 'user32.dll'

  import kernel, ExitProcess, 'ExitProcess'
  import user, MessageBox, 'MessageBoxA'

Формат выходных файлов

С помощью директивы format можно указать следующие форматы выходных файлов:

  • MZ — исполняемые файлы DOS.
  • PE — исполняемые файлы Windows (консольные, графические приложения и динамические библиотеки)
  • PE64 — исполняемые файлы Windows 64.
  • COFF, MS COFF, MS64 COFF — объектные файлы.
  • ELF, ELF64 — исполняемые файлы в UNIX-like системах.
  • ARM — это энтузиастская разработка, её можно найти на официальном форуме.
  • Binary — бинарные файлы с любой нужной вам структурой. На официальном форуме, например, можно найти примеры, которые компилируются (именно компилируются, а не выполняются) в tga картинки и т.д.

Операционные системы

  • DOS
  • Windows
  • Linux (напрямую, через системные вызовы)
  • UNIX-like операционных системах (через libc)
  • MenuetOS/KolibriOS (не поставляется в стандартном пакете FASM, поставляется вместе с этими операционными системами).

Поддержка fasm'а в сторонних программных продуктах

Файл поддержки синтаксиса fasm поставляется вместе с базовым пакетом Vim.

Использование fasm'а поддерживают многие специализированные IDE, такие как RadASM, Fresh (специально спроектированный под fasm) и .т.д.

Ссылки