Режимы адресации
Смещение, которое вычисляется операционным блоком для доступа к находящемуся в памяти операнду, называется исполнительным адресом операнда. Этот исполнительный адрес показывает, на каком расстоянии (в байтах) от начала сегмента располагается искомый операнд. В зависимости от используемого режима адресации получение исполнительного адреса может заключаться только в извлечении его как составной части исполняемой команды, а могут потребоваться дополнительные операции сложения составной части команды с содержимым других регистров. Различают адресацию операндов: - непосредственную, которая заключается в указании в команде самого значения операнда, а не его адреса; - прямую, предполагающую указание в команде непосредственно исполнительного адреса; - косвенную, при которой в команде указывается адрес регистра или ячейки памяти, в которых хранится адрес операнда или его составляющие; - ассоциативную (используется в ассоциативных запоминающих устройствах, на ней останавливаться не будем); - неявную, когда адреса операндов в команде не указываются, а подразумеваются кодом операции. Непосредственная адресация имеет место, если операнд-источник является константой или переменной, которой присвоено постоянное значение. Например: MOV AX, 500 загружает значение 500 в РОН AX или ....... K EQU 1024 ......... MOV CX, K загружает в РОН СХ константу 1024, определенную идентификатором К. Следует отметить, что непосредственный операнд может быть задан простым выражением, в котором константы или идентификаторы констант связаны арифметическими операциями +, -, * или / (в таких выражениях не должно быть скобок). Например: MOV AX, 156*10Н/2. Следует помнить, что диапазон посылаемых чисел (значений непосредственного операнда) определяется вместимостью приемника - если это однобайтовый регистр (AH, AL, BL …), то в него можно посылать беззнаковые числа в диапазоне от 0 до 255, знаковые – от –128 до 127. Прямая регистровая адресация имеет место в командах, оперирующих с содержимым РОН или сегментных регистров в качестве одного или обеих операндов команды. Например, команда: MOV DS, AX копирует содержимое РОН АХ в сегментный регистр DS, при этом содержимое регистра AXне изменяется. При использовании этого вида адресации в программах необходимо следить, чтобы разрядности обеих регистров были одинаковы. Прямая адресация ячеек ОП имеет несколько вариантов: - прямая обычная характеризуется тем, что смещение является составной частью команды и не требует при формировании исполнительного адреса дополнительных регистров, иными словами = . Обычно применяется, если операндом служит помеченная переменная, например: MOV AX, SOURCE загружает слово из ячейки памяти в регистр. При этом в памяти старший байт следует за младшим, а не предшествует ему. Это обусловлено тем, что в памяти ЭВМ старшая часть располагается в ячейках памяти со старшими адресами. Поэтому схема приведенной команды будет следующей:
После выполнения вышеуказанной команды пересылки регистр АХ будет содержать АХ=ААВВ. Примеры прямой обычной адресации вы можете видеть в программе, приведенной в приложении 1.А; - прямая с индексированием: = + , причем находится в индексном регистре, например: - MOV AX, SOURCE[SI]; - прямая с базированием: = + , находится в базовом регистре, например: - MOV AX, SOURCE[ВХ]. Такая адресацияпредназначена для доступа к данным с известным смещением относительно некоторого базового адреса, при этом исполнительный адрес получается путем сложения значения сдвига с содержимым регистров BX или BP. Например, таблица TABLE содержит поля фамилии (FAM 20 байт), имени (NAME 15 байт) и адреса (PLACE 50 байт). Тогда командами MOV ВХ, 20 MOV AL, TABLE[ВХ] получим в регистре AL первый байт имени. - прямая с индексированием и базированием: = + + , например: MOV AX, SOURCE[ВХ+SI]. Возможна и такая форма записи команды: MOV AX, NUMBER [BP][SI]. Существует 2 варианта косвенной адресации ячеек ОП: - косвенная обычная, когда исполнительных адрес находится в регистре, например: MOV AX, [BX]. Исполнительный адрес операнда может находиться в любом из сегментных регистров, кроме регистра стека (в базовом регистре BX, регистре указателя базы BP или индексном регистре SI или DI). Косвенный регистровый операнд заключается в квадратные скобки, что означает ”в качестве адреса брать содержимое того адреса, на который указывает заключенный в квадратные скобки регистр”. Чтобы адрес-смещение переменной мог оказаться в РОН, используется команда пересылки следующего вида: MOV BX, offset SOURCE. Функции этой команды заключаются в том, что смещение (offset) ячейки памяти с именем SOURCE помещается в РОН ВХ. Естественно, в программе эта команда должна предшествовать команде пересылки с косвенной адресацией. Т.к. содержимое регистра легко изменить в ходе выполнения программы, данный способ адресации позволяет динамически назначить адрес операнда для некоторой машинной команды. Это свойство применяется для организации циклических вычислений и для работы со структурами данных типа таблиц и массивов; - косвенная с индексированием: от предыдущей отличается тем, что исполнительный адрес берется в виде суммы адресов, находящихся в базовом и индексном регистрах: MOV AX, [BX+SII]. Смешанная непосредственная адресация ячеек памяти имеет несколько вариантов: - непосредственная обычная: MOV AX, offset pole. Здесь в качестве непосредственного операнда берется смещение адреса переменной pole; - непосредственная с индексированием, когда в качестве исполнительного адреса операнда берется сумма значений индексного регистра и непосредственного смещения: MOV AX, [SI+const], причем смещение, обозначенное const, может быть задано числом, идентификатором константы, смещением адреса переменной (offset), или их комбинацией в виде простого выражения; - непосредственная с базированием, в которой, в отличие от предыдущей адресации, фигурирует базовый, а не индексный регистр: MOV AX, [BX+const]. Форма записи смещения относительно базы может быть любой из 3-ех нижеприведенных: MOV AX, [BX]+4, MOV AX, 4[BX], MOV AX, [BX+4]. Это примечание относится и к форме записи команд с индексированием (предыдущий вид адресации); - непосредственная с базированием и индексированием отличается тем, что для вычисления исполнительного адреса берется сумма базового и индексного регистра, к которым добавляется непосредственно фигурирующее в команде смещение: MOV AX, pole[BX+SI+const]. Адресация с базированием и индексированием очень полезна при работе с двумерными массивами и таблицами. В ней исполнительный адрес вычисляется как сумма значений базового регистра, индексного регистра и (возможно) сдвига. В случае двумерного массива базовый адрес может содержать начальный адрес массива, а значения сдвига и индексного регистра могут содержать смещения по строке и столбцу. Допустимыми форматами команд являются следующие записи: MOV AX, [BX+2+DI], MOV AX, [DI+BX+2], MOV AX, [BX+2][DI], MOV AX, [BX+2+DI]. Пример выполнения программы, меняющей местами четные и нечетные элементы массива целых беззнаковых чисел 10, 20, 30, 40, 50, 60, 70, 80.
|