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

Символы

Локальный символ обладает некоторым значением Только в подпрограмме, в которой он был определен. Перемещаемый адрес, т. е. адрес символа относительно начала программы или программного сегмента, присваивается ему во время трансляции. Локальные символы всегда должны быть определены в программе или сегменте, в котором они используются.

В то же время в различных автономно транслируемых подпрограммах конкретной программы могут определяться и использоваться общие для этих подпрограмм глобальные символы. Обычно их адреса могут быть определены только во время редактирования связей (или во время загрузки, если редактирование связей выполняется загрузчиком), когда доступны все части программы. По этой причине ассемблер должен также вырабатывать информацию о неопределенных адресах и глобальных символах для редактора связей или загрузчика.

Специальные псевдооперации, такие, как ENTRY (входной) и EXTRN (внешний), служат для указаний о том, что на связанный с ними символ можно ссылаться из других подпрограмм.

Все внешние имена данных должны быть перечислены либо в начале, либо внутри программы или программного сегмента, в котором они используются. Для того чтобы избежать путаницы между глобальными и локальными символами, символические имена обычно рассматриваются как локальные, если не оговорено противное. Большинство ассемблеров требует также, чтобы локальные символы были определены посредством их однократного появления в поле метки. При этом текущее значение счетчика размещения дает адрес данного символа. Для развитых систем этот адрес является перемещаемым и будет преобразован в абсолютный только на стадии загрузки.

Определение каждого имени данных утомительно для программиста, но обеспечивает защиту от ошибок. Любое ошибочное имя окажется после трансляции неопределенным именем. И наоборот, решение, связанное с автоматическим выделением памяти при использовании какого-либо символа в качестве имени данных, удобно для программиста, но не обеспечивает контроля часто встречающихся на практике ошибок, связанных с неправильным написанием имен. (Такое соглашение принято в некоторых языках высокого уровня, например в ФОРТРАНе.) Иногда встречаются компромиссные решения, такие, как автоматическое выделение памяти для любого символа, перед которым записан специальный знак. При этом все остальные символы либо должны появляться ровно один раз в поле метки, либо в противном случае они трактуются как глобальные. Все остальные сегменты программы, равно как и справочник библиотеки программ, привлекаются для поиска необработанных входных точек и неопределенных внешних имен.

Hosted by uCoz