Что такое ассемблер?
Языки ассемблеров Команды языка ассемблера Код операции Псевдооперации Литералы Свободный формат команд Некоторые типичные команды ассемблера для машин с побайтовой организацией Ассемблеры типа «трансляция — выполнение» Однопроходный ассемблер Двухпроходный ассемблер Символы Подробная блок-схема прохода Подробная блок-схема прохода 2 Пример трансляции Таблицы символов общие замечания Обработка таблицы Линейный поиск Двоичный поиск Сравнение двоичного и линейного способов поиска Метод хеширования Пример хеширования Скученность Назначение макрокоманды Различие между макрокомандами и подпрограммами Форматы макрокоманды Ключевой макрос Макропроцессор |
Подробная блок-схема проходаНа рис. 5.2 показано, как на проходе 1 двухпроходного ассемблера каждому символу однозначно приписывается адрес. Ниже кратко поясняются отдельные шаги, изображенные, на рисунке. Так как все перемещаемые адреса отсчитываются от начала программы, в счетчик размещения (или программный счетчик) (LC) первоначально устанавливается нуль. Затем операторы исходного текста читаются последовательно с устройства ввода. Каждый оператор исследуется в отдельности для того, чтобы приписать некоторую ячейку каждой машинной команде или данным, определяемым псевдооперацией, и таким образом определить значения символов, появляющихся в полях меток исходной программы. Это выполняется следующим образом. Сначала поле операции текущего оператора сопоставляется с таблицей псевдоопераций. В этой таблице перечислены мнемонические коды псевдоопераций, с каждой из которых связывается указатель подпрограммы ассемблера, обрабатывающей рту операцию. Если совпадение обнаружено, выполняется анализ соответствующей подпрограммы. Так как проход 1 связан только с псевдооперациями, которые определяют символы или влияют на счетчик размещения, такие псевдооперации, как USING, DROP или START, сразу приводят к передаче управления в точку, в которой анализируются поля метки (1 на рис. 5.2) и обработка продолжается. Если встречаются псёвдооперации DS (определить память) или DC (определить константы), то рассматривается поле операнда для определения требуемого числа байтов. Если это необходимо, счетчик размещения предварительно настраивается для выполнения определенных условий выравнивания. Например, полные слова должны начинаться с границы слова. Такая псевдооперация, как Если код операции отсутствует в таблице псевдоопераций, соответствующий ему элемент ищется в таблице кодов операций машины. Эта таблица содержит мнемонические обозначения для всех существующих машинных кодов, причем мнемонические обозначения являются ключами таблицы. Каждому ключу соответствует однобайтовый двоичный код операции, эквивалентный генерируемому машинному коду. Кроме того, в таблице обычно хранятся длина и формат команды, используемые для коррекции счетчика размещения и формирования точного эквивалента команды на машинном языке. Если код операции не найден ни в таблице псевдоопераций, ни в таблице кодов-операций машины, выдается сообщение об ошибке и оператор пропускается. Если же код найден, из таблицы получается длина команды (L). В машинах с пословной организацией каждая команда занимает одно слово, а в машинах с побайтовой организацией — 2, 4 или 6 байт. Поле операнда исходного оператора анализируется на присутствие литералов. Если обнаружен новый литерал, его значение и формат заносятся в таблицу литералов, которая должна быть обработана в конце прохода 1 и на проходе 2. Затем просматривается поле метки оператора. Если там расположен символ, он заносится в таблицу символов вместе с текущим значением счетчика размещения, Если исходная программа считывалась. на проходе 1 с медленного устройства, копия исходного оператора записывается на диск или магнитную ленту для ускорения ввода на проходе 2. Наконец, счетчик размещения увеличивается на длину команды, и читается следующий оператор. 1) Для простоты рассматриваются только ассемблеры без макро возможностей. Расширение для макроассемблеров будет обсуждаться в разд. 5.5. Этот цикл продолжается до тех пор, пока не встретится псевдооперация ENEXs-Ее появление заканчивает проход 1, но, прежде чем управление будет передано на проход 2, отводятся места для литералов, которые появились в полях адреса при выполнении прохода 1. Эта процедура аналогична подобной процедуре для операции DC (определить константы). Единственное отличие заключается в том, что литералы размещаются в основной памяти сразу после команд программы, за исключением случая специальных указаний о их расположении, заданных посредством псевдооперации LTORG. Выполняются также и другие операции, такие, как нахождение символов, определенных с помощью псевдоопераций EQU, для отождествления их адресов. |