- Fasm
-
fasm
flat assembler Тип компилятор Разработчик Томаш Грыштар ОС DOS, DexOS, Win32, основанные на Linux, BSD, MenuetOS Версия 1.68 (6 июля 2009) Тестовая версия 1.69.14 (26 апреля 2010) Лицензия Вариант лицензии BSD с возможно анти-GPL исключением Сайт flatassembler.net flat assembler (fasm) — свободно распространяемый многопроходной ассемблер, написанный Томашем Грыштаром (польск. Tomasz Grysztar). Fasm написан на самом себе, обладает небольшими размерами и очень высокой скоростью компиляции, имеет богатый и ёмкий макро-синтаксис, позволяющий автоматизировать множество рутинных задач.[1][2] Поддерживаются как объектные форматы, так и форматы исполняемых файлов. Это позволяет в большинстве случаев обойтись без компоновщика. В остальных случаях нужно использовать сторонние компоновщики, поскольку таковой вместе с fasm не распространяется.
Помимо базового набора инструкций процессора и сопроцессора fasm поддерживает наборы инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, SSE4a и 3DNow!, а также EM64T и AMD64 (включая AMD SVM и Intel SMX).
Компиляция программы в fasm состоит из 2 стадий: препроцессирование и ассемблирование.
Содержание
Препроцессирование
На стадии препроцессора раскрываются все макросы, символические константы, обрабатываются директивы препроцессора.
В отличие от стадии ассемблирования, препроцессирование выполняется только 1 раз. Смешивание стадий ассемблирования и препроцессирования — распространённая ошибка начинающих.
Ассемблирование
На стадии ассемблирования определяются адреса меток, обрабатываются условные директивы, раскрываются циклы и генерируется собственно программа. Fasm — многопроходной ассемблер, что позволяет ему делать некоторую оптимизацию, например, генерирование короткого перехода на метку вместо длинного. Во время прохода компилятор не всегда может вычислить выражение в условных директивах. В этом случае он делает какой-нибудь выбор и пытается скомпилировать дальше. Благодаря тому, что адреса меток, вычисленные на N-ном проходе, используются на N+1-проходе, этот процесс обычно сходится.
Формат записи инструкций
Используется Intel-синтаксис записи инструкций.
Единственное существенное отличие от формата, принятого в других ассемблерах (MASM, TASM в режиме совместимости с MASM) — значение ячейки памяти всегда записывается как
[label_name]
, а простоlabel_name
означает адрес (то есть порядковый номер) ячейки. Это позволяет обходиться без ключевого словаoffset
. Также в fasm при переопределении размера операнда вместоbyte ptr
пишется простоbyte
, вместоword ptr
—word
и т. д. Не позволяется использовать несколько квадратных скобок в одном операнде, таким образом вместо[bx][si]
необходимо писать[bx+si]
. Эти изменения синтаксиса привели к более унифицированному и лёгкому для прочтения коду.Пример программы
Пример Windows-программы «Hello, world!», которая выводит это сообщение с помощью функции MessageBox и завершается:
format pe gui 4.0 entry start include 'win32a.inc' start: invoke MessageBox,NULL,message,message,MB_OK invoke ExitProcess,0 message db 'Hello, World!',0 data import library kernel32,'kernel32.dll',\ user32,'user32.dll' include 'api/kernel32.inc' include 'api/user32.inc' end data
Или так:
include 'win32ax.inc' .code main: invoke MessageBox,NULL,'Hello, World!','Fasm message box:',MB_OK invoke ExitProcess,0 .end main
Усложнённый вариант, с уточнением секций в PE-файле:
format pe gui entry start include 'win32a.inc' section '.data' data readable writeable message db 'Hello, World!',0 section '.code' code readable executable start: invoke MessageBox,NULL,message,message,MB_OK invoke ExitProcess,0 section '.idata' import data readable writeable library kernel32,'kernel32.dll',\ user32,'user32.dll' import kernel32,\ ExitProcess,'ExitProcess' import user32,\ MessageBox,'MessageBoxA'
Пример простой программы в формате .COM.
org 100h mov ah,9h mov dx,hello int 21h mov ah,8h int 21h int 20h hello db 13,10,"Hello, World!$"
Формат выходных файлов
С помощью директивы format можно указать следующие форматы выходных файлов:
- MZ — исполняемые файлы DOS.
- PE — исполняемые файлы Microsoft Windows (консольные, графические приложения и динамические библиотеки).
- PE64 — исполняемые файлы Windows 64.
- COFF, MS COFF, MS64 COFF — объектные файлы.
- ELF, ELF64 — исполняемые файлы в UNIX-подобных системах.
- ARM — разработка энтузиастов, можно найти на официальном форуме.
- Binary — файлы произвольной структуры. Указав смещение 100h (org 100h), можно получить исполняемый файл формата .COM. Также, с помощью format binary можно компилировать файлы данных.[3]
Операционные системы
- DOS
- Windows: NT, XP, Vista, 7
- Основанные на Linux — напрямую, через системные вызовы
- FreeBSD
- Другие, основанные на libc (UNIX-подобные)
- MenuetOS, KolibriOS — не поставляется в стандартном пакете fasm, поставляется вместе с этими операционными системами.
Поддержка fasm в сторонних программных продуктах
Файл поддержки синтаксиса fasm поставляется вместе с базовым пакетом Vim.
Использование fasm поддерживают многие специализированные IDE, такие как RadASM, WinAsm Studio, Fresh (IDE) (специально спроектированный под fasm) и т. д.
Примечания
- ↑ Tomasz Grysztar. Flat Assembler Programmer’s Manual(англ.)
- ↑ Randall Hyde. Which Assembler is the Best? (Какой ассемблер лучший?)(англ.)
- ↑ Тема на официальном форуме о создании изображений с помощью макросов Fasm
Ссылки
- Официальный сайт(англ.)
- Руководство к FASM (RAR, 33 Кб)
- Макросы и директивы компилятора FASM
- Отличный manual по FASM для новичков
Программные пакеты для программирования на ассемблере Среды разработки ПО RadASM • WinAsm • ASMedit • Easy Code • Fresh • GSS Visual Assembler Трансляторы MASM • gas • fasm • NASM • RosASM • TASM • Yasm • HLASM • прочие…
Wikimedia Foundation. 2010.