Системы адресации в мини- и микро-ЭВМРефераты >> Программирование и компьютеры >> Системы адресации в мини- и микро-ЭВМ
Регистры до выполнения 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, который попадает по середине двух элементов массива.