fasm
Необходимо перенести в эту статью содержимое статьи Ассемблер fasm и удалить статью Ассемблер fasm без установки перенаправления. |
flat assembler | |
---|---|
| |
Тип | компилятор |
Разработчик | Томаш Грыштар |
Написана на | Язык ассемблера |
Операционная система | Unix-подобная операционная система, Microsoft Windows, MS-DOS, DOS, Linux, OpenBSD, MenuetOS и KolibriOS |
Первый выпуск | 1999 |
Последняя версия | 1.73.30[1] (21 февраля 2022 ) |
Создаваемые форматы файлов | Executable and Linkable Format, COFF и Portable Executable |
Лицензия | 2-пунктная лицензия BSD[d][2] |
Сайт | flatassembler.net (англ.) |
fasm (сокращение от flat assembler) — свободно распространяемый многопроходной ассемблер, написанный Томашем Грыштаром (польск. Tomasz Grysztar). fasm самодостаточен[1], изначально компилировался TASM-ом и стал способен собираться из собственных исходных кодов начиная с 4 мая 1999 в версии 0.90. fasm обладает небольшими размерами и очень высокой скоростью компиляции[источник не указан 159 дней], имеет богатый и ёмкий макро-синтаксис, позволяющий автоматизировать множество рутинных задач[3][4]. Поддерживаются как объектные форматы, так и форматы исполняемых файлов. Это позволяет в большинстве случаев обойтись без компоновщика. В остальных случаях нужно использовать сторонние компоновщики, поскольку таковой вместе с fasm не распространяется.
Помимо базового набора инструкций процессора и сопроцессора[каких?], 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].
Операционные системы[править | править код]
- DOS;
- Windows: NT, XP, Vista, 7;
- Основанные на Linux — напрямую, через системные вызовы;
- FreeBSD;
- Другие, основанные на libc (Unix-подобные);
- MenuetOS, KolibriOS — не поставляется в стандартном пакете fasm, поставляется вместе с этими операционными системами.
Поддержка fasm в сторонних программных продуктах[править | править код]
Файл поддержки синтаксиса fasm поставляется вместе с базовым пакетом Vim.
Использование fasm поддерживают многие специализированные IDE, такие как RadASM, WinAsm Studio, Fresh (специально спроектированный под fasm) и т. д.
Примечания[править | править код]
- ↑ 1 2 Flat assembler download (англ.). flatassembler.net. Дата обращения: 26 августа 2019. Архивировано 31 августа 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. Архивировано 4 августа 2020 года.
Ссылки[править | править код]
- Официальный сайт (англ.). Дата обращения: 26 августа 2019.
- Макросы и директивы компилятора fasm . Дата обращения: 26 августа 2019.
- manual по fasm для новичков (недоступная ссылка). Дата обращения: 26 августа 2019. Архивировано 3 апреля 2019 года.
- JaeEditor 1.0 (FASM IDE) (англ.). Дата обращения: 26 августа 2019.