Системное программирование. Конспект лекций


Двухпроходный Ассемблер - 2-й проход - часть 2


Имена в адресных выражениях должны заменяться на значения. Замена абсолютных имен (определенных в директиве EQU) очень проста - значение имени из таблицы символов просто подставляется вместо имени. Перемещаемые имена (метки и имена переменных) превращаются Ассемблером в адресное выражение вида [базовый регистр]+смещение. В таблице символов значения этих имен определены как смещение соответствующих ячеек памяти относительно начала программы. При трансляции имен необходимо, чтобы:

  • Ассемблер "знал", какой регистр он должен использовать в качестве базового;
  • Ассемблер "знал", какое значение содержится в базовом регистре;
  • в базовом регистре действительно содержалось это значение.

Первые два требования обеспечиваются директивами, третье - машинными командами. Ответственность за то, чтобы при обеспечении этих требований директивы согласовывались с командами, лежит на программисте. Эти требования по-разному реализуются в разных вычислительных системах. Приведем два примера.

В Intel Ассемблер использует в качестве базовых сегментные регистры (DS при трансляции имен переменных, CS при трансляции меток). Для простой программы, состоящей из одной секции, Загрузчик перед выполнением заносит во все сегментные регистры сегментный адрес начала программы и Ассемблер считает все смещения относительно него. Сложная программа может состоять из нескольких секций, и в сегментном регистре может содержаться адрес той или иной секции, причем содержимое сегментного регистра может меняться в ходе выполнения программы. Загрузка в сегментный регистр адреса секции выполняется машинными командами:

MOV AX,секция

MOV сегментный_регистр,AX

Для того, чтобы Ассемблер знал, что адрес секции находится в сегментном_регистре, применяется директива:

ASSUME сегментный_регистр:секция

Далее при трансляции имен Ассемблер превращает имена в адресные выражения вида

[сегментный_регистр]+смещение в секции

Отмена использования сегментного регистра задается директивой:

ASSUME сегментный_регистр:NOTHING




- Начало -  - Назад -  - Вперед -