При использовании этого способа относительный адрес образуется путем сложения содержимых базового (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], 12345678h ; 2 Переменная Var представляет собой массив из 5 32-разрядных слов. В строке 1 мы заносим в индексный регистр 2, имея в виду обработку второго элемента массива, а далее в строке 2 мы заносим во второй элемент число 1234567h. На паскале это выглядело бы как Y[2]: =$1234567 Если бы мы не произвели масштабирование, то число 1234567h было бы занесено по адресу [Y+2], а при масштабировании реальный адрес был вычислен как [Y+2*4] т.е. [Y+8] и число попало "по адресу". Использование масштабирования имеет огромную роль при работе с массивами слов и двойных слов, избавляя программиста от необходимости дополнительного индексирования переменных и работы с удвоенными и учетверенными индексами элементов. Все это за него выполняет процессор, сокращая и размер кода и скорость его выполнения.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18