Программирование на Ассемблере

       

Внешнее представление адресов.


Ниже рассмотрено внешнее представление адреса для защищенного режима. Особенности задания адресов в реальном режиме можно изучить по [1].

Используются следующие способы задания адреса: относительная адресация, базисная адресация, индексная адресация, базисно - индексная адресация, относительная базисно - индексная адресация[5].

Относительная адресация. Адрес задается переменной или записью вида: Переменная ±Смещение. Определяет адрес с помощью смещения заданной переменной относительно начала сегмента, внутри которого она определена. Смещение должно быть задано как константное выражение, т.е выражение, значение которого может быть вычислено на этапе компиляции. Может отсутствовать.

Пример:

X                      DD      3, 2

...

MOV               EAX, [X]

MOV               EBX, [X+4]

Данный способ используется для задания адреса простой переменной или элемента массива с заданным номером.

Базисная адресация. Общий вид адреса: [Регистр + Смещение]. Смещение задается так же, как  для предыдущей адресации. В качестве регистра можно использовать любой 32-битный регистр общего назначения, куда предварительно записывается  адрес начала. Для задания адреса можно использовать операцию OFFSET, которая задается перед переменной и означает определить адрес переменной. Другие способы определения адреса в программе будут рассмотрены ниже. Пример:

MOV EAX, OFFSET X; EAX = &X

MOV EBX, [EAX]; EBX = X

Если в качестве регистра используется регистр ESP или EBP, предполагается, что данные используются из сегмента стека, иначе из сегмента данных, например:



MOV   EBX, [EBP]; Данные из стека

Если необходимо переопределить расположение данных, используется переопределение сегмента, например, пусть данные определены в сегменте данных, для доступа к таким данным через регистр EBP пишут:

MOV   EBX, [DS: EBP];

Способ адресации используется для задания адреса произвольного элемента массива. Регистр задает адрес заданного элемента массива.  Например, для обнуления элемента массива с данными длиной 1 байт, используются команды:




MOV   EAX, OFFSET X;       EAX = &X[0]
ADD    EAX, [I]                      EAX = &X[I]
MOV   BL, 0                           BL = 0
MOV   [EAX], BL;                 X[I] = 0
Индексная адресация. Адрес задается в виде: [Переменная + Регистр * Масштаб + Смещение], где:
переменная определяет имя массива;
регистр, называемый индексным, (может быть любой 32 - битный регистр общего назначения) задает номер используемого элемента массива;
масштаб - позволяет учесть длину элемента массива. Принимает значения: 1, 2, 4, 8 (может отсутствовать, в этом случае считается равным 1);
смещение - как для предыдущих способов  адресации (может отсутствовать).
Пример:
MOV   ESI, I
MOV   EAX, [X+ESI * 4]; EAX =  x[I]
Используется для адресации элементов массива стандартной длины. Наиболее наглядный способ задания элемента одномерного массива, задание аналогично его заданию на языке высокого уровня.
Базисно - индексная адресация. Адрес задается в виде: [Регистр1+ Регистр2 * Масштаб + Смещение], где
Регистр1 - базисный регистр - содержит адрес начала массива (как в базисной адресации);
Регистр2 - индексный регистр (как в индексной адресации)
Масштаб  и смещение - как в индексной адресации
Смещение - как для предыдущей адресации (может отсутствовать).
Используется для адресации 2-х мерных массивов.
Пример будет рассмотрен ниже
Относительная базисно- индексная адресация
- адрес задается в виде :[Переменная + Регистр1+ Регистр2 * Масштаб + Смещение], где компоненты определены  в соответствующих способах адресации. Фактически для вычисления адреса используются 5 компонентов.
Переменная,  Регистр1,  Регистр2,  Масштаб,  Смещение,
при трансляции адрес переменной и смещение заменяются одной константой, т.е. с точки зрения внутреннего представления последние два способа эквивалентны и используются для работы с двух мерным массивом.

Содержание раздела