Системы адресации в мини- и микро-ЭВМ
Рефераты >> Программирование и компьютеры >> Системы адресации в мини- и микро-ЭВМ

Регистры до выполнения PUSH DS

DS = 5678h

SP = FFFEh

SS:FFFE = 0000h

После .

DS = 5678

SP = FFFDh

SS:FFFD = 5678

SS:FFFE = 0000

Как видно из примера значение регистра DS было занесено на стек.

3.3 КОСВЕННО-РЕГИСТРОВАЯ АДРЕСАЦИЯ.

При такой адресации относительный адрес содержится в индексном (SI, DI, ESI, EDI) или базовом ( BX, BP, EBX, EBP) регистрах или в регистрах общего назначения EAX, ECX, EDX. Адрес операнда вычисляется как сегмент:смещение. Смещение представлено эффективным адресом.

Для примера рассмотрим команду MOV EBX,[EDI], которая пересылает содержимое ячейки DS:[EDI] в регистр EBX. ( В качестве размера операнда берется двойное слово - 4 байта.

Регистры до выполнения MOV EBX,[EDI]

EBX = 5678h

EDI = 0100h

DS:0100h = 1221h (edi)

После .

EBX = 1221h <——— 1221h

EDI = 0100h

DS:0100h = 1221h

Пример в комментариях не нуждается. Число, адрес которого DS:EDI было успешно занесено в регистр EBX. Регистр DS использовался по умолчанию.

3.4 ПРЯМАЯ АДРЕСАЦИЯ.

При этом способе адресации смещение в сегменте до операнда задано в виде слова или двойного слова в коде команды. Для примера возьмем операцию MOV EAX,[1994h], пересылающую двойное слово по адресу DS:1994 в регистр EAX.

Регистры до выполнения MOV EAX,[1994h]

EAX = 0000h

DS:1994h = 5000h

После .

EAX = 5000h <—— 5000h

DS:1994h = 5000h

Из примера видно, что число, прямо адресованное как ds:[1994h] было скопировано в заданный регистр.

3.5 БАЗОВАЯ АДРЕСАЦИЯ.

Относительный адрес операнда формируется при сложении содержимого базового регистра с непосредственным смещением. Смещение может быть представлено словом или двойным словом. Рассмотрим инструкцию ADD AX,[BP+10h], которая к содержимому регистра AX прибавляет число, адрес которого DS:[BP+10h] .

Регистры до выполнения ADD AX,[BP+10h]

AX = 0067h

BP = 0100h

DS:0100h = 0000h (bp)

DS:0101h = 0001h

· · · · · ·

DS:0109h = 0009h

DS:0110h = 0010h (bp+10h)

После .

AX = 0077h <—— (67h+10h = 77h)

BP = 0100h

DS:0100h = 0000h

DS:0101h = 0001h

· · · · · ·

DS:0109h = 0009h

DS:0110h = 0010h

Как видно из примера, к содержимому BP было добавлено 10h и получилось смещение 110h, по которому и было взято число, прибавленное к AX.

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],12345678h ; 2

Переменная Var представляет собой массив из 5 32-разрядных слов. В строке 1 мы заносим в индексный регистр 2, имея ввиду обработку второго элемента массива, а далее в строке 2 мы заносим во второй элемент число 1234567h. На паскале это выглядело-бы как Y[2]:=$1234567 Если бы мы не произвели масштабирование, то число 1234567h было-бы занесено по адресу [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, который попадает по середине двух элементов массива.


Страница: