Fasm | это... Что такое Fasm? (original) (raw)

fasm

flat assembler
FASM.PNG
Тип компилятор
Разработчик Томаш Грыштар
ОС 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 раз. Смешивание стадий ассемблирования и препроцессирования — распространённая ошибка начинающих.

Ассемблирование

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

Формат записи инструкций

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

Единственное существенное отличие от формата, принятого в других ассемблерах (MASM, TASM в режиме совместимости с MASM) — значение ячейки памяти всегда записывается как [label_name], а просто label_name означает адрес (то есть порядковый номер) ячейки. Это позволяет обходиться без ключевого слова offset. Также в fasm при переопределении размера операнда вместо byte ptr пишется просто byte, вместо word ptrword и т. д. Не позволяется использовать несколько квадратных скобок в одном операнде, таким образом вместо [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 можно указать следующие форматы выходных файлов:

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

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

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

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

Примечания

  1. Tomasz Grysztar. Flat Assembler Programmer’s Manual(англ.)
  2. Randall Hyde. Which Assembler is the Best? (Какой ассемблер лучший?)(англ.)
  3. Тема на официальном форуме о создании изображений с помощью макросов Fasm

Ссылки

Программные пакеты для программирования на ассемблере
Среды разработки ПО RadASMWinAsm • ASMedit • Easy Code • Fresh • GSS Visual Assembler
Трансляторы MASMgasfasmNASMRosASMTASMYasmHLASMпрочие…

Wikimedia Foundation.2010.