Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
27
Добавлен:
20.06.2014
Размер:
1.08 Mб
Скачать

Способы адресации

Способ адресации и местонахождение операндов в ЭВМ

Способ адресации — это способ задания местонахождения операндов команды как входных, так и выходных.

Поскольку в компьютерной системе нет ничего, кроме процессора, памяти и устройств (портов) ввода-вывода, то физически операнды могут находиться в каком-либо из этих элементов.

С программной точки зрения память делится на память команд, память данных и стек. Поэтому выделим следующие варианты местонахождения операндов:

  1. Регистр процессора.

  2. Команда (память команд).

  3. Ячейка памяти данных.

  4. Ячейка стека.

  5. Устройство ввода-вывода (регистр устройства ввода-вывода, порт ввода-вывода).

Адресация операндов в регистре процессора. Неявная и регистровая адресации

Если операнд находится в регистре процессора, то возможны два способа задания его местоположения. Если по логике команды операнд должен располагаться в определенном регистре в соответствии с его специализацией, то указывать имя этого регистра нет необходимости. Это, например, команды установки, сброса и инвертирования флагов (STC, STD, STI, CLC, CLD, CLI, CMC), загрузки регистра AH флагами и размещения AH в регистре флагов (LAHF и SAHF). В арифметических и логических командах многих процессоров подразумевается, что один из операндов и результат находятся в аккумуляторе (откуда и происходит название "аккумулятор" или другое его название "регистр результата"). В командах ввода-вывода также неявно подразумевается, что источником в случае вывода и приемником в случае ввода является аккумулятор. Такая адресация называется неявной.

Если операнд команды может находиться в различных регистрах, то в команде необходимо указать имя требуемого регистра. Такая адресация называется регистровой. Это, например, команды передачи данных из регистра в регистр общего назначения.

Для i8086 формат этих команд таков:

1000 10dw 11reg1reg2

Здесь

d — направление (direction):

d=0 — reg2  reg1

d=1 — reg1  reg2

w — размер операндов (word):

w=0 — байт

w=1 — слово.

MOV reg1, reg2 : 1000 100w 11reg2reg1 : reg1  reg2

1000 101w 11reg1reg2 : reg1  reg2

MOV reg2, reg1 : 1000 100w 11reg1reg2 : reg2  reg1

1000 101w 11reg2reg1 : reg2  reg1

Пример.

MOV AX, BX : 1000 1011 11000011 (8B C3) : AX  BX

MOV AX, BX : 1000 1001 11011000 (89 D8) : AX  BX

MOV BX, AX : 1000 1011 11011000 (8B D8) : BX  AX

MOV BX, AX : 1000 1001 11000011 (89 C3) : BX  AX

MOV AL, BL : 1000 1010 11000011 (8A C3) : AL  BL

MOV AL, BL : 1000 1000 11011000 (88 D8) : AL  BL

MOV BL, AL : 1000 1010 11011000 (8A D8) : BL  AL

MOV BL, AL : 1000 1000 11000011 (88 C3) : BL  AL

Адресация операндов в команде. Непосредственная адресация

Если операнд находится в команде, то он следует "непосредственно" за кодом операции. Такая адресация называется непосредственной. Пример — команды передачи непосредственных данных в регистр:

MOV reg, im : 1011w reg immediate

MOV CX, 0003 : 10111001 00000011 00000000 (B9 03 00)

Адресация операндов в памяти данных. Прямая и косвенная адресации

Если операнд находится в памяти данных, то указать его местоположение можно двумя способами. Первый — поместить его адрес в команду. Такая адресация называется прямой.

Пример:

MOV ACC, M : 1010000W DISP16

MOV AX, VAR : 10100001 DISP16 (A1 DISP16)

Второй — поместить его адрес в регистр процессора. Такая адресация называется косвенной или косвенно-регистровой.

Пример:

MOV AX, [BX] : 8B 07

Причем здесь возможны два подварианта. Регистр с адресом может подразумеваться логикой команды неявно, а может быть явно указан в команде. Это также неявная и регистровая адресация, но не самого операнда, а его адреса.

Видно, что косвенная адресация тесно связана с понятием указателя. В названии многих регистров, которые могут содержать адрес операнда, присутствует слово указатель (pointer) — SP (Stack Pointer), BP (Base Pointer).

Адресация операндов в стеке

Если операнд находится в стеке, то возможна косвенная его адресация или комбинация косвенной и прямой адресации. Для хранения адреса могут использоваться два регистра: указатель стека SP и указатель вазы BP. В случае комбинации косвенной и прямой адресации часть адреса, называемая сдвигом или смещением (но не от начала сегмента, а от значения BP), находится в команде.

Использование SP в командах PUSH и POP как местонахождение адреса операнда подразумевается по умолчанию, неявно. Имя регистра BP указывается в команде явно.

Пример:

MOV AX, [BP+2] : 10001011 01000110 00000010 (8B 46 02).

Здесь

w=1 (бит 0 байта 1) — размер операнда слово;

d=1 (бит 1 байта 1) — результат помещается в первый регистр (AX);

mod=01 (биты 7-6 байта 2) в сочетании с m=110 (биты 0-2 байта 2) — адрес источника данных равен [BP]+a8;

r=000 (биты 3-5 байта 2) — имя регистра-назначения (AX).

Третий байт команды — a8=2 — значение, которое должно прибавиться к содержимому BP для получения адреса операнда.

Адрес операнда вычисляется как сумма содержимого BP (косвенная адресация) и двойки (прямая адресация). В данном случае для косвенной адресации используется базовый регистр, и такая комбинация называется адресацией по базе со сдвигом (смещением).

Адресация операндов в устройствах ввода-вывода

Если операнд находится в устройстве ввода-вывода, то возможны прямая и косвенная адресации.

Пример.

IN AL, 60h — прямая адресация, 60 — адрес операнда источника (номер порта).

OUT DX, AL — косвенная адресация, адрес операнда приемника (номер порта) содержится в DX. При этом имя DX в машинной команде не присутствует, так как только регистр DX в соответствии со своей специализацией может использоваться в этом качестве, как источник номера порта ввода-вывода. В обоих случаях имя регистра AL также не присутствует в машинной команде. Таким образом, аккумулятор и регистр данных в этих командах подразумеваются неявно.

Приведенный пример относится к случаю т. н. изолированного ввода-вывода, когда адресные пространства памяти и внешних устройств не пересекаются, т. е. для обмена данными с внешними устройствами можно использовать только команды IN и OUT. В случае их пересечения (ввод-вывод по принципу доступа к памяти, пример — видеопамять) можно использовать любые команды, с программной точки зрения операнд находится как бы в памяти данных и здесь также возможна прямая или косвенная адресация.

Базисные способы адресации

Таким образом, по разным признакам выделяется пять базисных (фундаментальных) типов адресации:

  1. Неявная.

  2. Регистровая.

  3. Непосредственная.

  4. Прямая.

  5. Косвенная.

Вышесказанное укладывается в следующую таблицу (табл.7).

Таблица 7.

Способы адресации

Операнд

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

Регистр

1-2. Неявная или регистровая

5. Косвенная

Команда

3. Непосредственная

4. Прямая

Строка таблицы — это местоположение объекта (регистр или команда). Столбец — тип объекта (собственно операнд или его адрес). Пересечение дает способ адресации. Соответствие способа адресации и местонахождения операнда таково:

  • 1-2 — регистр;

  • 3 — память команд;

  • 4 — память данных или внешнее устройство;

  • 5 — память данных, стек или внешнее устройство.

Надо отметить, что явно или неявно в команде может быть указано имя регистра как с самим операндом, так и с его адресом. Однако, название "неявная адресация" используется только применительно к первому случаю.

Множественность способов адресации в одной команде

Большинство команд оперирует несколькими операндами (например, команды арифметических операций — двумя входными операндами и одним выходным (результатом), команды передачи данных — одним входным (операндом-источником) и одним выходным (операндом-приемником)). Поэтому в них одновременно может использоваться несколько способов адресации. Так, например, в команде CALL address16 используется три способа адресации:

  • непосредственная (входной операнд основного действия, передачи управления, — адрес подпрограммы, содержится в команде непосредственно за кодом операции);

  • косвенно-регистровая (адрес выходного операнда дополнительного действия, помещения в стек адреса возврата, содержится в регистре SP, который определяется неявно своей специализацией);

  • неявная (выходной операнд основного действия и входной операнд дополнительного действия содержится в регистре PC (IP), который определяется неявно типом операции и своей специализацией).

Кроме того, даже для указания местонахождения одного операнда способы адресации могут комбинироваться. Пример — рассмотренная выше команда MOV AX, [BP+2].

Таким образом, комбинирование способов адресации в команде может быть многоуровневым.

Существуют команды, которые не используют никаких способов адресации, например, команды HLT, NOP. Это те команды, которые не требуют для выполнения действия никакой дополнительной информации.

Комбинированные способы адресации процессоров x86

В процессоре i8086 и последующих (процессорах архитектуры x86) из-за сегментирования и модификации адреса существуют комбинированные способы адресации, представляющие собой различные сочетания перечисленных пяти базисных типов. Во множестве регистров, в которых может находиться адрес операнда или его часть, выделяются подмножества базовых и индексных регистров. Базовые и индексные регистры могут комбинироваться, что дает следующие способы адресации:

  1. По базе со сдвигом (рассмотрена выше) — комбинация косвенной и прямой адресации. Часть адреса находится в базовом регистре, часть — в команде. MOV AX, [BP+2].

  2. С индексированием и сдвигом — комбинация косвенной и прямой адресации. Часть адреса находится в индексном регистре, часть — в команде. MOV AX, [SI+4].

  3. Прямая адресация с индексированием (и сдвигом) — комбинация косвенной и прямой адресации. Часть адреса находится в индексном регистре, часть — в команде. MOV AX, VAR[SI+4].

  4. По базе с индексированием — комбинация косвенной и косвенной адресации. Часть адреса находится в базовом регистре, часть — в индексном. MOV AX, [BX+SI].

  5. По базе с индексированием и сдвигом — комбинация косвенной, косвенной и прямой адресации. Часть адреса находится в базовом регистре, часть — в индексном, часть — в команде. MOV AX, [BX+SI-2].

Все эти способы адресации предоставляют удобства при работе с массивами. В 32-разрядных процессорах архитектуры x86 (процессорах архитектуры IA-32) существует возможность масштабирования с коэффициентами 1, 2, 4, 8. Регистр-указатель в случае использования масштабирования при переходе к следующему элементу массива изменяется на значение, равное коэффициенту масштабирования. В качестве регистра-указателя при использовании масштабирования могут быть использованы только 32-разрядные регистры: EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP. Масштабирование предоставляет удобство при работе с массивами элементов различного размера.

Соседние файлы в папке Задания к лабораторным