- fasm
-
flat assembler Тип Разработчик Томаш Грыштар
Операционная система Последняя версия Тестовая версия Лицензия Вариант лицензии BSD с возможно анти-GPL исключением
Сайт flat assembler (fasm) — свободно распространяемый многопроходной ассемблер, написанный Томашем Грыштаром (польск. Tomasz Grysztar). fasm написан на самом себе, обладает небольшими размерами и очень высокой скоростью компиляции, имеет богатый и ёмкий макро-синтаксис, позволяющий автоматизировать множество рутинных задач.[1][2] Поддерживаются как объектные форматы, так и форматы исполняемых файлов. Это позволяет в большинстве случаев обойтись без компоновщика. В остальных случаях нужно использовать сторонние компоновщики, поскольку таковой вместе с fasm не распространяется.
Помимо базового набора инструкций процессора и сопроцессора fasm поддерживает наборы инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, SSE4a, AVX и 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!$"
Пример простой программы в формате ELF.
format ELF executable 3 entry start segment readable executable start: mov eax,4 mov ebx,1 mov ecx,msg mov edx,msg_size int 0x80 mov eax,1 xor ebx,ebx int 0x80 segment readable writeable msg db 'Hello world!',0xA msg_size = $-msg
Формат выходных файлов
С помощью директивы
format
можно указать следующие форматы выходных файлов:MZ
— исполняемые файлы DOS.PE
— исполняемые файлы Windows (консольные, графические приложения и динамические библиотеки).PE64
— исполняемые файлы 64-битных версий Windows.
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 (специально спроектированный под fasm) и т. д.
Примечания
- ↑ Tomasz Grysztar. Flat Assembler Programmer’s Manual (англ.). Архивировано из первоисточника 31 мая 2012. Проверено 27 мая 2012.
- ↑ Randall Hyde. Which Assembler is the Best? (англ.). Архивировано из первоисточника 31 мая 2012. Проверено 27 мая 2012.
- ↑ Тема на официальном форуме о создании изображений с помощью макросов fasm
Ссылки
- Официальный сайт (англ.)
- Руководство к fasm (RAR, 33 Кб)
- Макросы и директивы компилятора fasm
- Отличный manual по fasm для новичков
- Русскоязычный сайт по fasm, уроки Iczelion’a
Язык ассемблера IDE Трансляторы Форматы синтаксиса Категории:- Программное обеспечение по алфавиту
- Компиляторы
- Ассемблер
- Свободное программное обеспечение, написанное на языке ассемблера
Wikimedia Foundation. 2010.