fasm
fasm (сокращение от flat assembler) — свободно распространяемый многопроходной ассемблер, написанный Томашем Грыштаром (польск. Tomasz Grysztar). fasm самодостаточен[1], изначально компилировался TASM-ом и стал способен собираться из собственных исходных кодов начиная с 4 мая 1999 в версии 0.90. fasm обладает небольшими размерами и очень высокой скоростью компиляции, имеет богатый и ёмкий макро-синтаксис, позволяющий автоматизировать множество рутинных задач[3][4]. Поддерживаются как объектные форматы, так и форматы исполняемых файлов. Это позволяет в большинстве случаев обойтись без компоновщика. В остальных случаях нужно использовать сторонние компоновщики, поскольку таковой вместе с fasm не распространяется.
flat assembler | |
---|---|
Тип | компилятор |
Разработчик | Томаш Грыштар |
Написана на | Язык ассемблера |
Операционная система | UNIX-подобные операционные системы, Microsoft Windows, MS-DOS, DOS, Linux, OpenBSD, MenuetOS и KolibriOS |
Первый выпуск | 1999 |
Последняя версия | 1.73.29[1] (30 декабря 2021 ) |
Создаваемые форматы файлов | Executable and Linkable Format, COFF и Portable Executable |
Лицензия | 2-пунктная лицензия BSD[2] |
Сайт | flatassembler.net (англ.) |
Помимо базового набора инструкций процессора и сопроцессора[каких?], fasm поддерживает наборы инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, SSE4a, AVX, AVX-2, AVX-512, 3DNow!, дополнительные расширения AES, CLMUL, FMA, FMA4, XOP, а также EM64T и AMD64 (включая AMD SVM и Intel SMX).
Компиляция
Компиляция программы в fasm состоит из двух стадий: препроцессирование и ассемблирование.
Препроцессирование
На стадии препроцессора раскрываются все макросы, символические константы, обрабатываются директивы препроцессора. Стадия препроцессирования (в отличие от стадии ассемблирования) выполняется только один раз.
Ассемблирование
На стадии ассемблирования определяются адреса меток, обрабатываются условные директивы, раскрываются циклы и генерируется собственно программа. 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
можно компилировать файлы данных[5].
Операционные системы
Поддержка fasm в сторонних программных продуктах
Файл поддержки синтаксиса fasm поставляется вместе с базовым пакетом Vim.
Использование fasm поддерживают многие специализированные IDE, такие как RadASM, WinAsm Studio, Fresh (специально спроектированный под fasm) и т. д.
Примечания
- Flat assembler download (англ.). flatassembler.net. Дата обращения: 26 августа 2019.
- https://github.com/tgrysztar/fasm/blob/752cc50465e38a98a2b6ed1161983988e4d5f61a/LICENSE.TXT
- Tomasz Grysztar. Flat Assembler Programmer’s Manual (англ.) (недоступная ссылка). Дата обращения: 27 мая 2012. Архивировано 31 мая 2012 года.
- Randall Hyde. Which Assembler is the Best? (англ.) (недоступная ссылка). Дата обращения: 27 мая 2012. Архивировано 31 мая 2012 года.
- Тема на официальном форуме о создании изображений с помощью макросов fasm (англ.). Дата обращения: 26 августа 2019.
Ссылки
- Официальный сайт (англ.). Дата обращения: 26 августа 2019.
- Макросы и директивы компилятора fasm . Дата обращения: 26 августа 2019.
- manual по fasm для новичков (недоступная ссылка). Дата обращения: 26 августа 2019. Архивировано 3 апреля 2019 года.
- JaeEditor 1.0 (FASM IDE) (англ.). Дата обращения: 26 августа 2019.