Сравнительный анализ различных систем адресации, используемых в мини и микроЭВМ

3.12 ОТНОСИТЕЛЬНАЯ АДРЕСАЦИЯ Относительная адресация используется в микропроцессоре 80 386 при выполнении ряда команд управления (условные и безусловные переходы, вызовы подпрограмм, управление циклами и т. д.), чтобы адресовать ячейку памяти, содержащую следующую команду. При этом способе адрес формируется как сумма содержимого регистра 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 И В ПЭВМ НА БАЗЕ ПРОЦЕССОРА 80 386.

В двух предыдущих разделах мы привели примеры и описали основные способы адресации, используемые в машинах двух разных семейств — мини- и микроЭВМ. Конечно, это не все, что можно сказать о системах адресации для компьютеров этих семейств, тем не менее основные способы задания адресов и адресации операндов были рассмотрены и можно попытаться проанализировать, сравнить и привести примеры использования тех способов адресации, которые были описаны.

Для начала, рассмотрим самые простые способы адресации, такие как регистровая, прямая, непосредственная и короткого литерала. Про регистровую адресацию трудно написать больше, чем уже было написано. Естественно, что этот способ адресации поддерживается и на СМ1700 и 80 386 процессором, как впрочем, вообще всеми процессорами семейства 80×86 и многими другими процессорами, которые имеют регистровую память. Несмотря на простоту этого способа адресации, он достаточно часто используется для манипуляции регистрами, их очистки, модификации их содержимого. Регистровая память отличается очень большой скоростью, и поэтому большинство вычислений, особенно несложных программисты пытаются делать в этих регистрах. В них помещают начальные значения, производят вычисления, модификацию и как-то используют полученные результаты. Для всех этих действий естественным является применение именно регистрового способа адресации. Большим подспорьем регистровому способу адресации является режим непосредственной адресации. Конечно в основном он используется для загрузки в регистры начальных значений, заранее известных адресов, сравнения с константой и так далее. Но если копнуть чуть глубже, то этот способ адресации дает еще множество удобств. Например, для перехода по заранее известному адресу представленному в виде сегмента со смещением можно использовать такой код: push 0f000h push 0ffffh ret Команда RET берет из стека значения сегмента и смещения, а потом делает межсегментный переход. Представим себе, выполнение подобного кода без возможности помещать на вершину стека непосредственное значение: mov ax, 0f000h push ax mov ax, 0ffffh push ax ret Как видим, выглядит это не слишком компактно, в сравнении с предыдущим примером, и можете быть уверены, что выполняется это на несколько тактов дольше. Это самый простой пример применения непосредственной адресации, на самом деле ее применение гораздо шире, особенно если интенсивно используются работа с операционной системой, где все значения, адреса и параметры стандартизированы и в основном заранее известны. На СМ 1700 режим непосредственной адресации реализуется программно, с использованием счетчика инструкций, а в машинах на базе i386 он реализуется аппаратно. Трудно сказать что лучше, однако в СМ 1700 предусмотрен еще и режим короткого литерала, преимущества которого перед обычной непосредственной адресацией данных меньших чем 64 беспорны. В 80 386 процессоре ничего подобного не предусмотрено, хотя может быть это лучше — не увеличивает систему команд и следовательно упрощает структуру процессора.

Прямая адресация это тоже достаточно простой, но очень часто используемый инструмент. Чаще всего используется для обращения к одиночным переменным, областям данных операционных систем и т. д. Реализован и в i386 процессоре и на СМ 1700, опять же через счетчик инструкций.

Более сложными, однако и более продуктивными являются косвенные способы адресации. Косвенно регистровый, косвенный со смещением, индексные режимы адресации реализованы в полной мере и на СМ 1700 и в ПЭВМ. Они дают наибольший эффект при обработке массивов, таблиц, различного рода списков. Для сравнения приведем таблицу аналогичных по смыслу инструкций СМ 1700 и процессора 80 386.

1. Косвенно регистровый.

СМ 1700 MOVB R1, (R2) i386 MOV [EBX], EAX 2. Смещения.

СМ 1700 MOVB W^32769(R4), R1 i386 MOV EAX, [EDX+32 769] 3. Косвенный смещения.

СМ 1700 MOVW @B8(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 B5(R1) [R2], R3 i386 MOV EAX, [EBX+ECX+5] В таблице приведены лишь некоторые режимы адресации, и сейчас мы поясним почему. Если обратить внимание на пункт 3, то видно, что команда, аналогичная косвенному режиму смещения заменена на 3 инструкции из набора команд процессора 80 386. Действительно 386-ой процессор не понимает конструкций типа «адрес адреса», поэтому подобные манипуляции приходится делать с помощью дополнительного регистра. Более того система адресации процессора 80 386 не допускает использования команд с обращением память-память. Это опять заставляет использовать дополнительные регистры. Однако в системе команд 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 реализует адресацию «память-память». С первого взгляда этого недостаточно для того, чтобы эффективно использовать например подобие косвенного с автоувеличением индексного режима. Однако эти сложные инструкции легко заменяются набором инструкций процессора 80 386. Например перепишем команду 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 является более мощной машиной, рассчитанной на решение достаточно сложных экономических и других задач. Имея более совершенный набор возможных способов адресации позволяет качественнее и компактнее записывать задачи ориентированные на работу с большим количеством различной информации, по сравнению с возможной реализацией подобных задач на ПЭВМ. Прямая или косвенная адресация «память-память» несомненно имеет огромные преимущества, и резко снижает размер кода и количество дополнительных ресурсов (регистры, лишние такты и т. д.), используемых при подобных пересылках. Однако, несмотря на это, перепрограммирование подобных задач для процессора 80 386 вполне реально и даже имеет смысл. Благодаря развитию элементной базы, новым архитектурным решениям, повышению производительности внутренних и внешних запоминающих устройств общая производительность современных ПЭВМ достигает, и часто обходит производительность таких классических вычислительных систем, как ВС на основе СМ и ЕС ЭВМ. Поэтому, несмотря на некоторую неприспособленность машин этого класса для решения сложных задач, последнее время очень большой процент подобных вычислений приходится на ПЭВМ. И конечно не последнюю роль здесь играет их относительно небольшая стоимость, глобальное распространение и огромное количество прикладных программ, а следовательно и программистов, способных писать грамотное ПО для решения экономических задач.

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ.

Малые ЭВМ высокой производительности. Архитектура и программирование. Москва «Радио и связь» 1990.

Д. Брамм, П. Брамм. Процессор 80 386 и его программирование. «Мир» 1990.

Шагурин, В. Б. Бродин, Г. П. Мозговой. Описание и система команд. МП «Малип» 1992.

Вычислительные машины, системы и сети. Москва «Финансы и статистика» 1991.

ALI 386DX MINI ISA Systеm Board user’s manual. Printed in the Taiwan. Edition — August 1993.