Fasm | это... Что такое Fasm? (original) (raw)
fasm
flat assembler | |
---|---|
Тип | компилятор |
Разработчик | Томаш Грыштар |
ОС | DOS, DexOS, Win32, основанные на Linux, BSD, MenuetOS |
Версия | 1.68 (6 июля 2009) |
Тестовая версия | 1.69.14 (26 апреля 2010) |
Лицензия | Вариант лицензии BSD с возможно анти-GPL исключением |
Сайт | flatassembler.net |
flat assembler (fasm) — свободно распространяемый многопроходной ассемблер, написанный Томашем Грыштаром (польск. Tomasz Grysztar). Fasm написан на самом себе, обладает небольшими размерами и очень высокой скоростью компиляции, имеет богатый и ёмкий макро-синтаксис, позволяющий автоматизировать множество рутинных задач.[1][2] Поддерживаются как объектные форматы, так и форматы исполняемых файлов. Это позволяет в большинстве случаев обойтись без компоновщика. В остальных случаях нужно использовать сторонние компоновщики, поскольку таковой вместе с fasm не распространяется.
Помимо базового набора инструкций процессора и сопроцессора fasm поддерживает наборы инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, SSE4a и 3DNow!, а также EM64T и AMD64 (включая AMD SVM и Intel SMX).
Компиляция программы в fasm состоит из 2 стадий: препроцессирование и ассемблирование.
Содержание
- 1 Препроцессирование
- 2 Ассемблирование
- 3 Формат записи инструкций
- 4 Пример программы
- 5 Формат выходных файлов
- 6 Операционные системы
- 7 Поддержка fasm в сторонних программных продуктах
- 8 Примечания
- 9 Ссылки
Препроцессирование
На стадии препроцессора раскрываются все макросы, символические константы, обрабатываются директивы препроцессора.
В отличие от стадии ассемблирования, препроцессирование выполняется только 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!$"
Формат выходных файлов
С помощью директивы format можно указать следующие форматы выходных файлов:
- MZ — исполняемые файлы DOS.
- PE — исполняемые файлы Microsoft Windows (консольные, графические приложения и динамические библиотеки).
- PE64 — исполняемые файлы Windows 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 поддерживают многие специализированные IDE, такие как RadASM, WinAsm Studio, Fresh (IDE) (специально спроектированный под fasm) и т. д.
Примечания
- ↑ Tomasz Grysztar. Flat Assembler Programmer’s Manual(англ.)
- ↑ Randall Hyde. Which Assembler is the Best? (Какой ассемблер лучший?)(англ.)
- ↑ Тема на официальном форуме о создании изображений с помощью макросов Fasm
Ссылки
- Официальный сайт(англ.)
- Руководство к FASM (RAR, 33 Кб)
- Макросы и директивы компилятора FASM
- Отличный manual по FASM для новичков
Программные пакеты для программирования на ассемблере | |
---|---|
Среды разработки ПО | RadASM • WinAsm • ASMedit • Easy Code • Fresh • GSS Visual Assembler |
Трансляторы | MASM • gas • fasm • NASM • RosASM • TASM • Yasm • HLASM • прочие… |
Wikimedia Foundation.2010.