Что такое ассемблер?
Языки ассемблеров Команды языка ассемблера Код операции Псевдооперации Литералы Свободный формат команд Некоторые типичные команды ассемблера для машин с побайтовой организацией Ассемблеры типа «трансляция — выполнение» Однопроходный ассемблер Двухпроходный ассемблер Символы Подробная блок-схема прохода Подробная блок-схема прохода 2 Пример трансляции Таблицы символов общие замечания Обработка таблицы Линейный поиск Двоичный поиск Сравнение двоичного и линейного способов поиска Метод хеширования Пример хеширования Скученность Назначение макрокоманды Различие между макрокомандами и подпрограммами Форматы макрокоманды Ключевой макрос Макропроцессор |
Двухпроходный ассемблерБольшинство существующих ассемблеров используют два прохода для выработки двоично-символической формы подпрограммы или программы, предназначенной для последующей обработки редактором связей; иначе говоря, входной текст на исходном языке просматривается дважды. В небольших системах, не имеющих вспомогательной памяти, это вынуждает ассемблер дважды физически читать исходную колоду. Это серьезный недостаток, но в среде операционной системы ассемблер в большинстве случаев будет читать не карты, а их образы, вероятнее всего с диска. Даже если ввод производится непосредственно с устройства считывания перфокарт, на первом проходе обычно создается копия колоды карт исходного текста для более быстрого ввода на втором проходе. В этих случаях потери времени на повторное чтение в значительной мере компенсируются преимуществами, получаемыми в результате разделения процесса трансляции, на две фазы. Основная стратегия двухпроходного ассемблера очень проста. Первый проход собирает все определения символов в таблицу символов (см. разд. 5.4), после чего второй проход может генерировать фактические машинные команды и адреса, используя определения, собранные на первом проходе. Сложной ситуаций, которая возникает, если символ появляется в поле адреса команды прежде, чем он был определен, можно набежать, просмотрев всю исходную программу перед подстановкой фактических адресов. Однако, если программа составлена из нескольких подпрограмм, не исключена возможность, что некоторые адреса могут остаться неопределенными даже после выполнения прохода 1. Во всех ассемблерах, кроме самых примитивных, допускается использование не, только локальных символов, но также и внешних, или глобальных, символов. |