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