Из семи режимов адресации самыми быстрыми являются регистровая и непосредственная адресации операндов, поскольку в этом случае операционный блок микропроцессора 8086 извлекает их либо из регистров (при регистровой адресации), либо из конвейера команд (при непосредственной адресации). В других режимах адресация выполняется более длительное время, потому что интерфейс шины вначале должен вычислить адрес ячейки памяти, извлечь операнд и только после этого передать его операционному блоку.
При регистровой адресации микропроцессор извлекает операнд из регистра (или загружает его в регистр). Например, команда MOV АХ,СХ копирует 16-битовое содержимое счетчика СХ в регистр аккумулятор АХ. Содержимое регистра СХ после операции не изменяется. В данном примере микропроцессор 8088 использует регистровую адресацию для извлечения операнда-источника из регистра СХ и загрузки его в регистр-приемник АХ.
Непосредственная адресация позволяет указывать в качестве операнда-источника 8-или 16-битовое значение константы. Эта константа находится в команде (куда она помещается ассемблером), но не в регистре и не в ячейке памяти. Например, команда MOV СХ,500
загружает десятичное число 500 в регистр СХ, а команда MOV CL,-З0
загружает значение -30 в регистр CL.
Непосредственный операнд также может быть идентификатором, определенным оператором EQU, поэтому в командах допустима следующая форма оператора:
К EQU 1O24; присвоить константе 1024 идентификатор К и
MOV СX,К; загрузить эту константу регистр СХ.
Чтобы избежать ошибок, необходимо учитывать, что допустимые значения для 8-битовых чисел со знаком ограничены диапазоном от - 128 (З0Н) до +127 (7FH), 16-битовых чисел со знаком диапазоном от -32768 (8000Н) до +32767 (7FFFH). Максимальное значение 8-битовых чисел без знака равно 255 (0FFH), а 16-битовое равно 65535 (0FFFFH).
Необходимо помнить, что ассемблер всегда расширяет знак при пересылке непосредственных значений в операнд-приемник. Это означает, что он дублирует старший бит источника до тех пор, пока не будут заполнены все 8 или 16 битов операнда-приемника. Например, операнд-источник второго примера, десятичное число 500, может быть записано в виде 10-битового двоичного числа 01 1111 0100. Когда ассемблер устанавливает, что требуется загрузить это число в регистр СХ, то он расширяет его до 16-битового, записывая перед ним шесть копий знакового бита (в данном случае 0). Поэтому в регистр СХ попадает двоичное значение 0000 0001 1111 0100В. В третьем примере процессор загружает в регистр СL 8-битовое двоичное представление отрицательного числа -30 в дополнительном коде.
Прямая адресация памяти
При прямой адресации доступ к ячейкам памяти обеспечивается взаимодействием операционного блока и блока преобразования адресов. Когда операционному блоку требуется прочитать или записать операнд, находящийся в памяти, он передает значение смещения адреса блоку преобразования адресов. Последний добавляет это смещение к содержимому регистра сегмента (предварительно умноженному на 10h, то есть дополненному четырьмя нулями) и тем самым получает 20-битовый физический адрес, который и используется для доступа к операнду.
Смещение, которое вычисляется операционным блоком для доступа к находящемуся в памяти операнду, называется исполнительным адресом операнда. Исполнительный адрес показывает, на каком расстоянии (в байтах) располагается операнд от начала того сегмента, в котором он находится. Будучи 16-битовым числом без знака, исполнительный адрес позволяет получить доступ к операндам, находящимся выше начала сегмента на расстоянии до 65536 (или 64К) байтов.
При прямой адресации исполнительный адрес является составной частью команды (так же, как значения при непосредственной адресации). Микропроцессор добавляет этот исполнительный адрес к сдвинутому, влево на четыре разряда, содержимому регистра сегмента данных DS и получает 20-битовый физический адрес операнда в сегменте данных. Обычно прямая адресация применяется, если операндом служит метка или идентификатор некоторых данных, которым ассемблер при трансляции присваивает 16–битовое двоичное значение. Например, команда MOV AX,TABL загружает содержимое ячейки памяти по имени TABL в регистр АХ. Здесь ассемблер сам заменяет метку TABL на соответствующий адрес. Если перед меткой не указан сегментный регистр, то процессор по умолчанию устанавливает сегментный регистр DS. В случае, когда данные находятся в других сегментах, необходимо явно указать имя требуемого сегмента. Например:
MOV AX,TABL; ячейка TABL находится в сегменте данных DS,
MOV AX,ES:TABL; ячейка TABL находится уже в дополнительном
сегменте ES.
Дата: 2018-11-18, просмотров: 455.