Assembler для начинающих


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



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


    В способе  прямой адресации  памяти привлекательна      простота, но во
    многих случаях программа вынуждена вычислять действительный адрес в
    памяти.  Простейший  пример  -   операции  с  вектором,  одномерным
    массивом.  В  программе  на  языке    Фортран  такую    структуру можно
    создать оператором
 
      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 более
    подробно.




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