Сравнительный анализ различных систем адресации, используемых в мини и микроЭВМ

3.6 ИНДЕКСНАЯ АДРЕСАЦИЯ.

Примерно тоже самое, что и базовая адресация, однако здесь и используются индексные регистры (SI, DI) и смещение заданное байтом или словом. При формировании 32-разрядных адресов, в качестве базового или индексного может использоваться любой из регистров EAX, ECX, EDX, EBX, EBP, ESI, EDI. Для примера возьмем инструкцию MOV WORD PTR ES: [DI+2], AX, которая по адресу ES: [DI+2] зашлет слово из AX.

Регистры до выполнения MOV WORD PTR ES: [DI+2], AX AX = 0099h DI = 000Dh ES: 000Dh = 0000h (di) ES: 000Fh = 0000h (di+2) После…

AX = 0099h DI = 000Dh ES: 000Dh = 0000h ES: 000Fh = 0099h <-- 99h Адрес ячейки ES: 000Fh был посчитан как содержимое DI плюс 2 = F. Число 99h из регистра AX успешно скопировано в эту ячейку памяти.

3.7 БАЗОВО-ИНДЕКСНАЯ АДРЕСАЦИЯ.

При использовании этого способа относительный адрес образуется путем сложения содержимых базового (BX, BP) и индексного (SI, DI) регистров. Например для операции MOV AX, [BP+SI] мы получим: Регистры до выполнения MOV AX, [BP+SI] AX = 00AAh BP = 0100h SI = 0050h DS: 0100h = 0001h (bp) DS: 0150h = 0002h (bp+si) После…

AX = 0002h <-- 02h BP = 0100h SI = 0050h DS: 0100h = 0001h DS: 0150h = 0002h Адрес ячейки DS: 0150h получен путем сложения значений регистров BP и SI, после чего число из этой ячейки памяти был загружен в регистр AX.

3.8 БАЗОВО-ИНДЕКСНАЯ АДРЕСАЦИЯ СО СМЕЩЕНИЕМ.

Это вариант базово индексной адресации, при котором к относительному адресу прибавляется 8- или 16-разрядное смещение. Дополнительные способы адресации реализуются при использовании 32-разрядных адресов, когда задано специальное поле (SIB) в коде команды. Тогда возможны конструкции типа [EAX+EBX], [EAX+EAX], [ECX+EDX], В качестве индексного регистра можно использовать любой регистр кроме ESP. Содержимое этого регистра умножается на масштабный коэффициент F т. е. сдвигается влево на число разрядов 0,1,3 или 4. Значение F зависит от размера данных. Для примера рассмотрим инструкцию MOV EAX, [EAX+EAX].

Регистры до выполнения MOV EAX, [EAX+EAX] EAX = 0010h DS: 0010h = 000Ah (eax) DS: 0020h = 000Bh (eax+eax) После…

EAX = 000Bh <-- 0Bh DS: 0010h = 000Ah DS: 0020h = 000Bh Базовый адрес берется из EAX, складывается со смещением из EAX и двойное слово по адресу DS: 0020h заносится в EAX.

3.9 ИНДЕКСНАЯ АДРЕСАЦИЯ С МАСШТАБИРОВАНИЕМ При использовании этого способа адресации относительный адрес формируется при сложении масштабированного индекса (содержимого индексного регистра) и 32-разрядного смещения. Поясним идею масштабирования индекса: содержимое индексного регистра умножается на масштабный коэффициент, чтобы правильно адресовать данные размером более одного байта. Для примера рассмотрим фрагмент программы, осуществляющей работу с цепочкой двойных-слов.

Start: jmp Begin Var dd 5 dup (0) Begin: mov edi, 2; 1 mov [Var+edi*4], 1 234 5678h; 2 Переменная Var представляет собой массив из 5 32-разрядных слов. В строке 1 мы заносим в индексный регистр 2, имея в виду обработку второго элемента массива, а далее в строке 2 мы заносим во второй элемент число 123 4567h. На паскале это выглядело бы как Y[2]: =$ 1 234 567 Если бы мы не произвели масштабирование, то число 123 4567h было бы занесено по адресу [Y+2], а при масштабировании реальный адрес был вычислен как [Y+2*4] т. е. [Y+8] и число попало «по адресу». Использование масштабирования имеет огромную роль при работе с массивами слов и двойных слов, избавляя программиста от необходимости дополнительного индексирования переменных и работы с удвоенными и учетверенными индексами элементов. Все это за него выполняет процессор, сокращая и размер кода и скорость его выполнения.

3.10 БАЗОВО-ИНДЕКСНАЯ АДРЕСАЦИЯ С МАСШТАБИРОВАНИЕМ Относительный адрес формируется сложением масштабированного индекса и базы, в качестве которой используется содержимое одного из регистров EAX, EBX, ECX, EDX, ESI или EDI. Приведем пример такой адресации данных: Инструкция MOV [EAX+EDI*4], 666h поместит число 666h по адресу EAX плюс учетверенное содержимое EDI.

Регистры до выполнения MOV [EAX+EDI*4], 666h EAX = 0100h EDI = 0002h DS: 0100h = 000Ah (eax) DS: 0104h = 000Bh DS: 0108h = 000Ch (eax+edi*4) После…

EAX = 0100h EDI = 0002h DS: 0100h = 000Ah (eax) DS: 0104h = 000Bh DS: 0108h = 0666h <-666h Масштабирование позволило адресовать именно 2-е 32-разрядное слово, а не записать число 666h по адресу EAX+2 т. е. 102h, который попадает по середине двух элементов массива.

3.11 БАЗОВО-ИНДЕКСНАЯ АДРЕСАЦИЯ СО СМЕЩЕНИЕМ И МАСШТАБИРОВАНИЕМ Этот способ адресации рассмотрен в пункте 3.6 при использовании 32-разрядной адресации. Поэтому приведем лишь пример инструкции и опишем ее действия. Инструкция INC [EAX+EDI*4+1 234 5678h] увеличит на единицу число, адрес которого вычисляется, как базовый плюс 32-разрядное смещение 1 234 5678h и плюс масштабированный по основанию 4 индекс, содержащийся в регистре EDI.