Fasm (язык программирования)

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
fasm
Класс языка язык ассемблера
Тип исполнения компилируемый
Появился в 1999
Автор Томаш Грыштар
Расширение файлов .asm - для файлов кода, .inc - для подключаемых файлов
Система типов отсутствует
Основные реализации ассемблер fasm, ассемблер fasmarm, [[Fresh_(IDE)]]
Испытал влияние изначально TASM, NASM, в новейшем периоде fasmg (язык программирования)
Повлиял на fasmg (язык программирования)
Лицензия Вариант лицензии BSD с возможно анти-GPL исключением
Сайт flatassembler.net

fasm (сокращение от flat assembler) — разновидность языка ассемблера.

История[править | править код]

Проект был начат в 1999 году Томашом Грыштаром (польск. Tomasz Grysztar).

Принципы[править | править код]

Fasm стремится использовать минимально возможный набор директив препроцессора, т.е. в предустановленном наборе директив не допускается внедрение новых директив, функциональность которых может быть достигнута имеющимся набором директив.

Синтаксис[править | править код]

Символьный интервал языка[править | править код]

Ориентированность на широкий спектр операционных систем (не все из которых поддерживают многобайтовые символы), ограничивает используемую в исходных текстах палитру допустимых символов до однобайтовых вариаций.

Под абстракцией «символ» воспринимается символ с привязкой к конкретному ASCII коду, а не конкретному начертанию.

В палитре символов можно выделить отдельные группы:

  • местозаполнитель между токенами:
    • ASCII код 9 (Табуляция)
    • ASCII код 32 (Пробел)
  • разделитель строк:
    • ASCII код 10 (Разрыв строки)
    • ASCII код 13 (Возврат каретки)
  • кавычки:
    • ASCII код 34 (Двойные кавычки «"»)
    • ASCII код 39 (Одинарные кавычки «'»)
  • специальные символы:
    • ASCII код 35 (Решетка «#»)
    • ASCII код 38 (Амперсанд «&»)
    • ASCII код 40 (Открывающая круглая скобка «(»)
    • ASCII код 41 (Закрывающая круглая скобка «)»)
    • ASCII код 42 (Знак умножения «*»)
    • ASCII код 43 (Знак плюс «+»)
    • ASCII код 44 (Запятая «,»)
    • ASCII код 45 (Знак минус «-»)
    • ASCII код 46 (Точка «.»)
    • ASCII код 47 (Знак деления «/»)
    • ASCII код 58 (Двоеточие «:»)
    • ASCII код 59 (Точка с запятой «;»)
    • ASCII код 60 (Знак меньше «<»)
    • ASCII код 61 (Знак равно «=»)
    • ASCII код 62 (Знак больше «>»)
    • ASCII код 91 (Открывающая квадратная скобка «[»)
    • ASCII код 92 (Обратный слеш «\»)
    • ASCII код 93 (Закрывающая квадратная скобка «]»)
    • ASCII код 96 (Апостроф «`»)
    • ASCII код 123 (Открывающая фигурная скобка «{»)
    • ASCII код 124 (Вертикальная черта «|»)
    • ASCII код 125 (Закрывающая фигурная скобка «}»)
    • ASCII код 126 (Тильда «~»)
  • Запрещенный для использования в исходном тексте:
    • ASCII код 0 (Пустой символ)
  • Запрещенный для использования в тексте инструкций:
    • ASCII код 26 (Подстановка «→»)

Исходный текст[править | править код]

Исходный текст представляет собой последовательность строк, они собираются из строк основного файла, из строк подключаемых файлов к основному, из строк подключаемых файлов к ранее подключенным файлам и т.д.

Текст любого основного или подключаемого файла обычно представлен всем содержимым этих файлов, но он также может быть принудительно завершен первым встреченным символом с ASCII кодом 0, при этом сам символ конца текста не является частью текста, поэтому этот символ не может появиться в исходном тексте.

Каждая строка исходного текста может быть пустой или содержать текст инструкции и/или текст комментария.

Текст комментария[править | править код]

Единственный предустановленный тип комментария – однострочный, каждый такой комментарий начинается с символа точки с запятой «;» и заканчивается разрывом строки.

Текст инструкции[править | править код]

Каждая инструкция начинается с новой строки и заполняет все пространство этой строки не занятое под комментарий. Также, никакая инструкция не может закончиться символом обратного слеша «\» (без учета пробелов и табуляций после него), если этот символ последний в пространстве строки занятом текстом инструкции, то на его место (ставится пробел, а затем) к инструкции прикрепляется содержимое следующей строки, и так далее с неограниченным уровнем вложенности.

Над текстом каждой инструкции обязательно проводится токенизация (разбор на элементы), для внутренних нужд компилятора в процессе этого разбора задействован символ с ASCII кодом 26, поэтому непосредственно использовать его в тексте инструкций нельзя.

На уровне инструкций можно создать иллюзию многострочного комментария. Но природа такого комментария будет унаследована от инструкций, над его текстом будет произведен разбор элементов на типы, и, следовательно, будет запрещено использование внутри такого комментария символ с ASCII кодом 26.

Токены[править | править код]

Тело любой инструкции представляет собой последовательность элементов (токенов), каждый из которых может принадлежать одному из трех разных типов: 1 - самостоятельный символ, 2 - непрерывный токен и 3 - строка в кавычках.

Первый тип токена – представляет собой односимвольный элемент и воспринимается в тексте инструкции как самостоятельный символ независимо от того отделен ли он от текста соседних элементов или выполнен с ними слитно. Палитра односимвольных  элементов немногочисленна: «+-*/=<>()[]{}:,|&~#`» - является подмножеством специальных символов.

Второй тип токена – представляет собой многосимвольный элемент, последовательность символов которого в тексте инструкции начинается с символа отличного от кавычек (двойных «"» и одинарных «'»), выполнена слитно и не включает самостоятельных символов.

Третий тип токена – также представляет собой многосимвольный элемент,  но последовательность символов которого в тексте инструкции начинается с символа кавычек (не важно двойных «"» и одинарных «'») и не заканчивается пока в пределах строки не будет встречен символ такой же кавычки, даже символ точки с запятой «;» будучи встреченным в пределах такой последовательности не открывает никакого комментария, а просто становится символом этой последовательности. Если после завершающей кавычки слитно стоит символ такой же кавычки, то в последовательность включается 1 символ этой кавычки, а сама последовательность продолжается до следующего такого же символа кавычек. Внешние открывающая и закрывающая кавычки не становятся частью элемента, они лишь выполняют роль индикатора для его типизации.

Примечание: какие символы не могут стать частью строки в кавычках:

  • ASCII код 0 (Пустой символ) - не может появиться в исходном тексте, следовательно, не может появиться в символе в кавычках, являющимся частью исходного текста.
  • символы из группы разделитель строк – не позволят найти в пределах строки (т.к. строка завершится этими символами) завершающего символа кавычек, что сгенерирует соответствующую ошибку.
  • ASCII код 26 (Подстановка «→») не может появиться в инструкции, следовательно, не может появиться в символе в кавычках, являющимся частью инструкции.

Ссылки[править | править код]