Fasm
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 ptr
— word
и т. д. Не позволяется использовать несколько квадратных скобок в одном операнде, таким образом вместо [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) и .т.д.
Ссылки
- Руководство к FASM на русском
- flatassembler.net — основной сайт, с которого можно скачать fasm.
- board.flatassembler.net — форум посвященный fasm.
- История под названием fasm — интервью с создателем fasm-а.