Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ассемблер.doc
Скачиваний:
24
Добавлен:
25.08.2019
Размер:
526.34 Кб
Скачать

3.6. Адресация через базу и смещение

Поскольку вычисление для операнда адреса, состоящего из базы и индекса, встречается довольно часто, среди способов адресации 8088 есть такие, что позволяют автоматически производить идексирующее сложение. Вместо выполнения всех вычислений, программа может определить только величину 2*I и поместить ее в регистр BX. Команда

INC   [OPND + BX]

вычисляет исполнительный адрес через сложение адреса базы OPND со значением индекса в BX. Этой командой достигается тот же самый результат что и в предыдущем случае, но меньшим числом команд. Обратите внимание, что в этой команде ассемблеру не требуется подсказка WORD PTR, потому что ассемблер уже знает, что OPND является переменной типа WORD. Оператор PTR требуется только в тех случаях, когда ассемблер не может определить тип операнда. Любой из четырех адресных регистров может быть использован в качестве индексапри базе. Фиг. 3.2 показывает возможные способы адресации черезбазу и индекс. Вы видите, что ассемблер допускает несколько способов записи операции адресации. В группе, состоящей из пяти команд на Фиг. 3.2, во всех командах адрес базы OPND складывается с указанным рядом индексным регистром. Надо отметить, что в команде, содержащей базисный адрес, регистр не обязательно должен содержать именно значение индекса. Действительно, поскольку BX называется базисным регистром, кажется разумным воспользоваться противоположной конфигурацией. В качестве примера предположим, что программа использует множество разных векторов с одинаковой длиной и размером элементов. Такую структуру может иметь, например, классный журнал, в котором векторам соответствуют наборы оценок за каждую контрольную работу. Программа, вычисляющая оценку пятого ученика в классе по I-й работе будет иметь уже известное значение индекса (5) а базу (вектор данной контрольной работы) - вычисляемую в ходе выполнения программы. Индексный регистр может содержать как адрес базы вектора, так и значение индекса в векторе. Поскольку константное значение в команде может оказаться и базой и индексом (или вовсе чем-нибудь известным только программисту), то это значение называют смещением. Оно соответствует расстояню или смещению от адреса в регистре до исполнительного адреса, по которому происходит обращение.

3.7. База + индекс + смещение

Программа может также комбинировать вычисляемый адрес базы с вычисляемым индексом. Как показано на Фиг.3.2, программа может использовать режим адресации с двумя разными адресными регистрами. Для формирования исполнительного адреса в команде могут сочетаться любой из регистров базы (BX и BP) с любым из индексных регистров (SI и DI). В программе может быть также указано смещение, добавляемое к сумме значений этих двух регистров. Этот способ адресации обладает максимальной гибкостью, так как позволяет вычислять вовремя выполнения программы и адрес базы, и индексное значение. Такая возможность не всегда требуется, но доступна в любой момент. Пример с классным журналом демонстрирует случай, когда программа может вычислять и адрес базы, и индекс вектора. Для того, чтобы определить отметку I-го ученика за J-ю контрольную, потребовалось бы установить адрес базы на J-й вектор и индексировать его по I-му элементу. На рис.3.3 приведена сводка восьми различных способов адресации, возможных в микропроцессоре 8088. В команде могут использоваться любые из четырех адресных регистров и смещение либо комбинация базисного регистра и индексного вместе со смещением. Смысл колонки, обозначенной R/M, будет объяснен позже.

R/M

Адрес операнда

000

[BX + SI + СМЕЩЕНИЕ]

001

[BX + DI + СМЕЩЕНИЕ]

010

[BP + SI + СМЕЩЕНИЕ]

011

[BP + DI + СМЕЩЕНИЕ]

100

[SI + СМЕЩЕНИЕ]

101

[DI + СМЕЩЕНИЕ]

110

[BP + СМЕЩЕНИЕ]

111

[BX + СМЕЩЕНИЕ]

Фиг. 3.3 Способы адресации 8088

В наборе команд 8088 поле смещения для адресации оптимизировано таким образом, чтобы минимизировать количество требуемых байт. Команда может не содержать поле смещения, когда смещение равно нулю. Если смещение находится в диапазоне от -127 до 127, то для него достаточно одного байта. Когда же для его обозначения требуется полное 16-битовое поле адреса, то поле смещения будет занимать два байта. Таким образом, поле смещения может по необходимости иметь длину 0, 1 или 2 байта. Когда оно имеет длину один байт, двоичное число перед форимроваием адереса получает распостранение знака. Это означает, что процессор перед выполнением сложения помещает старший бит смещения в старшие 8 бит 16-битового значения. Это позволяет представлять отрицательные смещения в одном байте. Самое лучшее здесь то, что ассемблер сам определяет нужную длину и выбирает правильную и наиболее короткую команду для выполнения этой работы. Но не смотря даже на все эти возможности адресации, набор команд 8088 допускает только по одному операнду памяти в одной команде. Двухоперандная команда ADD позволяет складывать либо регистр с ячейкой памяти, либо два регистра. В одной команде нельзя сложить две ячейки памяти. Это и означает, что команда содержит только один адрес памяти.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]