13_Схема работы транслятора с языка Ассемблер (В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования), страница 2
Описание файла
Файл "13_Схема работы транслятора с языка Ассемблер" внутри архива находится в папке "В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования". PDF-файл из архива "В.Г. Баула - Введение в архитектуру ЭВМ и системы программирования", который расположен в категории "". Всё это находится в предмете "практика расчётов на пэвм" из 1 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 2 страницы из PDF
13.1 показана таблица имён пользователя, которая построится синтаксическим анализатором при просмотре показанной выше программы до предложенияmov ax,Data1Напоминаем, что если имя пользователя встречается в позиции метки или в параметрах директивыextrn, то это его описание или объявление, а если имя встречается в поле операндов или в коде операции(для имён макрокоманд) – то это использование имени. Все используемые в программном модуле имена пользователя, естественно, должны быть описаны или объявлены в этом же модуле.2Здесь есть небольшая тонкость. Хотя передать управление на команду, помеченную, например, меткой Lв другом сегменте этого же модуля можно только по команде дальнего перехода jmp far ptr L , однакотип этой метки в данном модуле всё равно будет равен near=-1 (т.е.
type L=near ).4включительно. Атрибуты, которые не могут быть у данного имени, отмечены прочерком.ИмяDataSegmentOffsetType–––Valuei16=?Data–––00ABData21––––––CodeX2––––––0i16=?i16=?i16=?-2–––Рис. 13.1. Вид таблица имён модуля после анализапредложения mov ax,Data .Как мы уже знаем, значения атрибутов некоторых имён остаются неизвестными на этапе компиляции, они будут определяться позже во время редактирования внешних связей и загрузки программы на выполнение. Такие значения мы обозначили в нашей таблице как i16=?. Для каждого заносимого в таблицу имени, кроме атрибутов, ещё запоминается и место в предложении, на котором встретилось это имя (т.е. отмечается, что имя уже описано или объявлено, или же только использовано досвоего описания или объявления).Итак, теперь синтаксический анализатор рассматривает предложениеmov cx,RВ этой команде используется имя R, однако, так как этого имени ещё нет в таблице имён.
В этомслучае оно заносится туда (ниже приведена строка таблицы для этого имени) Этого имени не было втаблице потому, что оно ещё не описано и про него ничего неизвестно, поэтому и все поля атрибутовв таблице имеют пока неопределённые значения:R????Соответственно, невозможно определить и точный код операции команды mov cx,R , так каквторой операнд этой команды, вообще говоря, может иметь любой из допустимых для этой командыформатов r16,m16 или i16. На этом примере ярко видна необходимость второго просмотра текста программы: только на втором просмотре, после получения информации об атрибутах имени R,возможно определить правильный формат этой команды (а значит, в частности, определить и длинуэтой команды в байтах).После полного просмотра программы синтаксический анализатор построит таблицу имён, показанную на рис.
13.2.1ИмяDataSegmentOffsetType–––0ValueI16=?AData–––0BData21––––––––––––0I16=?i16=?i16=?-2–––R––––––0-14LCode19-1–––CodeX2Рис. 13.2. Вид таблицы имён после анализа всего модуля.На этапе синтаксического анализа выявляются все синтаксические ошибки в программе, например:mov ax,bl; Несоответствие типовmov ax,L; Несоответствие типовadd A,A+2; Несуществующий формат командыsub cx; Мало операндов1Для простоты изложения мы все имена поместили в одну таблицу. В то же время имена, являющиесявходными точками (public), а также внешние имена модуля (extrn), либо должны иметь соответствующиедополнительные атрибуты, либо помещаться в другую таблицу внешних и входных имён. Информация о такихименах, как мы знаем, помещается компилятором с Ассемблера в паспорт объектного модуля.5и т.д.
Используя таблицу имён, синтаксический анализатор легко обнаруживает ошибки следующеговида:1. Неописанное имя. Имя не является внешним (extrn), но встречается только в позиции использования (в поле операндов) и ни разу не встречается в поле метки.2. Дважды описанное имя. Одно и то же имя дважды (или большее число раз) встретилось в поле метки.13. Описанное, но не используемое имя. Это предупредительное сообщение может выдаватьсянекоторыми "продвинутыми" Ассемблерами, если имя определено в поле метки, но ни разуне встретилось в поле операндов и отсутствует в параметрах директив public (видимо, программист что-то упустил).Кроме того, синтаксический анализатор может обнаружить и ошибки, относящиеся к модулю вцелом, например, превышение максимальной длины некоторого сегмента, отсутствие сегмента стекав головном модуле, использование метки команды (т.е.
имени с двоеточием) в предложении резервирования памяти и т.д.Итак, на втором проходе синтаксический анализатор обнаруживает все ошибки в программноммодуле и однозначно определить формат каждой команды.2 Теперь можно приступать к последнемуэтапу работы транслятора – генерации объектного модуля. На этом этапе все числа преобразуются вовнутреннее машинное представление, выписывается битовое представление всех команд, оформляется паспорт объектного модуля.
Далее полученный объектный модуль записывается в библиотекуобъектных модулей (обычно куда-нибудь в дисковую память).На этом мы завершим наше краткое знакомство со схемой трансляции исходного модуля с языкаАссемблера на объектный язык.Вопросы и упражнения1.2.Что означает, что компилятор с Ассемблера двухпроходный?Какую работу выполняет лексический анализатор транслятора? Приведите примеры лексических ошибок в программе.Что такое таблица лексем, когда она получается и для чего нужна?Как определить, когда в программе некоторое имя используется, а когда – описывается (объявляется)?Какие атрибуты есть у имён пользователя?Что такое таблица имён пользователя?Перечислите случаи, когда использование имени пользователя в позиции метки более одногораза не является ошибкой.Приведите примеры, когда конкретный формат команды может быть определён только на втором проходе компилятора.3.4.5.6.7.8.1Исключением из этого правила, как мы знаем, являются имена сегментов и имена процедур, которыедолжны встретиться в поле метки соответствующих директив ровно два раза, а также имена макроопределений(макроопределение, описанное позже, как мы знаем, переопределяет одноимённое макроопределение, описанное ранее).2Замечание для продвинутых читателей.
Вспомним, что при написании макроопределений мы использовали средства условной генерации для контроля типов переданных параметров и выдавали необходимую диагностику об ошибках использования макрокоманды. Этим мы, по существу, дополняли средства синтаксического анализатора Ассемблера. Таким образом, обычный пользователь-программист, используя макросредства, посуществу способен расширить возможности служебной программы – компилятора..