fasm

Материал из Seo Wiki - Поисковая Оптимизация и Программирование
Перейти к навигацииПерейти к поиску
flat assembler
Тип компилятор
Разработчик Томаш Грыштар
ОС DOS, DexOS, Win32, основанные на Linux, BSD, MenuetOS
Версия 1.68 (6 июля 2009)
Тестовая версия 1.69.12 (10 февраля 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) — значение ячейки памяти всегда записывается как [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 можно указать следующие форматы выходных файлов:

  • 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) и т. д.

Примечания

Ссылки

de:Flat Assembler en:FASM es:Flat assembler fr:FASM it:FASM pl:FASM sr:Флет асемблер tr:Flat Assembler