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