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