|
||||||||||||||||||||||||||||||||||||||||||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
ТРАНСЛЯЦИЯ С ЯЗЫКА АССЕМБЛЕРА
Большинство конструкций языка ассемблера с точки зрения синтаксиса, исключая арифметические выражения, которые могут присутствовать в поле операндов, описываются с помощью автоматных грамматик и в основе синтаксического анализатора большинства ассемблеров лежит модель конечного автомата. Нейтрализация ошибок здесь тривиальна, так как каждая команда на языке ассемблера представляется отдельной строкой и, встретив ошибку в строке и проидентифицировав ее, транслятор просто переходит к анализу следующей строки. На рис. 8.3 представлена упрощенная структура двухпроходного ассемблера. Напомним, что транслятор ассемблера обычно называется ассемблером, в отличие от языка ассемблера, который ассемблер транслирует в машинный код. Цель первого прохода – получить всю информацию о местоположении идентификаторов (имен, меток), а второго, – непосредственно генерировать код. Для локализации имен в ассемблере предусмотрен счетчик адреса (ячеек). Идентификатор, обнаруженный в поле метки анализируемого оператора заносится в таблицу имен и ему ставится в соответствие текущее значение счетчика адреса. При просмотре программы происходит увеличение счетчика адреса на число байт, занимаемых операторами. При переходе от одного сегмента программы к другому счетчик адреса обнуляется. Таким образом, счетчик адреса – это указатель, динамически фиксирующий относительные позиции (смещения) операторов (команд или директив) внутри одного сегмента. Итак, на первом проходе строится таблица имен (см. таблицу 7.1), а на втором проходе эта таблица используется для формирования адресов операндов.
Таблица 8.1.
При работе ассемблер использует также две постоянные таблицы зарезервированных имен, содержащих всю необходимую информацию о командах и директивах. Там находятся мнемоники, коды операций и форматы, информация о длине, необходимая для увеличения счетчика адреса и т.п. В отличие от рассмотренного, однопроходный ассемблер работает эффективнее. Он может легко генерировать команды, где имена операндов уже известны, определяются в программе до их использования. Иное дело, когда команда ссылается на имя пока неизвестное и, определяемое, например, как имя переменной или метка команды идущей за анализируемой строкой. В этом случае в таблице имен (идентификаторов) появляется дополнительная информация – признак определения метки. Если какое-либо неопределенное ранее имя встречается в поле операнда команды или директивы, то это имя помещается в таблицу с отметкой о том, что адрес (смещение) для этого имени еще не известно. Вместо смещения в таблицу помещается указатель головы списка, хранящего адреса команд ссылающихся на данную, пока неопределенную метку. После того, как данное имя появится в программе в поле метки и для него будет определено смещение, то ассемблеру достаточно “пробежаться по списку” ссылавшихся на данное имя команд и сформировать для них адреса операндов. Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.) |