Системы адресации в мини- и микро-ЭВМ
содержимое ячейки 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, который попадает по середине
двух элементов массива.
3.11 БАЗОВО-ИНДЕКСНАЯ АДРЕСАЦИЯ СО СМЕЩЕНИЕМ И МАСШТАБИРОВАНИЕМ
Этот способ адресации рассмотрен в пункте 3.6 при использовании 32-
разрядной адресации. Поэтому приведем лишь пример инструкции и опишем ее
действия. Инструкция INC [EAX+EDI*4+12345678h] увеличит на единицу число,
адрес которого вычисляется, как базовый плюс 32-разрядное смещение
12345678h и плюс масштабированный по основанию 4 индекс, содержащийся в
регистре EDI.
3.12 ОТНОСИТЕЛЬНАЯ АДРЕСАЦИЯ
Относительная адресация используется в микропроцессоре 80386 при
выполнении ряда команд управления ( условные и безусловные переходы, вызовы
подпрограмм, управление циклами и т.д. ), чтобы адресовать ячейку памяти,
содержащую следующую команду. При этом способе адрес формируется как сумма
содержимого регистра EIP(IP) ( instruction pointer - указатель инструкции
), соответствующего текущей команде, и 8-, 16- или 32-разрядного
смещения, определяющего положение следующей команды, относительно текущей.
Например рассмотрим операцию безусловного перехода в приведенном фрагменте:
.
.
mov ax,5
jmp @1
sub ax,ax
@1: mov bx,ax
.
.
Безусловный переход будет представлен как JMP 02, т.е. на 2 байта вперед,
после инструкции. SUB AX,AX занимает в памяти слово, значит переход будет
передан на команду MOV BX,AX т.е. по адресу CS:IP+2. (Это немного
упрощенный пример внутрисегментного перехода. На самом деле при переходах
менее чем на 128 байт используется короткий переход EB??90, где ?? - это
размер кода который надо пропустить + 1 байт. Дополнительный байт
прибавляется за счет кода 90h следующего за смещением. Этот код
представляет собой код инструкции NOP ( no operation ), присутствие его
абсолютно бесполезно, но сложилось исторически, и больше не исправлялось.
Байт ?? - это байт со знаком, так что переход возможен как вперед, так и
назад. А вот при переходах более чем на 127 байт используется команда
E9???? , описанная выше ).
4. ЗАКЛЮЧЕНИЕ. СРАВНИТЕЛЬНЫЙ АНАЛИЗ СИСТЕМ АДРЕСАЦИИ ИСПОЛЬЗУЕМЫХ В
CM1700 И В ПЭВМ НА БАЗЕ ПРОЦЕССОРА 80386.
В двух предыдущих разделах мы привели примеры и описали основные
способы адресации, используемые в машинах двух разных семейств - мини- и
микроЭВМ. Конечно это не все, что можно сказать о системах адресации для
компьютеров этих семейств, тем не менее основные способы задания адресов и
адресации операндов были рассмотрены и можно попытаться проанализировать,
сравнить и привести примеры использования тех способов адресации, которые
были описаны.
Для начала, рассмотрим самые простые способы адресации, такие как
регистровая, прямая, непосредственная и короткого литерала. Про регистровую
адресацию трудно написать больше, чем уже было написано. Естественно, что
этот способ адресации поддерживается и на СМ1700 и 80386 процессором, как
впрочем вообще всеми процессорами семейства 80х86 и многими другими
процессорами, которые имеют регистровую память. Несмотря на простоту этого
способа адресации, он достаточно часто используется для манипуляции
регистрами, их очистки, модификации их содержимого. Регистровая память
отличается очень большой скоростью, и поэтому большинство вычислений,
особенно несложных программисты пытаются делать в этих регистрах. В них
помещают начальные значения, производят вычисления, модификацию и как-то
используют полученные результаты. Для всех этих действий естественным
является применение именно регистрового способа адресации. Большим
подспорьем регистровому способу адресации является режим непосредственной
адресации. Конечно в основном он используется для загрузки в регистры
начальных значений, заранее известных адресов, сравнения с константой и так
далее. Но если копнуть чуть глубже, то этот способ адресации дает еще
множество удобств. Например для перехода по заранее известному адресу
представленному в виде сегмента со смещением можно использовать такой код:
push 0f000h
push 0ffffh
ret
Команда RET берет из стека значения сегмента и смещения, а потом делает
межсегментный переход. Представим себе, выполнение подобного кода без
возможности помещать на вершину стека непосредственное значение:
mov ax,0f000h
push ax
mov ax,0ffffh
push ax
ret
Как видим, выглядит это не слишком компактно, в сравнении с предыдущим
примером, и можете быть уверены, что выполняется это на несколько тактов
дольше. Это самый простой пример применения непосредственной адресации, на
самом деле ее применение гораздо шире, особенно если интенсивно
используются работа с операционной системой, где все значения, адреса и
параметры стандартизированы и в основном заранее известны. На СМ 1700 режим
непосредственной адресации реализуется программно, с использованием
счетчика инструкций, а в машинах на базе i386 он реализуется аппаратно.
Трудно сказать что лучше, однако в СМ 1700 предусмотрен еще и режим
короткого литерала, преимущества которого перед обычной непосредственной
адресацией данных меньших чем 64 беспорны. В 80386 процессоре ничего
подобного не предусмотрено, хотя может быть это лучше - не увеличивает
систему команд и следовательно упрощает структуру процессора.
Прямая адресация это тоже достаточно простой, но очень часто
используемый инструмент. Чаще всего используется для обращения к одиночным
переменным, областям данных операционных систем и т.д. Реализован и в i386
процессоре и на СМ 1700, опять же через счетчик инструкций.
Более сложными, однако и более продуктивными являются косвенные
способы адресации. Косвенно регистровый, косвенный со смещением, индексные
режимы адресации реализованы в полной мере и на СМ 1700 и в ПЭВМ. Они дают
наибольший эффект при обработке массивов, таблиц, различного рода списков.
Для сравнения приведем таблицу аналогичных по смыслу инструкций СМ 1700 и
процессора 80386.
1. Косвенно регистровый.
СМ 1700 MOVB R1,(R2)
i386 MOV [EBX],EAX
2. Смещения.
СМ 1700 MOVB W^32769(R4),R1
i386 MOV EAX,[EDX+32769]
3. Косвенный смещения.
СМ 1700 MOVW @B^8(R5),(R2)
i386 MOV ESI,[EDI+8]
MOV AX, word ptr [ESI]
MOV word ptr [EDX],AX
4. Косвенно регистровый индексный.
СМ 1700 MOVB (R1)[R2],R3
i386 MOV CX,[BP+DI]
5. Смещения индексный.
СМ 1700 MOVB B^5(R1)[R2],R3
i386 MOV EAX,[EBX+ECX+5]
В таблице приведены лишь некоторые режимы адресации, и сейчас мы поясним
почему. Если обратить внимание на пункт 3, то видно, что команда,
аналогичная косвенному режиму смещения заменена на 3 инструкции из набора
команд процессора 80386. Действительно 386-ой процессор не понимает
конструкций типа "адрес адреса", поэтому подобные манипуляции приходится
делать с помощью дополнительного регистра. Более того система адресации
процессора 80386 не допускает использования команд с обращением память-
память. Это опять заставляет использовать дополнительные регистры. Однако в
системе команд i386 предусмотрены команды обработки строк. Эти команды во
многих случаях позволяют обойтись без подобных проблем. Вот эти команды:
MOVS{B,W,D} - переслать строку
STOS{B,W,D} - занести в память из {AL,AX,EAX}
LODS{B,W,D} - занести из памяти в {AL,AX,EAX}
CMPS{B,W,D} - сравнить строки
SCAS{B,W,D} - сканировать строку
Все эти команды можно использовать с префиксом повторения REP. У этого
префикса есть и условные модификации REPE, REPZ, REPNE REPNZ и другие,
прекращающие повторение по какому-то признаку до исчерпания счетчика. С
помощью первых трех команд и реализуется основная работа с памятью. Эти
инструкции можно охарактеризовать, как использующие автоувеличение или
автоуменьшение, так как они после выполнения модифицируют текущее смещение,
которое хранится в регистрах ESI(SI),EDI(DI). В тоже время MOVS реализует
адресацию "память-память". С первого взгляда этого недостаточно для того,
чтобы эффективно использовать например подобие косвенного с автоувеличением
индексного режима. Однако эти сложные инструкции легко заменяются набором
инструкций процессора 80386. Например перепишем команду MOVL
@(R1)+[R3],(R2)+ для машин на базе i80386.
CLD
MOV ESI,[EAX+EBX]
MOVSD
Если положить, что EDI = R2, то результат будет тем же. Далее ESI и EDI
будут увеличены на 4 и для дальнейшей пересылки можно было бы написать
MOV CX,1000
REP MOVSB
Что привело бы к пересылке 4000 байт из DS:[ESI] в ES:[EDI]. Конечно нужна
некоторая предварительная подготовка, к примеру задание начальных адресов,
установка счетчика в ECX, задание направления (CLD/STD - прибавлять или
отнимать в ESI и(или) EDI), однако примерно такие же приготовления
необходимы и в первом случае.
Таким образом, рассматривая и сравнивая возможные способы адресации на СМ
ЭВМ и персональных ЭВМ на базе процессора i386 можно сформировать вполне
определенное представление о возможностях этих машин. Несомненно СМ 1700
является более мощной машиной, рассчитанной на решение достаточно сложных
экономических и других задач. Имея более совершенный набор возможных
способов адресации позволяет качественнее и компактнее записывать задачи
ориентированные на работу с большим количеством различной нформации, по
сравнению с возможной реализацией подобных задач на ПЭВМ.Прямая или
косвенная адресация "память-память" несомненно имеет огромные преимущества,
и резко снижает размер кода и количество дополнительных ресурсов (
регистры, лишние такты и т.д.), используемых при подобных пересылках.
Однако, несмотря на это, перепрограммирование подобных задач для процессора
80386 вполне реально и даже имеет смысл. Благодаря развитию элементной
базы, новым архитектурным решениям, повышению производительности внутренних
и внешних запоминающих устройств общая производительность современных ПЭВМ
достигает, и часто обходит производительность таких классических
вычислительных систем, как ВС на основе СМ и ЕС ЭВМ. Поэтому, несмотря на
некоторую неприспособленнось машин этого класса для решения сложных задач,
последнее время очень большой процент подобных вычислений приходится на
ПЭВМ. И конечно не последнюю роль здесь играет их относительно небольшая
стоимость, глобальное распространение и огромное количество прикладных
программ, а следовательно и программистов, способных писать грамотное ПО
для решения экономических задач.
Козлов А.В.
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ.
1. Малые ЭВМ высокой производительности. Архитектура и программирование.
Москва "Радио и связь" 1990.
2. Д.Брамм, П.Брамм. Процессор 80386 и его программирование. "Мир" 1990.
3. Шагурин, В.Б. Бродин, Г.П. Мозговой. Описание и система команд. МП
"Малип" 1992.
4. Вычислительные машины, системы и сети. Москва "Финансы и статистика"
1991.
5. ALI 386DX MINI ISA Systеm Board user's manual. Printed in the Taiwan.
Edition - August 1993.
ОГЛАВЛЕНИЕ
1. Введение.
Сравнение мини- и микроЭВМ.
2. Системы адресации используемые в мини-ЭВМ.
1. Регистровый режим адресации.
2. Косвенно регистровый режим адресации.
3. Режим с автоувеличением.
4. Режим с автоуменьшением.
5. Косвенный с автоувеличением.
6. Режим смещения.
7. Косвенный смещения.
8. Режим короткого литерала.
9. Индексный режим.
10. Режимы адресации с использованием счетчика инструкций.
11. Адресация переходов.
3. Системы адресации используемые в ПЭВМ.
1. Непосредственная адресация.
2. Регистровая адресация.
3. Косвенно-регистровая адресация.
4. Прямая адресация.
5. Базовая адресация.
6. Индексная адресация.
7. Базово-индексная адресация.
8. Базово-индексная адресация со смещением.
9. Индексная адресация с масштабированием.
10. Базово-индексная адресация со смещением.
11. Базово-индексная адресация со смещением и с масштабированием.
12. Относительная адресация.
4. Заключение. Сравнительный анализ систем адресации используемых в
CM1700 и в ПЭВМ на базе процессора 80386.
5. Литература.
Страницы: 1, 2, 3
|