fasm
| Flat assembler | |
| Тип | |
|---|---|
| Разработчик |
Томаш Грыштар |
| Операционная система | |
| Последняя версия |
1.69.35 (29 октября 2011) |
| Лицензия |
Вариант лицензии 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 раз. Смешивание стадий ассемблирования и препроцессирования — распространённая ошибка начинающих[источник не указан 119 дней].
[править] Ассемблирование
На стадии ассемблирования определяются адреса меток, обрабатываются условные директивы, раскрываются циклы и генерируется собственно программа. 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 — исполняемые файлы Microsoft Windows (консольные, графические приложения и динамические библиотеки).
- PE64 — исполняемые файлы 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 поддерживают многие специализированные среды разработки программного обеспечения, такие как RadASM, WinAsm Studio, Fresh (специально спроектированный под fasm) и т. д.
[править] Примечания
- ↑ Tomasz Grysztar. Flat Assembler Programmer’s Manual (англ.)
- ↑ Randall Hyde. Какой ассемблер лучший? (англ.)
- ↑ Тема на официальном форуме о создании изображений с помощью макросов fasm
[править] Ссылки
- Официальный сайт (англ.)
- Руководство к fasm (RAR, 33 Кб)
- Макросы и директивы компилятора fasm
- Отличный manual по fasm для новичков
- Русскоязычный сайт по fasm , уроки Iczelion'a
|
|
|
|---|---|
| IDE | |
| Трансляторы | |
| Форматы синтаксиса | |

