![](/user_photo/2706_HbeT2.jpg)
- •2.4. Машинный язык и язык Ассемблера
- •2.5. Синаксис языка Ассемблера
- •2.6. Принципы работы Ассемблера
- •2.7. Биты, байты и слова
- •2.8. Нумерация бит
- •2.9. Набор символов
- •2.10. Принципы работы компьютера
- •2.11. Процедуры
- •2.12. Стек
- •2.13. Прерывания
- •3.1. Модель программирования 8088
- •3.2. Регистры общего назначения
- •3.3. Регистры адресации
- •3.4. Прямая адресация
- •3.5. Вычисление адресов
- •3.6. Адресация через базу и смещение
- •3.8. Байт mod r-m
- •3.9 Физическая адресация
- •3.10. Сегментные регистры
- •3.11. Предназначение сегментов
- •3.12. Оператор Segment
- •3.13. Оператор Assume
- •3.14. Управляющие рагистры
- •3.14.1. Указатель инструкций (ip)
- •3.14.2. Указатель стека
- •3.14.3. Регистр флагов
- •3.14.4. Флаг знака
- •3.14.5. Флаг нуля
- •3.14.6. Флаг четности
- •3.14.7. Флаг переноса
- •3.14.8. Дополнительный флаг переноса
- •3.14.9. Флаг переполнения
- •3.14.10. Флаг захвата
- •3.15. Векторы прерываний
- •Глава 4 - Набор команд микропроцессора 8088
- •4.1. Пересылка данных
- •4.1.1. Команда пересылки
- •4.1.2. Команда замены
- •4.1.3. Команды ввода и вывода
- •4.1.4. Загрузка исполнительного адреса
- •4.1.5. Загрузка указателя
- •4.1.6. Пересылка флагов
- •4.1.7. Перекодировка
- •4.2. Операции со стеком
- •4.3. Передача параметров
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 позволяет складывать либо регистр с ячейкой памяти, либо два регистра. В одной команде нельзя сложить две ячейки памяти. Это и означает, что команда содержит только один адрес памяти.