WikiSort.ru - Не сортированное

ПОИСК ПО САЙТУ | о проекте

flat assembler
Тип компилятор
Разработчик Томаш Грыштар
Написана на ассемблер
Операционная система UNIX-подобные (Linux, OpenBSD и др.), DOS, Windows, MenuetOS, KolibriOS, DexOS
Первый выпуск 1999
Последняя версия 1.73.09 [1] (17 февраля 2019)
Лицензия Вариант лицензии 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 раз. Смешивание стадий ассемблирования и препроцессирования — распространённая ошибка начинающих.[источник не указан 2694 дня]

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

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

Примечания

Ссылки

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2024
WikiSort.ru - проект по пересортировке и дополнению контента Википедии