Cтраница 3
Обычно транслятор обрабатывает автокодные предложения в порядке их следования в тексте транслируемой программы, а порождаемые этими предложениями программные объекты ( команды, константы, резервируемые области памяти для переменных величин) последовательно размещает в памяти. Для этой цели транслятор при своей работе использует счетчик размещения. Очередной порождаемый программный объект размещается в памяти с байта, адрес которого является текущим значением счетчика размещения ( в случае необходимости счетчик предварительно продвигается на нужную целочисленную границу), и к счетчику прибавляется длина порожденного объекта, после чего этот счетчик опять указывает на очередной свободный байт. [31]
Для определения значений внутренних имен ассемблер в процессе своей работы использует счетчик размещения: к началу обработки каждого автокодного предложения, определяющего очередной объект программы, текущее значение этого счетчика полагается равным адресу, начиная с которого следует разместить в памяти данный объект. Если это предложение снабжено меткой, то в качестве значения этой метки принимается текущее значение счетчика размещения. [32]
Каждому ключу соответствует однобайтовый двоичный код операции, эквивалентный генерируемому машинному коду. Кроме того, в таблице обычно хранятся длина и формат команды, используемые для коррекции счетчика размещения и формирования точного эквивалента команды на машинном языке. [33]
С, помощью предложений подобного t ina программист может управлять работой транслятора, передавая ему различного рода указания. Например в разделе, посвященном именам, отмечалось, что в качестве значения имени-метки транслятор обычно принимает текущее значение счетчика размещения. Однако в случае необходимости программист может дать транслятору указание определить значение имени иным способом. [34]
При составлении автокодной программы иногда бывает удобно сослаться на текущее значение счетчика размещения. Это имя может фигурировать только в теле ачтокодных предложений ( но не в поле метки), а значением этого имени является текущее значение счетчика размещения в момент трансляции данного автокодного предложения, так что если это предложение является определяющим, то значением имени является адрес программного объекта, определяемого данным предложением. [35]
В начале своей работы ассемблер присваивает счетчику размещения некоторое начальное значение. Если бы к моменту трансляции было известно истинное начало ая данного модуля в памяти, то адрес йн и следовало бы принять в качестве начального значения счетчика размещения. Другими словами, ассемблер вырабатывает загрузочный модуль в предположении, что соответствующий ему абсолютный модуль будет размещен в памяти, начиная с ячейки С. Таким образом, значения внутренних имен определяются ассемблером с точностью до одного и того же слагаемого, значение которого определяется истинным началом этого модуля в памяти машины. [36]
Поле параметра ww содержит уменьшенное на единицу количество байтов, загружаемых из аргумента-выражения. При вычислении выражения используется 32 двоичных разряда, но по назначению употребляются лишь младшие разряды результата. К счетчикам размещения прибавляется длина загруженного объекта. [37]
В оощем случае они строятся из операндов, знаков арифметических операций ( - /) и круглых скобок, с помощью которых в случае необходимости задается требуемый порядок выполнения операций. Операндами могут быть имена ( в том числе и имя счетчика размещения), самоопределенные величины, а также ссылки на характеристику длины имени. [38]
Обычно транслятор обрабатывает автокодные предложения в порядке их следования в тексте транслируемой программы, а порождаемые этими предложениями программные объекты ( команды, константы, резервируемые области памяти для переменных величин) последовательно размещает в памяти. Для этой цели транслятор при своей работе использует счетчик размещения. Очередной порождаемый программный объект размещается в памяти с байта, адрес которого является текущим значением счетчика размещения ( в случае необходимости счетчик предварительно продвигается на нужную целочисленную границу), и к счетчику прибавляется длина порожденного объекта, после чего этот счетчик опять указывает на очередной свободный байт. [39]
Все внешние имена данных должны быть перечислены либо в начале, либо внутри программы или программного сегмента, в котором они используются. Для того чтобы избежать путаницы между глобальными и локальными символами, символические имена обычно рассматриваются как локальные, если не оговорено противное. Большинство ассемблеров требует также, чтобы локальные символы были определены посредством их однократного появления в поле метки. При этом текущее значение счетчика размещения дает адрес данного символа. [40]
![]() |
Исходная программа для трансляции ассемблером. 4. [41] |
Она фактически ничего не делает, и поэтому легко проследить за ее трансляцией. Читается первый исходный оператор исследуется его поле операции. START распознается как псевдооперация, и соответствующая директива в таблице псевдоопераций указывает, что дополнительной обработки на проходе 1 не требуется. Затем исследуется поле метки, и в таблицу символов заносится метка NOTHING с текущим значением счетчика размещения, равным нулю. Эта информация записывается в таблицу символов вместе с отметкой о том, что символ является перемещаемым. Так как START - псевдооперация, не требующая памяти, счетчик размещения остается равным нулю. [42]
В машинах с пословной организацией каждая команда занимает одно слово, а в машинах с побайтовой организацией - 2, 4 или 6 байт. Поле операнда исходного оператора анализируется на присутствие литералов. Затем просматривается поле метки оператора. Если там расположен символ, он заносится в таблицу символов вместе с те - кущим значением счетчика размещения. Наконец, счетчик размещения увеличивается на длину команды, и читается следующий оператор. [43]
Для большего удобства написания программ автокоды разрешают записывать в адресных полях автокодных предложений не только имена соответствующих объектов, но и целые формулы для вычисления их адресов. Поскольку каждая такая формула определяет некоторый адрес, то эти формулы называют адресными выражениями. В общем случае они строятся из операндов, знаков арифметических операций и круглых скобок. Операндами адресных выражений являются внутренние, внешние и общие имена, в том числе и имя счетчика размещения () как специфичный случай внутреннего имени, а также константы. [44]
В машинах с пословной организацией каждая команда занимает одно слово, а в машинах с побайтовой организацией - 2, 4 или 6 байт. Поле операнда исходного оператора анализируется на присутствие литералов. Затем просматривается поле метки оператора. Если там расположен символ, он заносится в таблицу символов вместе с те - кущим значением счетчика размещения. Наконец, счетчик размещения увеличивается на длину команды, и читается следующий оператор. [45]