- •Глава I. Организация вычислений в эвм
- •1. Позиционные системы счисления
- •2. Алгоритмы перевода чисел из одной системы счисления в другую
- •3. Формы представления чисел в двоичной системе счисления
- •4. Операции сложения чисел в прямом, обратном и дополнительном кодах с фиксированной запятой
- •4.2. Умножение чисел в дополнительных кодах
- •4.3. Операция умножения над обратными кодами сомножителей
- •4.6. Выполнение операции сложения над числами с плавающей запятой
- •5. Форматы данных
- •6. Стадии выполнения команды и способы адресации
6. Стадии выполнения команды и способы адресации
В ЭВМ используются одно-, двух- или трехадресные команды [16]. Самой быстродействующей и наиболее гибкой для программирования является трехадресная команда вида
|
КОП |
А1 |
А2 |
А3 |
В структуре этой команды имеется поле кода операции (КОП) и три адреса операндов А1, А2, А3. С помощью этой команды легко программируются многие операции. Например, сложение Z = X + Y можно запрограммировать так: в поле КОП закодировать адрес микропрограммы сложения, находящейся в постоянной памяти УУ, в А1 закодировать адрес операнда Х, в А2 – Y, а в А3 разместить адрес, куда направить результат сложения. Недостатком трехадресных команд (трехадресных ЭВМ) являются значительные затраты оборудования на размещение адресов А1, А2, А3 и наибольшая разрядность шины данных.
Для устранения этих недостатков используют двух- или одноадресные команды вида
|
КОП |
А1 |
А2 |
|
|
КОП |
А0 |
При двухадресных командах один из адресов фиксируют. Например, результат операции передается по адресу (на место) первого операнда. При этом значение первого операнда, естественно, стирается. При одноадресной команде для выполнения операций фиксируют и место нахождения первого операнда, используя, например, специальный регистр – аккумулятор (ЕАХ) – или верхнюю ячейку (вершину) стековой памяти. После выполнения команды, если она не последняя, процессор извлекает следующую, которая обычно располагается по более старшему адресу (естественная адресация). Для определения ее адреса используется счетчик команд (IP или EIP), значение которого увеличивается на i =1, 2, … каждый раз до адреса следующей команды естественного порядка. Если при ветвлениях в алгоритме возникает необходимость перейти к выполнению команды, отличной от естественного порядка, используются одноадресные управляющие команды условного или безусловного перехода. При безусловном переходе содержимому EIP всегда присваивается поле адреса команды А0. При командах условного перехода анализируется состояние соответствующего флага регистра EFLAGS, который обрабатывается устройством управления по коду поля КОП. В зависимости от значения флага EIP может быть присвоено А0 или EIP + i. Укрупненная схема командного управления ЭВМ показана на рис. 1.3. Для считывания операндов и команд в процессор кроме прямой адресации, при которой поле адреса указывает на ячейку памяти (регистр МП), где хранится операнд или команда, может использоваться также непосредственная, косвенная или ассоциативная адресация.
При непосредственной адресации операнд I располагается в самой команде вида
|
КОП |
I |
. |
Этот операнд (константа) может быть использован операционным блоком (АЛУ) для вычислений, и не требуется дополнительного обращения к ОЗУ.
При косвенной адресации в команде располагается адрес ячейки или регистра МП, где хранится адрес операнда. При ассоциативной адресации в поле адреса размещается ключ (признак, тэг) поиска или ассоциация и для поиска используются микрооперации сравнения информации “по содержанию”, а не дешифрация адреса в ОЗУ.
В новых МП система команд постоянно совершенствуется и дополняется, сохраняя программную совместимость с младшими моделями. В настоящее время в i486, Pentium принята структура команды [6,19], показанная на рис. 1.4, и длина команды может достигать 16 байт при 32-битной адресации.

Рис. 1.3. Схема командного управления ЭВМ
Обязательной для каждой команды является наличие поля КОП размерностью в 1 или 2 байта. Все другие поля команды могут отсутствовать или расширяют функции адресации или назначение команды. Так, наличие перед командой одного из префиксов группы изменяет ее функции, определенные по умолчанию, следующим образом:
- REP (в группе REPE / REPZ, LOCK, REPNE / REPNZ) – распространяет выполнение операции (КОП) на все элементы цепочки;
- AS – изменяет разрядность 16 (32)-битного эффективного адреса, обрабатываемого командой, на 32 (соответственно в скобках на 16)-битный адрес;
- OS – изменяет разрядность операнда в 16 (32) бит на разрядность в 32 (16) бит;
- SO – указывает новый сегментный регистр для команды из группы возможных.
|
7 6 |
3 |
0 |
|
7 6 |
3 |
0 |
|
mod |
reg/коп |
r/m |
|
SS |
index |
Base |
Префиксы
-
REP
AS
OS
SO
КОП
ModR/M
SIB
Disp
I
0;1
0;1
0;1
0;1
1;2
0;1
0;1
0;1;2;4
0;1;2;4
Число байт
Число байт
Рис. 1.4. Обобщенная структура команды
Префиксы могут располагаться перед командой в любом порядке, только по одному из группы. В следующих двух байтах команды Mod R / M и SIB кодируются дополнительные сведения о коде операции и способе вычисления адресов операндов. Поля этих байтов имеют следующие назначения:
- mod и r / m в различных комбинациях определяют 8 регистровых (mod = <11>) и 24 индексных типа адресации;
- reg / коп определяет либо номер одного из 8 регистров РОН, либо расширяет на 3 бита поле КОП;
- r / m определяет либо номер РОН, в котором находится операнд, либо с полем mod кодирует 32 типа адресации.
В случае 32-битной адресации байт Mod R / M содержит информацию о необходимости использования дополнительных кодов из байта SIB, состоящего из следующих полей:
- SS – масштабный множитель (00 – х1, 01 – х2, 10 – х4, 11 – х8);
- index – поле 3-битного кода номера РОН, который является индексным регистром;
- base – поле номера РОН, который содержит базовый адрес.
За байтом Mod R / M или SIB команды часто следует поле смещенияDisp.Это поле указывает на “удаление” операнда от адреса, заданного в базовом регистре команды. В зависимости от кода поля mod (00, 01, 10) величина смещения занимает 1, 2 или 4 байта.
В поле I команды иногда размещается непосредственный операнд, который в зависимости от КОП может располагаться в 8 / 16 / 32 битах последнего поля команды.
Данные, участвующие в вычислениях, обычно располагаются в ОЗУ. Для задания места нахождения операндов наиболее широко в адресных ЭВМ используются непосредственная, прямая и косвенная адресации.
При непосредственной адресации 8 / 16 / 32-битный операнд размещается в поле I команды и после извлечения команды из ОЗУ он сразу участвует в операции. Так, команда сложения add ax, 8AD5h в поле I содержит двухбайтный код <1000101011010101>, который МП использует для сложения с содержимым регистра АХ. Недостатком этой адресации является то, что команда работает с жестко закрепленными данными (константой).
При прямой адресации к памяти в команде закодирован адрес ячейки ОЗУ, в которой находится операнд. При обращении к ОЗУ поле адреса Аi команды (плюс адрес сегмента) считывается в регистр адреса и затем передается на ША. Код из ША дешифрируется и возбуждает соответствующую ячейку ОЗУ для взаимодействия с ШД. Так, при чтении операнд из ячейки передается на ШД, затем в кэш-1 и АЛУ для участия в выполнении КОП команды. При записи результат операции по ШД передается в ячейку (рис. 1.3). Недостатком прямой (абсолютной) адресации к памяти является значительная разрядность адресной части команды, которая увеличивается с увеличением числа ячеек ОЗУ и удваивается при двухадресной команде. В качестве примера команды с абсолютной адресацией может быть команда вида mov eax, [21051944], которая загружает аккумулятор содержимым ячейки 21051944h. В этой команде адрес 21051944h увеличивает ее длину на 32 бита. Разновидностью прямой являются неявная, регистровая и адресация ввода / вывода.
Отличие регистровой адресации от прямой к памяти заключается в том, что в поле Аi кодируется короткий адрес регистра РОН, в котором находится операнд. При этом длина команды уменьшается и МП не обращается к ОЗУ за операндом, тем самым уменьшается время выполнения операции. Однако перед выполнением команды операнд должен находиться уже в соответствующем РОН. Для организации регистровой адресации РОН EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI присваиваются соответственно трехбитные адреса 000, 001, …, 111 и если в поле reg располагается, например, адрес регистра <010>, то это означает, что команда выполняет операцию с участием операнда регистра EDX. Например, команда с регистровой адресацией mov edx, ecx двухадресная, передает содержимое ECX в РОН EDX.
При неявной адресации адресное поле отсутствует. Операнд располагается в устройстве, которое неявно задается полем КОП. После дешифрации этого поля микропрограмма УУ указывает место операнда (например, регистра AL, однобайтной команды ааа). Команды неявной адресации имеют наименьшую длину, но узко специализированы.
Для обмена с внешними устройствами любая ЭВМ с МП i86, …, i486, Pentium имеет определенное число буферных регистров - портов, через которые и осуществляется процесс ввода / вывода информации. Каждому порту присваивается свой адрес в диапазоне от 0 до 64К-1. Для обмена с портами предназначены команды ввода in или вывода out, где в качестве приемника или источника зафиксирован EAX / AX / AL. В этих командах используется прямая адресация ввода / вывода, например, in ax, 22 - загрузить AX содержимым регистра из 22h порта или косвенная адресация ввода / вывода с обращением за адресом порта в регистр DX (out dx, ax - вывести AX в регистр порта, адрес которого занесен в DX). Заметим, что команды ввода / вывода кроме поля КОП имеют еще второй байт адреса порта или один байт КОП с использованием для адресации содержимого регистра DX. Причем номера портов выравниваются по границам передаваемых данных. Так при 32-битных операциях они нумеруются 0, 4, 8, …, 252, …, 65532.
Существенным недостатком прямой адресации является необходимость закрепления операндов за определенными устройствами и номерами ячеек (статическое распределение памяти). С целью расширения возможности хранения данных во всех областях ОЗУ, организации контроля и защиты от неправильного использования областей и мультизадачности вычислений в ЭВМ введены динамический режим распределения памяти, косвенная и относительная адресации операндов (рис. 1.5.). Для этого вся адресуемая область разбивается на сегменты и страницы. Каждому сегменту присваивается начальный адрес (база) и верхний адрес (база + предел). В дальнейшем адресация в командах осуществляется относительно базы сегмента (эффективный адрес ЕА). Такая адресация называется базовой. В МП 8086 / 88 для хранения базовых адресов используются сегментные регистры CS, DS, SS, ES.
В процессорах i486, Pentium базовые адреса и пределы сегментов хранятся в дескрипторах, которые размещаются в теневых сегментных регистрах (CS), (DS), (SS), (ES), (FS), (GS).
Базовый адрес массива и при необходимости индекс операнда массива хранятся в РОН МП. Причем индекс массива можно масштабировать путем умножения его на величину 21, 22, 23. Масштабирование эквивалентно микрооперациям сдвига содержимого индексного регистра влево на величину L1, L2, L3. Тогда в общем случае линейный адрес операнда с использованием косвенной адресации вычисляется по формуле
ЛА = ВС + (Х 2<SS> + (ВМ +D)).
Содержимое полей команды дешифрируется и устанавливается значение масштаба <SS>, номеров регистров РОН, где хранятся базовый адрес массива ВМ и индекс Х массива. Затем базовый адрес суммируется с содержимым смещения Disp поля команды ВМ + D. Одновременно величина в Х сдвигается на 0, 1, 2, 3 разряда влево в соответствии со значением <SS>. Затем величина индексного регистра Х суммируется с ВМ + D и тем самым вычисляется эффективный адрес операнда, т. е. его удаление от начала сегмента
ЕА = Х 2<SS> + (ВМ + D).

Рис. 1.5. Схема вычисления 32-битного линейного адреса
Величина ЕА сравнивается с величиной предела сегмента. Если ЕА не выходит за размеры сегмента, эффективный адрес суммируется с базой сегмента. Тем самым определяется линейный адрес ЛА операнда, который используется для определения физического адреса. В R- и V-режимах этот линейный адрес совпадает с физическим адресом ФА и передается в регистр адреса. В P-режиме этот адрес может быть больше размерности ОЗУ и линейный адрес с учетом страничного преобразования обычно преобразуется в физический адрес. В зависимости от составляющих BM, X, D, 2<SS>, которые могут присутствовать или отсутствовать в микрооперациях вычисления адреса, различают базовую, индексную и их разновидности со смещением адресации операндов. При базовой адресации в команде отсутствует смещение и не используется индексирование. ЕА задается только базовым РОН кроме ESP. Искомый РОН в мнемонике описания команды заключается в скобки. Например, mov eax, [ecx] - передать в EAX двойное слово из ОЗУ с адресом = база сегмента + ECX.
При базовой адресации со смещением ЕА определяется суммированием содержимого РОН, закодированном в поле base, с величиной 8 / 16 / 32-разрядного смещения в команде. Смещение в команде является целым числом со знаком. Например, команда mov eax, [esi + D] осуществляет передачу в ЕАХ содержимого ячейки ОЗУ с адресом, равным сумме базы сегмента РОН ESI и смещения в поле команды + D. Отличительной особенностью способа индексной адресации со смещением и масштабированием от базовой адресации со смещением является возможность масштабирования индексного адреса Х путем умножения его на 1, 2, 4 или 8. При множителе 1 эти способы адресации не отличаются. При множителях 2, 4 или 8 масштабирование (сдвиг влево на один - L1, два - L2 и три разряда - L3) позволяет осуществлять вычисление адреса с учетом размера элементов массива или задания их порядка обработки командой. Например, команда mov ecx, [esi 4] + 53 передает двойное слово, которое находится в сегменте данных с эффективным адресом L2 ESI (31, 0) + 53h.
Наиболее сложным способом адресации является базовый/ индексный с масштабированием и смещением. Для вычисления адреса в этом способе участвуют два РОН. Один из РОН содержит индекс, который масштабируется. Смещение размером в 8, 16 или 32 бита располагается в команде. Например, команда add eax, [ebx][edi 8] + 547671 осуществляет сложение содержимого EAX с элементом массива, имеющим эффективный адрес ЕА = EBX (31, 0) + L3 EDI (31, 0) + 547671h.
Использование команд с базовой / индексной адресацией упрощает программирование вычислений, уменьшает разрядность команд и позволяет размещать в операционной системе данные в любых освобождающихся областях ОЗУ, изменяя при этом только базовые адреса. Для уменьшения времени вычисления линейного адреса используется конвейерный параллельный способ дешифрирования команды и вычисления адресов, что позволяет многие команды на последней ступени обработки в МП Pentium выполнять за один такт синхронизации. В рассмотренных способах адресации место операнда кодируется в команде и закреплено за программой. При смене базовых адресов изменяются и физические адреса расположения операндов в памяти. Это усложняет обмен данными между программами и организацию программных прерываний. Для упрощения обмена между программами, прерываний при обращении к подпрограммам и “безадресного” поиска и размещения операндов в ЭВМ используется стековая адресация. Под стек отводится часть ОЗУ (сегмент стека с базовым адресом в регистре SS или (SS)), которая участвует в операциях МП с использованием реверсивного счетчика – указателя ESP / SP. Содержимое указателя ESP / SP (вершина стека) используется командами как поле адреса операнда. При записи в стек командами push величина ESP / SP уменьшается, а при чтении командами pop указатель увеличивается на величину, равную длине операнда в байтах, после выполнения команды. Например, команды push ecx передает в ОЗУ содержимое ECX по ЕА = ESP (31,0).
