23-07-2023
Тип | |
---|---|
Разработчик |
Томаш Грыштар |
Операционная система | |
Последняя версия | |
Лицензия |
Вариант лицензии BSD с возможно анти-GPL исключением |
Сайт |
flatassembler.net |
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]Файл поддержки синтаксиса fasm поставляется вместе с базовым пакетом Vim.
Использование fasm поддерживают многие специализированные IDE, такие как RadASM, WinAsm Studio, Fresh (специально спроектированный под fasm) и т. д.
Язык ассемблера | |
---|---|
IDE | |
Трансляторы | |
Форматы синтаксиса |
FASM.