flat assembler
Message board for the users of flat assembler.

Index > Compiler Internals > manuals in other languages (not translations of the original

Author
Thread Post new topic Reply to topic
ProMiNick



Joined: 24 Mar 2012
Posts: 816
Location: Russian Federation, Sochi
ProMiNick 13 May 2021, 00:10
Hello Tomasz, I willing to help Aiwan to make good manual (not google translation of original one).
So for increasing understanding of readers I decided to restructure original one:
First of all I wish to describe flat assembler in more detail.
I left introduction what fasm is.
But at next I willing to describe stages, than principles on that fasm built on.
Than I left description of user interfaces for console & IDE variations.
Than compiler syntax, but I prefer to start it with description of character|symbol pallette with classifing of that symbols.
Than data directives, expression resolving, lanels & constants - I not decided about their order exactly.
Than instruction syntax generalized for macros and assembly instructions.
Registers, Size specifiers, jump & calls, and description that used intel syntax moved to separate assembly syntax (that itself not encapsulate instruction syntax & moved off from it).
Than instruction set and so on.
sorry for insertions into russion (that mostly fo me to preserve the narrative logic)
Compiler overview:
Quote:
1 Обзор компилятора
Flat assembler – быстрый многопроходный компилятор языка ассемблера. За счет совершения множественных проходов он позволяет использовать выражения до их объявления, разрешает использование условий и циклов. Если в качестве целевой используется архитектура x86, являющаяся для данного ассемблера «родной», то для нее (для каждого конкретного исходного текста) за счет множественных проходов генерируется минимально возможный по размеру машинный код.
Исходные тексты flat assembler представлены на языке самого flat assembler.
Логика компилятора рассчитана на выполнение в любом окружении архитектуры x86 c 32-разрядной или c 64-разрядной адресацией памяти, но обязательно с возможностью получения программой всех необходимых ресурсов в пределах 32-разрядных адресов. Эта логика построена поверх абстракций функционалов работы с файлами, памятью и пользовательским интерфейсом, поэтому независима от окружающей операционной системы. Реализация компилятора под определенной операционной системой сводится к реализации вышеописанных абстракций посредством обращения к api и системным вызовам окружения, затем совмещение этого всего в формате исполняемого файла для данной операционной системы. Благодаря этому номер версии компилятора Flat assembler сквозной для реализаций под всеми операционными системами, для которых эта реализация существует.
В основном компилятор представлен в виде консольных приложений окружающей операционной системы, но для Windows он дополнительно представлен в виде IDE с графическим интерфейсом и встроенным редактором, а также в виде динамически подгружаемой библиотеки.
Консольные реализации компилятора имеют имя fasm и расширение стандартное для исполняемых файлов операционной системы, реализация в виде динамически подгружаемой библиотеки называется fasm.dll, а реализации в виде IDE называются fasmw.exe (для графического интерфейса Windows) и fasmd.exe (для интерфейса DPMI DOS совместимого).

Compiler stages|Compiler internals|Compiler logic:
Quote:
1.1 Внутреннее устройство (логика) компилятора
Процесс компиляции разбит на несколько стадий выполняющихся в строгой последовательности друг за другом.
Две первых стадии считывание исходного текста (source reader) и препроцессирование (preprocessor) выполняются построчно, причем под строкой здесь понимается абстрактная строка, полученная в процессе считывания исходного текста, которая может быть, как отдельной строкой исходного текста, так и быть сцепленной из нескольких таких строк.
Следующая стадия - лексический анализ (parser), применяется ко всему тексту, полученному на предыдущих стадиях, и добавляет к тексту дерево разбора лексем.
Следующая стадия – сборка (assembler), также применяется ко всему источнику, сформированному на предыдущей стадии, целиком (представляющему собой и уже обработанный препроцессором текст, изначально полученный считывателем, и дерево разбора лексем предыдущей стадии), и добавляет к источнику последовательность выходных байтов, полученных ассемблированием источника.
Последняя стадия – форматирование (formatter), также применяется ко всему источнику, сформированному на предыдущей стадии, целиком. Логика последней стадии происходит согласно с выбранным форматом для выходных данных. Она сводится к структурированию выходных данных предыдущей стадии, а именно, к добавлению структур, соответствующих формату и этим данным, а также к выравниванию определенных блоков этих данных по соответствующим адресам в выходном потоке и к изменению исходных адресов этих блоков в памяти. Последнее – это, фактически, применение к этим адресам стадии сборки повторно, но с учетом их смены адреса.


than principles on that fasm built on
Quote:
1.2 Принципы заложенные в компилятор
Основополагающий принцип данного ассемблера, который, собственно, и дал название самому ассемблеру – это плоскость процедуры сборки исходного текста (flat assembly of assembler stage). Принцип заключается в том, что порядок в последовательности выходных байт не может быть переопределен на стадии сборки, и если в таком переопределении порядка есть необходимость, то оно производится на более ранних стадиях, а именно на стадии препроцессирования. В качестве примера работы данного принципа можно взять смешивание кода и данных в исходном тексте, что во многих других ассемблерах приведет к разнесению кода и данных в выходном потоке, а в случае с flat assembler подобное разнесение произойдет только, если на стадии препроцессирования будет определен сбор кода и данных в отдельные блоки, и на стадию сборки исходный текст попадает уже преобразованным в эти блоки, иначе в выходном потоке код и данные будут смешаны в точности также, как в исходном тексте.
Следующий принцип также относится к стадии сборки – это оптимистическая многопроходность (optimistic multypass assembly). Принцип заключается в том, что вначале делается попытка кодировать все инструкции в самую короткую форму, не противоречащую всем модификаторам явно указанным в инструкции, и лишь при неудачной попытке кодирования использовать более длинные формы инструкции.
Следующий принцип также относится к стадии сборки – это разрешение кода (code resolving). Принцип заключается в том, что метки, которые являются константами с точки зрения программиста, на самом деле являются переменными времени сборки, постоянно обновляемые при каждом проходе. Именно этот принцип накладывает ограничение на обработку различных блоков, таких как IF и REPEAT, которые могут зависеть от значения таких меток, и поэтому вычисляемые также на стадии сборки во время каждого из проходов.
Следующий принцип также относится к стадии сборки – это гибкость ассемблерного кода (assembly code flexibility), он заключается в том, что для формирования в коде любой полезной нагрузки отсутствует необходимость кодировать какую-либо инструкцию «родной» архитектуры через директивы определения данных. Реализуется этот принцип за счет возможности в любом месте исходного текста переопределить битность кода или расчетный адрес размещения в памяти, а также за счет поддержки в ассемблере всех официально документированных инструкций «родной» архитектуры во всех возможных вариациях битности, адресации, размеров операндов. Из-за требования однозначности процесса компиляции каждая такая вариация кодируется единственным способом. Из соображений оптимизации этот единственный способ кодирования еще и минимальный по размеру. Поэтому на реализацию альтернативных способов кодирования одной и той же вариации инструкции этот принцип не распространяется. Данный принцип не распространяется также и на инструкции «не родных» архитектур, для которых не существует иного способа кодирования как через директивы определения данных.
Следующий принцип также относится к стадии сборки – это гибкость структурирования данных (structuring flexibility). Принцип заключается в том, что структурирование посредством определения меток, переменных и констант не ограничивается диапазонами расчетных адресов, занимаемыми кодом и данными выходного потока, и за пределами этих диапазонов структурирование может происходить таким же способом в пределах произвольно адресованных виртуальных блоков. Принцип не отменяет возможности представления структур в качестве цепочек констант со значениями смещений полей этих структур, а дополняет. Реализуется этот принцип за счет возможности в любом месте исходного текста организовать произвольно адресованный виртуальный блок, содержимое которого подобно содержимому кода и данных формирующих выходной поток, но его содержимое не формирует выходной поток, а лишь используется в обработке данных и вычислениях. Структурирование виртуального блока это как раз частный случай использования определенных внутри этого блока меток, переменных и констант для вычислений.
Следующий принцип относится к синтаксису ассемблера – это обязательное использование квадратных скобок для доступа к операндам в памяти (square brackets for memory operands).
Следующий принцип также относится к синтаксису ассемблера – это требование осведомленности о размере ячейки адресуемой операндом в памяти (memory cell size requirement). Принцип заключается в том, что размер ячейки памяти определяется либо из значения модификатора размера указанного перед этой ячейкой, либо при его отсутствии из значения размера метки использованной для адресации этой ячейки. Принцип реализуется за счет наличия у меток информации о типе переменной.
Следующий принцип относится ко всему компилятору в целом – это принцип SSSO (same source – same output). Принцип заключается в том, что все настройки, которые могут повлиять на выходной поток, определены только в исходном тексте и их достаточно, чтобы сформировать именно тот выходной поток, который был задуман программистом. Принцип реализуется за счет того, что все директивы форматирования прописываются в исходном тексте, они достаточны для формирования выходного потока в определенном формате, и не могут быть переопределены извне, например, не предусмотрено какого либо влияния на форматирование из параметров командной строки. Однако этот принцип не распространяется на само формирование исходного текста, ведь он может быть сформирован из множества файлов, которые на другом компьютере имеют другое содержание, а путь к этим файлам зависит от переменной среды, которая также может отличаться на других компьютерах.
Последний принцип, но не последний по значимости, относится к стадии препроцессирования – это сложные решения за счет минимально простого набора средств (complex solutions via minimal set of simplest ones). Принцип заключается в том, что возможности препроцессора всегда представлены минимально достаточным набором для реализации всех макросов, расширение подобного набора может быть обосновано только необходимостью внедрения нового функционала и невозможностью эффективной реализации этого функционала на старом наборе, в отличие от реализации на расширенном.

....


but back to stages.
I made assumption that at formatter stage (only on that stage) inited handling of formatting directives: format, segment, section and so on.
so formatter encapsulate outer stream of previous stage with strtucturing it to new format: adding format specific structures and filling them according to format & output data itself, rearranging and alligning blocks gained from previous stage, and...
And here is question: ...That blocks changes addresses they load in memory - so assembling for that blocks maded again (maybe in simplier form), or some format specific keywords operated at assembly stage before formatter starts?

_________________
I don`t like to refer by "you" to one person.
My soul requires acronim "thou" instead.


Last edited by ProMiNick on 20 May 2021, 00:37; edited 4 times in total
Post 13 May 2021, 00:10
View user's profile Send private message Send e-mail Reply with quote
idle



Joined: 06 Jan 2011
Posts: 440
Location: Ukraine
idle 13 May 2021, 06:50
Fluently ;)
Post 13 May 2021, 06:50
View user's profile Send private message Reply with quote
Display posts from previous:
Post new topic Reply to topic

Jump to:  


< Last Thread | Next Thread >
Forum Rules:
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Copyright © 1999-2025, Tomasz Grysztar. Also on GitHub, YouTube.

Website powered by rwasa.