fasm

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

компилятор

Разработчик

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

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

DOS, DexOS, Win32, Linux, BSD, MenuetOS, KolibriOS

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

1.71.22[1] (Linux/Unix/DOS/Windows 28 сентября 2014)

Лицензия

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

Сайт

flatassembler.net

flat assembler (fasm) — свободно распространяемый многопроходной ассемблер, написанный Томашем Грыштаром (польск. Tomasz Grysztar). fasm написан на самом себе[1], обладает небольшими размерами и очень высокой скоростью компиляции, имеет богатый и ёмкий макро-синтаксис, позволяющий автоматизировать множество рутинных задач.[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 раз. Смешивание стадий ассемблирования и препроцессирования — распространённая ошибка начинающих[источник не указан 1160 дней].

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

На стадии ассемблирования определяются адреса меток, обрабатываются условные директивы, раскрываются циклы и генерируется собственно программа. 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) и т. д.

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

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