fasm

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
flat assembler
FASM.PNG
Тип

компилятор

Разработчик

Томаш Грыштар

Написана на

ассемблер

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

DOS, Windows, UNIX-подобные (Linux, OpenBSD и др.), MenuetOS, KolibriOS, DexOS

Последняя версия

1.71.62[1] (8 мая 2017)

Лицензия

Вариант лицензии BSD с возможно анти-GPL исключением

Сайт

flatassembler.net

fasm (сокращение от flat assembler) — свободно распространяемый многопроходной ассемблер, написанный Томашем Грыштаром (польск. Tomasz Grysztar). fasm самодостаточен[1], изначально компилировался TASM’ом и стал способен собираться из собственных исходных кодов начиная с версии 0.90 (4 мая 1999). fasm обладает небольшими размерами и очень высокой скоростью компиляции, имеет богатый и ёмкий макро-синтаксис, позволяющий автоматизировать множество рутинных задач.[2][3] Поддерживаются как объектные форматы, так и форматы исполняемых файлов. Это позволяет в большинстве случаев обойтись без компоновщика. В остальных случаях нужно использовать сторонние компоновщики, поскольку таковой вместе с fasm не распространяется.

Помимо базового набора инструкций процессора и сопроцессора fasm поддерживает наборы инструкций MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, SSE4a, AVX и 3DNow!, а также EM64T и AMD64 (включая AMD SVM и Intel SMX).

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

Препроцессирование[править | править вики-текст]

На стадии препроцессора раскрываются все макросы, символические константы, обрабатываются директивы препроцессора.

В отличие от стадии ассемблирования, препроцессирование выполняется только 1 раз. Смешивание стадий ассемблирования и препроцессирования — распространённая ошибка начинающих.[источник не указан 2093 дня]

Ассемблирование[править | править вики-текст]

На стадии ассемблирования определяются адреса меток, обрабатываются условные директивы, раскрываются циклы и генерируется собственно программа. 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 — исполняемые файлы Windows (консольные, графические приложения и динамические библиотеки).
    • PE64 — исполняемые файлы 64-битных версий Windows.
  • COFF, MS COFF, MS64 COFF — объектные файлы.
  • ELF, ELF64 — исполняемые файлы в UNIX-подобных системах.
  • ARM — разработка энтузиастов, можно найти на официальном форуме.
  • Binary — файлы произвольной структуры. Указав смещение 100h (org 100h), можно получить исполняемый файл формата .COM. Также, с помощью format binary можно компилировать файлы данных.[4]

Операционные системы[править | править вики-текст]

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

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

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

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

Примечания[править | править вики-текст]

  1. 1 2 Flat assembler download
  2. Tomasz Grysztar. Flat Assembler Programmer’s Manual (англ.). Проверено 27 мая 2012. Архивировано 31 мая 2012 года.
  3. Randall Hyde. Which Assembler is the Best? (англ.). Проверено 27 мая 2012. Архивировано 31 мая 2012 года.
  4. Тема на официальном форуме о создании изображений с помощью макросов fasm

Ссылки[править | править вики-текст]