Fasm: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
м насчет "измененной" погорячился
Нет описания правки
Метки: с мобильного устройства из мобильной версии
 
(не показано 259 промежуточных версий, сделанных более чем 100 участниками)
Строка 1: Строка 1:
{{Карточка программы
{{Карточка программы
| name = Fasm
| name = flat assembler
| genre = [[компилятор]]
| screenshot = [[Изображение:fasmw.gif|250px]]
| developer = Томаш Грыштар
| genre = [[компилятор]], [[линкер]]
| latest_release_version = 1.73.32<ref name=fasm_download />
| developer = Tomasz Grysztar
| latest_release_date = {{Start date and age|2023|12|4}}
| operating_system = [[dos]], [[Windows|win]], [[linux]], [[bsd]]
| latest_preview_version =
| latest_release_version = 1.67.18
| latest_preview_date =
| latest_release_date = [[27 декабря]] [[2006]]
| license = [[лицензия BSD]]
| website = [http://flatassembler.net/ flatassembler.net]
}}
}}
'''Fasm''' (стилизовано под [[минускул]]; [[аббревиатура|сокр]]. от '''f'''lat '''as'''se'''m'''bler) — свободно распространяемый многопроходной [[ассемблер]], написанный Томашем Грыштаром ({{lang-pl|Tomasz Grysztar}}). Fasm [[Самодостаточность (компиляторы)|самодостаточен]]<ref name=fasm_download />, изначально компилировался [[TASM]]-ом и стал способен собираться из собственных исходных кодов начиная с 4 мая 1999 в версии 0.90. Fasm обладает небольшими размерами и очень высокой скоростью компиляции{{нет АИ|23|01|2022}}, имеет богатый и ёмкий [[Макрос в языке ассемблера|макро-синтаксис]], позволяющий автоматизировать множество рутинных задач<ref name=manual /><ref name=whichASSEMBLERIsTheBest />. Поддерживаются как объектные форматы, так и форматы исполняемых файлов. Это позволяет в большинстве случаев обойтись без [[компоновщик]]а. В остальных случаях нужно использовать сторонние компоновщики, поскольку таковой вместе с Fasm не распространяется.


Помимо базового набора инструкций [[процессор]]а и [[сопроцессор]]а{{каких}}<!-- а базовый — это какой? который в 8086? в Pentium без MMX? а что насчёт архитектур, не основанных на x86? -->, fasm поддерживает наборы инструкций [[MMX]], [[SSE]], [[SSE2]], [[SSE3]], [[SSSE3]], [[SSE4.1]], [[SSE4.2]], [[SSE4a]], [[AVX]], [[AVX-2]], [[AVX-512]], [[3DNow!]], [[Расширение системы команд AES|дополнительные расширения AES]], [[CLMUL]], [[FMA]], [[FMA4]], [[XOP (набор инструкций)|XOP]], а также [[EM64T]] и [[AMD64]] (включая AMD{{nbsp}}SVM и Intel{{nbsp}}SMX).
'''Fasm''' (Flat Assembler) — свободно распространяемый многопроходной [[ассемблер]], написанный Приваловым (псевдоним Tomasz Grysztar). Fasm написан на самом себе, обладает небольшими размерами и очень высокой скоростью компиляции, имеет богатый и ёмкий [[Макрос в языке ассемблера|макро-синтаксис]], позволяющий автоматизировать множество рутинных задач. Поддерживаются как объектные форматы, так и форматы исполняемых файлов. Это позволяет в большинстве случаев обойтись без [[линковщик]]а. Однако в некоторых случаях без него не обойтись. В этом случае нужно использовать сторонние линковщики, поскольку линковщик вместе с Fasm’ом не распространяется.


Все вариации Fasm непосредственно могут создавать выходные файлы в следующих, предустановленных в ассемблер, форматах: объектные файлы (стандартно для большинства ассемблеров): [[Executable and Linkable Format]] (ELF) или [[:en:COFF|Common Object File Format]](COFF)(классический или в спецификации микрософт), исполняемые файлы (не требует дополнительных компоновщиков): [[MZ (формат)|MZ]], ELF или [[Portable Executable]] (PE) (WDM драйвера включительно, с возможностью настройки MZ DOS stub). Для генерации файлов в формате, отличном от предустановленных, есть формат бинарный файл, дающий программисту полный контроль за каждым байтом выходного файла, однако всю структуру, содержание и взаимосвязи такого файла программисту придётся описывать непосредственно.
Помимо базового набора инструкций [[процессор]]а и [[сопроцессор]]а fasm поддерживает наборы инструкций [[MMX]], [[SSE]], [[SSE2]], [[SSE3]] и [[3DNow!]], а также [[AMD64]].


В качестве родной целевой архитектуры используются архитектуры [[IA-32|IA32]] и [[x86-64]]. Присутствует неофициальное дополнение [https://arm.flatassembler.net/ fasmarm], в котором родные целевые архитектуры [[ARM (архитектура)|ARM]] и ARM64. Реализация целевых архитектур, отличных от родной, аналогична подобной реализации на любом другом ассемблере - для этих целей используются макрокоманды и директивы определения данных.
Компиляция программы в Fasm’e состоит из 2 стадий: препроцессирование и ассемблирование.


== История ==
== Препроцессирование ==
Проект был начат в [[1999 год]]у Томашом Грыштаром ({{lang-pl|Tomasz Grysztar}}), который на тот момент был студентом. Его исходный код был полностью написан на языке ассемблера [[TASM]]. Начиная с версии 0.90 (4 мая 1999) ассемблер fasm стал [[:en:self-hosting|самодостаточен]](его исходный код был адаптирован под [[Fasm (язык программирования)|родной диалект]] и собирался самим ассемблером fasm). В марте 2000 года fasm был опубликован в сети Интернет.
На стадии [[препроцессор]]а раскрываются все [[Макрос в языке ассемблера|макросы]], символические константы обрабатываются директивы препроцессора.


Изначально fasm запускался только из 16-разрядного [[:en:Unreal_mode|плоского реального режима]]. Затем была добавлена поддержка 32-разрядности и в дополнение к ней поддержка [[:en:DOS_Protected_Mode_Interface|DPMI]]. Исходный код был переписан таким образом, чтобы его легко можно было портировать под любую x86 операционную систему, поддерживающую 32-битную адресацию. Он был портирован на Windows, затем на Linux.
В отличие от стадии ассемблирования, препроцессирование выполняется только 1 раз. Смешивание стадий ассемблирования и препроцессирования — распространенная ошибка начинающих.


== Принципы ==
== Ассемблирование ==
Fasm стремится использовать минимально возможный набор директив препроцессора, т.е. в предустановленном наборе директив не допускается внедрение новых директив, функциональность которых может быть достигнута имеющимся набором директив. Исключение исторически сложившиеся взаимозаменяемые директивы.
На стадии ассемблирования определяются адреса [[Метка|меток]], обрабатываются условные директивы, раскрываются циклы и генерируется собственно программа. Fasm — многопроходной ассемблер, что позволяет ему делать некоторую оптимизацию, например, генерирование короткого перехода на метку вместо длинного. Во время прохода компилятор не всегда может вычислить выражение в условных директивах. В этом случае он делает какой-нибудь выбор и пытается скомпилировать дальше. Благодаря тому, что вычисленные адреса меток на N-ном проходе используется на N+1-проходе, это процесс обычно сходится.

Fasm — многопроходный ассемблер с оптимистическим предсказанием, т.е. на первом же проходе ассемблер делает предположение, что все инструкции принимают свою минимально возможную по размеру форму. Многопроходность также позволяет неограниченно использовать выражения до их объявления.

Fasm не включает в выходной файл объявления не используемых процедур (реализовано посредством макрокоманд).

Содержимое выходного файла зависит только от содержания исходного кода и не зависит от окружения операционной системы или от параметров переданных в командной строке. Для тех кому данный принцип был неудобен для win32 была разработана обертка [https://board.flatassembler.net/topic.php?t=9948 FA], позволяющая подключить к файлу другой файл не непосредственно в коде, а через командную строку.

Исходный код для fasm может собираться сразу в исполняемый файл, минуя стадии создания промежуточных объектных файлов и их компоновки.

== Процесс компиляции ==
Компиляция программы в fasm состоит из трёх стадий: препроцессирование, синтаксический анализ и ассемблирование.

=== Препроцессирование ===
Первая стадия [[препроцессор|(препроцессинг]]) выполняется в 1 проход, вначале исходный текст токенизируется, затем в нём распознаются и обрабатываются все директивы процессора, раскрываются все [[Макрос в языке ассемблера|макросы]] и все символические константы. Поскольку дополнительных проходов этой стадией не предусмотрено, любой элемент языка, обрабатываемый на этой стадии, должен быть вначале объявлен, и только затем он может быть использован.

=== Синтаксический анализ ===
Вторая стадия, на этой стадии происходит дополнительная классификация токенов (т.к. даже типы токенов и требования к ним на стадиях препроцессирования и ассемблирования немного разные), для некоторых токенов создаются дополнительные структуры свойств, которые впоследствии будут использоваться при ассемблировании.

=== Ассемблирование ===
На стадии ассемблирования определяются адреса [[Метка (программирование)|меток]], обрабатываются условные директивы, раскрываются циклы и генерируется собственно программа. fasm — многопроходной ассемблер, что позволяет ему делать некоторые оптимизации (например, генерировать короткий переход на метку вместо длинного). Во время прохода компилятор не всегда может вычислить выражение в условных директивах. В этом случае он делает какой-нибудь выбор и пытается скомпилировать дальше. Благодаря тому, что адреса меток, вычисленные на N-м проходе, используются на N+1-м проходе, этот процесс обычно сходится.


== Формат записи инструкций ==
== Формат записи инструкций ==
Используется [[Intel-синтаксис]] записи инструкций.
Используется [[Intel-синтаксис]] записи инструкций.


Единственное существенное отличие от формата, принятого в других ассемблерах ([[MASM]], [[TASM]]) — значение ячейки памяти всегда записывается как <code>[label_name]</code>, а просто <code>label_name</code> означает адрес (то есть порядковый номер) ячейки. Это позволяет обходится без ключевого слова <code>offset</code>. Также в fasm’e при переопределении размера операнда вместо <code>byte ptr</code> пишется просто <code>byte</code>, вместо <code>word ptr</code> — <code>word</code> и т. д. Не позволяется использовать несколько квадратных скобок в одном операнде, таким образом вместо [bx][si] необходимо писать [bx+si]. Эти изменения синтаксиса привели к более унифицированному и легкому для прочтения коду.
Единственное существенное отличие от формата, принятого в других ассемблерах ([[MASM]], [[TASM]] в режиме совместимости с MASM) — значение ячейки памяти всегда записывается как <code>[label_name]</code>, а просто <code>label_name</code> означает адрес (то есть порядковый номер) ячейки. Это позволяет обходиться без ключевого слова <code>offset</code>. Также в fasm при переопределении размера операнда вместо <code>byte{{nbsp}}ptr</code> пишется просто <code>byte</code>, вместо <code>word{{nbsp}}ptr</code> — <code>word</code> и т. д. Не позволяется использовать несколько квадратных скобок в одном операнде — таким образом, вместо <code>[bx][si]</code> необходимо писать <code>[bx+si]</code>. Эти изменения синтаксиса привели к более унифицированному и лёгкому для чтения коду.


== Пример программы ==
== Пример программы ==
Это пример [[Windows]] - программы [[Программа Hello world|Hello world]], которая выводит это знаменитое сообщение и завершается:
Пример Windows-программы «[[Hello, world!]]», которая выводит это сообщение с помощью функции <code>[[MessageBox]]</code> и завершается:
{{Скрытый
|Пример 1
|<syntaxhighlight lang="asm">
format pe gui 4.0
entry start
include 'win32a.inc'


format PE
entry start
include 'win32a.inc'
mes db 'Hello, World!',0
start:
start:
invoke MessageBox,HWND_DESKTOP,mes,mes,MB_OK
invoke MessageBox,NULL,message,message,MB_OK
invoke ExitProcess,0
invoke ExitProcess,0
data import
library kernel, 'kernel32.dll', \
user, 'user32.dll'
import kernel, ExitProcess, 'ExitProcess'
import user, MessageBox, 'MessageBoxA'
end data


message db 'Hello, World!',0
Или так:


data import
include 'win32ax.inc'
library kernel32,'kernel32.dll',\
user32,'user32.dll'
include 'api/kernel32.inc'
include 'api/user32.inc'
end data
</syntaxhighlight>
}}
{{Скрытый
|Пример 2
|<syntaxhighlight lang="asm">
include 'win32ax.inc'
.code
main:
main:
invoke MessageBox,HWND_DESKTOP,'Hello, World!','Fasm message box:',MB_OK
invoke MessageBox,NULL,'Hello, World!','Fasm message box:',MB_OK
invoke ExitProcess,0
invoke ExitProcess,0
.end main
.end main
</syntaxhighlight>
}}

Усложнённый вариант, с уточнением секций в [[Portable Executable|PE-файле]]:
{{Скрытый
|
|<syntaxhighlight lang="asm">
format pe gui
entry start
include 'win32a.inc'


Более усложненный вариант, с уточнением секций в [[PE]] файле:
format PE
entry start
include 'win32a.inc'
section '.data' data readable writeable
section '.data' data readable writeable

mes db 'Hello, World!',0
message db 'Hello, World!',0

section '.code' code readable executable
section '.code' code readable executable

start:
start:
invoke MessageBox,HWND_DESKTOP,mes,mes,MB_OK
invoke MessageBox,NULL,message,message,MB_OK
invoke ExitProcess,0
invoke ExitProcess,0

section '.idata' import data readable writeable
section '.idata' import data readable writeable
library kernel32,'kernel32.dll',\
user32,'user32.dll'
library kernel, 'kernel32.dll', \
user, 'user32.dll'
import kernel32,\
ExitProcess,'ExitProcess'
import kernel, ExitProcess, 'ExitProcess'
import user32,\
import user, MessageBox, 'MessageBoxA'
MessageBox,'MessageBoxA'
</syntaxhighlight>
}}

Пример простой консольной программы в формате [[.COM]]:
{{Скрытый
|
|<syntaxhighlight lang="asm">
org 100h

mov ah,9h
mov dx,hello
int 21h
mov ah,8h
int 21h
int 20h

hello db 13,10,"Hello, World!$"
</syntaxhighlight>
}}

Пример простой программы в формате [[Executable and Linkable Format|ELF]]:
{{Скрытый
|
|<syntaxhighlight lang="asm">
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
</syntaxhighlight>
}}


== Формат выходных файлов ==
== Формат выходных файлов ==
С помощью директивы <tt>format</tt> можно указать следующие форматы выходных файлов:
С помощью директивы <code>format</code> можно указать следующие форматы выходных файлов:
* [[MZ]] — исполняемые файлы [[DOS]].
* <code>[[.EXE|MZ]]</code> — исполняемые файлы [[DOS]].
* [[PE]] — исполняемые файлы [[Windows]] (консольные, графические приложения и динамические библиотеки)
* <code>[[Portable Executable|PE]]</code> — исполняемые файлы [[Windows]] (консольные, графические приложения и динамические библиотеки).
* PE64 — исполняемые файлы Windows 64.
** <code>PE64</code> — исполняемые файлы 64-битных версий Windows.
* COFF, MS COFF, MS64 COFF — объектные файлы.
* <code>[[COFF]]</code>, <code>MS{{nbsp}}COFF</code>, <code>MS64{{nbsp}}COFF</code> — объектные файлы.
* [[ELF]], [[ELF64]] — исполняемые файлы в [[UNIX|UNIX-like системах]].
* <code>[[Executable and Linkable Format|ELF]]</code>, <code>ELF64</code> — исполняемые файлы в [[Unix-подобная операционная система|Unix-подобных системах]].
* ARM это энтузиастская разработка, её можно найти на официальном форуме.
* <code>ARM</code> — разработка энтузиастов <ref name=fasm_arm />.
* <code>Binary</code> — файлы произвольной структуры. Указав смещение 100h (<code>org 100h</code>), можно получить исполняемый файл формата [[.COM]]. Также с помощью <code>format binary</code> можно компилировать файлы данных<ref name=boardflatassembler />.
* Binary — бинарные файлы с любой нужной вам структурой. На официальном форуме, например, можно найти примеры, которые компилируются (именно компилируются, а не выполняются) в tga картинки и т.д.


== Операционные системы ==
== Операционные системы ==
* [[DOS]]
* [[DOS]];
* [[Microsoft Windows|Windows]]
* [[Windows]]: [[Windows NT|NT]], [[Windows XP|XP]], [[Windows Vista|Vista]], [[Windows 7|7]];
* [[Linux]] (напрямую, через системные вызовы)
* Основанные на [[Linux]] — напрямую, через системные вызовы;
* [[FreeBSD]];
* [[UNIX-like]] операционных системах (через [[libc]])
* Другие, основанные на [[Стандартная библиотека языка Си|libc]] ([[Unix-подобная операционная система|Unix-подобные]]);
* [[MenuetOS]]/[[KolibriOS]] (не поставляется в стандартном пакете FASM, поставляется вместе с этими операционными системами).
* [[MenuetOS]], [[KolibriOS]] — не поставляется в стандартном пакете fasm, поставляется вместе с этими операционными системами.


== Применение ==
== Поддержка fasm'а в сторонних программных продуктах ==
'''Операционные системы, написанные на FASM:'''
* DexOS — автор Ville Turijanmaa
* MenuetOS — 32- и 64-битные графические операционные системы, автор Ville Turijanmaa
** KolibriOS — форк MenuetOS

'''Компиляторы, использующие FASM как бекэнд ассемблер:'''
* [[PureBasic]]
* [[:en:High_Level_Assembly|High Level Assembly]] (HLA)
* [[Blitzmax|BlitzMax]]

'''IDE, основанное на FASM:'''
* [[Fresh (IDE)|Fresh]] — проект, поддерживаемый интернет сообществом, основанный John Found

== Поддержка fasm в сторонних программных продуктах ==
Файл поддержки синтаксиса fasm поставляется вместе с базовым пакетом [[Vim]].
Файл поддержки синтаксиса fasm поставляется вместе с базовым пакетом [[Vim]].


Использование fasm поддерживают многие специализированные [[IDE]], такие как [[RadASM]], [[Fresh]] (специально спроектированный под fasm) и .т.д.
Использование fasm поддерживают многие специализированные [[Интегрированная среда разработки|IDE]], такие как [[RadASM]], [[WinAsm Studio]], [[Fresh (IDE)|Fresh]] (специально спроектированный под fasm) и т. д.


== Ссылки ==
== Примечания ==
{{Примечания|refs=
* [http://www.wasm.ru/docs/6/fasm164manualrus.zip Руководство к FASM на русском]
<ref name=fasm_download>{{cite web|url=https://flatassembler.net/download.php|title=Flat assembler download|lang=en|website=flatassembler.net|accessdate=2019-08-26|archive-date=2019-08-31|archive-url=https://web.archive.org/web/20190831025357/http://flatassembler.net/download.php|deadlink=no}}</ref>
* [http://flatassembler.net flatassembler.net] — основной сайт, с которого можно скачать fasm.
<ref name=fasm_arm>{{cite web|url=https://arm.flatassembler.net/|title=FASM ARM|lang=en|website=flatassembler.net|access-date=2022-09-27|archive-date=2022-09-27|archive-url=https://web.archive.org/web/20220927201042/https://arm.flatassembler.net/|deadlink=no}}</ref>
* [http://board.flatassembler.net board.flatassembler.net] — форум посвященный fasm.
<ref name=manual>{{cite web|author=Tomasz Grysztar.|url=http://flatassembler.net/docs.php?article=manual|title=Flat Assembler Programmer’s Manual|lang=en|accessdate=2012-05-27|archiveurl=https://www.webcitation.org/684dijIt5?url=http://flatassembler.net/docs.php?article=manual|archivedate=2012-05-31|deadurl=yes}}</ref>
* [http://sysbin.com/files/articles/fasm.html История под названием fasm] — интервью с создателем fasm-а.
<ref name=whichASSEMBLERIsTheBest>{{cite web|author=Randall Hyde.|url=http://webster.cs.ucr.edu/AsmTools/WhichAsm.html|title=Which Assembler is the Best?|lang=en|accessdate=2012-05-27|archiveurl=https://www.webcitation.org/684djGAvn?url=http://webster.cs.ucr.edu/AsmTools/WhichAsm.html|archivedate=2012-05-31|deadurl=yes}}</ref>
<ref name=boardflatassembler>{{cite web|url=http://board.flatassembler.net/topic.php?t=2265|title=Тема на официальном форуме о создании изображений с помощью макросов fasm|lang=en|accessdate=2019-08-26|archive-date=2020-08-04|archive-url=https://web.archive.org/web/20200804202122/https://board.flatassembler.net/topic.php?t=2265|deadlink=no}}</ref>
}}


== Ссылки ==
* {{cite web|url=https://flatassembler.net|title=Официальный сайт|lang=en|accessdate=2019-08-26}}
* {{cite web|url=https://arm.flatassembler.net/|title=Официальный раздел по ARM|lang=en|accessdate=2019-08-26}}
* {{cite web|url=https://web.archive.org/web/20120510220301/http://wasm.ru/article.php?article=fmacros|title=Макросы и директивы компилятора fasm|lang= |website= |publisher= |date= |accessdate=2019-08-26}}
* {{cite web|url=http://asmworld.ru|title=manual по fasm для новичков|accessdate=2019-08-26|archiveurl=https://web.archive.org/web/20190403023335/http://asmworld.ru/|archivedate=2019-04-03|deadlink=yes}}
* {{cite web|url=https://sourceforge.net/projects/jaeeditor/|title=JaeEditor 1.0 (FASM IDE)|lang=en|accessdate=2019-08-26}}


{{Шаблон:Ассемблеры}}
{{Ассемблеры}}


[[Категория:Компиляторы]]
[[Категория:Компиляторы]]
[[Категория:Ассемблер]]
[[Категория:Ассемблер]]
[[Категория:Свободное программное обеспечение, написанное на языке ассемблера]]

[[de:Flat Assembler]]
[[en:FASM]]
[[es:Flat assembler]]
[[fr:FASM]]
[[it:FASM]]
[[pl:FASM]]

Текущая версия от 11:51, 25 июля 2024

flat assembler
Скриншот программы flat assembler
Скриншот FASM с кодом из поставляемых примеров
Тип компилятор
Разработчик Томаш Грыштар
Написана на язык ассемблера
Операционные системы Unix-подобная операционная система, Windows, MS-DOS, DOS, Linux, OpenBSD, MenuetOS и KolibriOS
Первый выпуск 1999
Последняя версия 1.73.32[1] (4 декабря 2023; 12 месяцев назад (2023-12-04))
Репозиторий github.com/tgrysztar/fasm
Лицензия 2-пунктная лицензия BSD[вд][2]
Сайт flatassembler.net (англ.)

Fasm (стилизовано под минускул; сокр. от flat assembler) — свободно распространяемый многопроходной ассемблер, написанный Томашем Грыштаром (пол. Tomasz Grysztar). Fasm самодостаточен[1], изначально компилировался TASM-ом и стал способен собираться из собственных исходных кодов начиная с 4 мая 1999 в версии 0.90. Fasm обладает небольшими размерами и очень высокой скоростью компиляции[источник не указан 1062 дня], имеет богатый и ёмкий макро-синтаксис, позволяющий автоматизировать множество рутинных задач[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 непосредственно могут создавать выходные файлы в следующих, предустановленных в ассемблер, форматах: объектные файлы (стандартно для большинства ассемблеров): Executable and Linkable Format (ELF) или Common Object File Format(COFF)(классический или в спецификации микрософт), исполняемые файлы (не требует дополнительных компоновщиков): MZ, ELF или Portable Executable (PE) (WDM драйвера включительно, с возможностью настройки MZ DOS stub). Для генерации файлов в формате, отличном от предустановленных, есть формат бинарный файл, дающий программисту полный контроль за каждым байтом выходного файла, однако всю структуру, содержание и взаимосвязи такого файла программисту придётся описывать непосредственно.

В качестве родной целевой архитектуры используются архитектуры IA32 и x86-64. Присутствует неофициальное дополнение fasmarm, в котором родные целевые архитектуры ARM и ARM64. Реализация целевых архитектур, отличных от родной, аналогична подобной реализации на любом другом ассемблере - для этих целей используются макрокоманды и директивы определения данных.

Проект был начат в 1999 году Томашом Грыштаром (пол. Tomasz Grysztar), который на тот момент был студентом. Его исходный код был полностью написан на языке ассемблера TASM. Начиная с версии 0.90 (4 мая 1999) ассемблер fasm стал самодостаточен(его исходный код был адаптирован под родной диалект и собирался самим ассемблером fasm). В марте 2000 года fasm был опубликован в сети Интернет.

Изначально fasm запускался только из 16-разрядного плоского реального режима. Затем была добавлена поддержка 32-разрядности и в дополнение к ней поддержка DPMI. Исходный код был переписан таким образом, чтобы его легко можно было портировать под любую x86 операционную систему, поддерживающую 32-битную адресацию. Он был портирован на Windows, затем на Linux.

Fasm стремится использовать минимально возможный набор директив препроцессора, т.е. в предустановленном наборе директив не допускается внедрение новых директив, функциональность которых может быть достигнута имеющимся набором директив. Исключение исторически сложившиеся взаимозаменяемые директивы.

Fasm — многопроходный ассемблер с оптимистическим предсказанием, т.е. на первом же проходе ассемблер делает предположение, что все инструкции принимают свою минимально возможную по размеру форму. Многопроходность также позволяет неограниченно использовать выражения до их объявления.

Fasm не включает в выходной файл объявления не используемых процедур (реализовано посредством макрокоманд).

Содержимое выходного файла зависит только от содержания исходного кода и не зависит от окружения операционной системы или от параметров переданных в командной строке. Для тех кому данный принцип был неудобен для win32 была разработана обертка FA, позволяющая подключить к файлу другой файл не непосредственно в коде, а через командную строку.

Исходный код для fasm может собираться сразу в исполняемый файл, минуя стадии создания промежуточных объектных файлов и их компоновки.

Процесс компиляции

[править | править код]

Компиляция программы в fasm состоит из трёх стадий: препроцессирование, синтаксический анализ и ассемблирование.

Препроцессирование

[править | править код]

Первая стадия (препроцессинг) выполняется в 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 и завершается:

Усложнённый вариант, с уточнением секций в PE-файле:

Пример простой консольной программы в формате .COM:

Пример простой программы в формате ELF:

Формат выходных файлов

[править | править код]

С помощью директивы format можно указать следующие форматы выходных файлов:

  • MZ — исполняемые файлы DOS.
  • PE — исполняемые файлы Windows (консольные, графические приложения и динамические библиотеки).
    • PE64 — исполняемые файлы 64-битных версий Windows.
  • COFF, MS COFF, MS64 COFF — объектные файлы.
  • ELF, ELF64 — исполняемые файлы в Unix-подобных системах.
  • ARM — разработка энтузиастов [5].
  • Binary — файлы произвольной структуры. Указав смещение 100h (org 100h), можно получить исполняемый файл формата .COM. Также с помощью format binary можно компилировать файлы данных[6].

Операционные системы

[править | править код]
  • DOS;
  • Windows: NT, XP, Vista, 7;
  • Основанные на Linux — напрямую, через системные вызовы;
  • FreeBSD;
  • Другие, основанные на libc (Unix-подобные);
  • MenuetOS, KolibriOS — не поставляется в стандартном пакете fasm, поставляется вместе с этими операционными системами.

Применение

[править | править код]

Операционные системы, написанные на FASM:

  • DexOS — автор Ville Turijanmaa
  • MenuetOS — 32- и 64-битные графические операционные системы, автор Ville Turijanmaa
    • KolibriOS — форк MenuetOS

Компиляторы, использующие FASM как бекэнд ассемблер:

IDE, основанное на FASM:

  • Fresh — проект, поддерживаемый интернет сообществом, основанный John Found

Поддержка fasm в сторонних программных продуктах

[править | править код]

Файл поддержки синтаксиса fasm поставляется вместе с базовым пакетом Vim.

Использование fasm поддерживают многие специализированные IDE, такие как RadASM, WinAsm Studio, Fresh (специально спроектированный под fasm) и т. д.

Примечания

[править | править код]
  1. 1 2 Flat assembler download (англ.). flatassembler.net. Дата обращения: 26 августа 2019. Архивировано 31 августа 2019 года.
  2. https://github.com/tgrysztar/fasm/blob/752cc50465e38a98a2b6ed1161983988e4d5f61a/LICENSE.TXT
  3. Tomasz Grysztar. Flat Assembler Programmer’s Manual (англ.). Дата обращения: 27 мая 2012. Архивировано из оригинала 31 мая 2012 года.
  4. Randall Hyde. Which Assembler is the Best? (англ.). Дата обращения: 27 мая 2012. Архивировано из оригинала 31 мая 2012 года.
  5. FASM ARM (англ.). flatassembler.net. Дата обращения: 27 сентября 2022. Архивировано 27 сентября 2022 года.
  6. Тема на официальном форуме о создании изображений с помощью макросов fasm (англ.). Дата обращения: 26 августа 2019. Архивировано 4 августа 2020 года.