Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка2012.doc
Скачиваний:
7
Добавлен:
19.11.2019
Размер:
151.55 Кб
Скачать

1.4Машинно-независимые характеристики ассемблера

1. Литералы.

Очень часто бывает удобно иметь возможность записывать значения константы, используемой в качестве операнда, непосредственно в команде, где она используется. Это позволяет отказаться от использования отдельного предложения для определения константы и соответствующей ей метки. Такой операнд называется литеральным (literal), поскольку значение константы задается в виде строки символов.

В нашем языке ассемблера литералы задаются с помощью префикса =, за которым следует константа. Важно уяснить различие между литералом и непосредственным операндом. В случае непосредственного операнда его значение транслируется как составная часть машинной команды. В случае литерала его значение генерируется в виде константы в оперативной памяти, а её адрес используется в качестве целевого адреса команды. Употребление литерала даёт точно такой же результат, как если бы программист явно определил константу и использовал в качестве операнда её метку. Все литеральные операнды, используемые в программе, объединяются в один или несколько литеральных пулов (literals pools). Обычно литеральный пул помещается в конце программы и распечатывается в её листинге. В литеральном пуле для каждого литерала показаны назначенный ему адрес и сгенерированное значение.

2. Средства определения имен.

К числу обычно используемых директив ассемблера относится директива EQU. В общем виде это предложение записывается так:

Имя EQU значение.

Данное предложение определяет некоторое имя (т.е. вносит его в SYMTAB) и присваивает ему значение. Значение может задаваться в виде константы или выражения, в котором могут использоваться константы и ранее определенные имена.

3. Выражения.

В большинстве ассемблеров наряду с одиночными терминами разрешается использовать выражения. Каждое такое выражение вычисляется ассемблером во время трансляции, а затем полученное значение используется в виде адреса или непосредственного операнда. Обычно допускаются арифметические выражения, которые строятся по стандартным правилам с помощью операций +,-,*,/.

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

Естественно, что выражение, состоящее только из абсолютных терминов, является абсолютным выражением. Однако абсолютное выражение может содержать и относительные термы. Для этого необходимо, чтобы относительные термы образовывали пары, причем в каждую пару должен входить как терм со знаком + , так и терм со знаком -. Совершенно не обязательно, чтобы парные термы располагались друг за другом. Единственное требование – иметь возможность так преобразовывать выражение, чтобы все термы могли быть сгруппированы в пары, в каждую из которых входит как положительный, так и отрицательный терм. Относительные термы не могут быть использованы в операциях умножения и деления. Относительное выражение – это выражение, в котором все относительные термы, кроме одного, могут быть объединены в пары, причем терм, не вошедший ни в одну пару, должен быть положительным. Как и в первом случае, относительные термы нельзя использовать в операциях умножения и деления. Выражения, которые не удовлетворяют ни условиям абсолютного выражения, ни условиям относительного выражения, отмечаются ассемблером как ошибочные.

4. Программные блоки.

Хотя логически исходная программа содержит подпрограммы, области данных и т.п., она рассматривается ассемблером как неделимый объект, который переводится в единственный блок объектного кода. Внутри этой объектной программы сгенерированные машинные команды и данные располагались в том же порядке, в котором они были написаны в исходной программ. Термин программные блоки используется для обозначения сегментов, расположенных в пределах одного объектного модуля, а термин управляющие секции для обозначения сегментов, которые транслируются в независимые объектные модули. Во время первого просмотра каждая метка программы получает адрес относительно начала содержащего ее блока. Когда метка заносится в таблицу имен, то вместе с присвоенным ей адресом заносится имя или номер блока, которому она принадлежит. Во время второго просмотра для генерации объектного кода ассемблеру для каждого имени нужно знать значение адреса относительно начала объектной программы (а не относительно начала блока). Разделение программы на блоки значительно уменьшает проблемы адресации.

5. Управляющие секции.

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