Вычисление адресов

    В способе  прямой адресации  памяти привлекательна      простота, но во

    многих случаях программа вынуждена вычислять действительный адрес в

    памяти.  Простейший  пример  -   операции  с  вектором,  одномерным

    массивом.  В  программе  на  языке    Фортран  такую    структуру можно

    создать оператором

 

      DIMENTION   OPND(20)

 

    В других  языках  высокого      уровня      существуют  аналогичные способы

    создания  массивов.  При  выполнении  программа  получает  доступ к

    разным  элементам в  соответствии со  значением индекса,  например,

    OPND(5).  Написание  программы  на    языке      ассемблера  требует  от

    программиста  вычисления  местонахождения  пятого  элемента  в поле

    данных OPND. Затем программа может использовать полученное значение

    для прямой адресации. Однако, в  случае с выражением OPND(I), где I

    вычисляется в  ходе выполнения программы,  способа прямого указания

    правильного адреса для программы на языке ассемблера не существует.

    Адрес должен вычисляться в ходе выполнения программы.

      Набор команд 8088 допускает  несколько способов определения ис-

    полнительного адреса (Effective Address - EA) операнда. Эти способы

    вычисления    адреса      называют  способами  адресации.  Их  количество

    предназначено  для  облегчения  задачи  определения  исполнительных

    адресов. Благодаря правильному выбору способа адресации программист

    может минимизировать количество вычислений в программе.

      Формула для определения I-го элемента массива OPND такова:

 

      EA = адрес базы OPND + (I * длина),

 

    где длина  - это длина  каждого элемента массива.  В данном примере

    OPND  - массив,  состоящий из  слов, поэтому  каждый элемент  в нем

    имеет длину 2 байта. Тогда формула выглядит так:

 

      EA = адрес базы + (I * 2)

 

      Для вычисления этого адреса требуется по крайней мере один  ре-

    гистр,  содержащий адрес операнда. Программа может вычислить испол-

    нительный адрес, оставив результат в  одном  из  регистров.  Тогда,

    вместо указния адреса в самой команде INC,  можно  просто  указать,

    какой из регистров его содержит.

      Для хранения адресов операндов программа может использовать лю-

    бой  из  четырех адресных регистров. Так, в нашем примере программа

    добавляет к адресу базы 2*I и помещает результат в регистр BX.  Со-

    ответствующий элемент вектора в этом случае будет увеличиваться ко-

    мандой

 

      INC    WORD PTR [BX]

 

      Выражение [BX] сообщает ассемблеру, что регистр BX содержит ад-

    рес операнда,  а не является операндом  сам по себе. Скобки  [ и ],

    заключающие  какое-либо  значение,    указывают  ассемблеру,  что это

    значение  - адрес.  Другая часть  операндного выражения,  WORD PTR,

    требуется     ассемблеру   для   информации,      что  операнд  является

    переменной типа  WORD (слово). Далее мы  обсудим оператор PTR более

    подробно.