Последната
актуализация
на този
раздел е от 2020
година.
5.1.2
Структура
на адресната
част на машинната
команда
Както
беше
показано на фигура 5.1.2,
адресната
част на
командата се
състои от две
подполета - “Поле 2”, в
което се
посочват кои
са операндите
и “Поле 3”,
в което се
посочва коя
да бъде
следващата машинна
команда.
Както
операндите,
така и командите
(като текст
на
програмите),
се намират в
оперативната
памет на
машината,
което е
следствие от
принципа за
програмно
управление.
Достъпът до
необходимите
данни
командата
получава
чрез съответния
адрес - адрес на
операнд или
адрес на
команда. В този
смисъл
съдържанието
на “Поле2” и
“Поле 3” представлява
адреси
на клетки в
оперативната
памет. Ето
защо, тази
част от
структурата
на машинната
команда, се нарича
адресна.
По
причини, на
които ще се
спрем
специално в
следващите
раздели на
тази книга, в
адресната
част на
машинните
командите в
съвременните
процесори се
съдържат
адреси само
от “Поле 2” или само
от “Поле 3”. С
други думи в
командите се
съдържат адреси
или само
на операнди
или само
на команди.
От тази
гледна точка
броят на
адресите в
структурата
на машинни команди
определя адресността
на процесора.
Определяйки
структурата
на машинната
команда,
понятието
адресност придобива
особено
значение.
Оказва се, че
то може да
има
отношение,
т.е. да бъде свързано
и с други
понятия,
определящи
същността на
процесора и
по този начин
става нарицателно
и
универсално
понятие.
Например, определяйки
структурата
на машинните
команди,
адресността
характеризира
цялата система
машинни
команди. В
резултат на
това си
позволяваме
да говорим за
едноадресни,
двуадресни
и триадресни
процесори,
машинните
команди на
които имат
съответно
структурите:
< КОП Адр. > ;
< КОП Адр.1, Адр.2 > ;
< КОП Адр.1, Адр.2,
Адр.3 > .
Адресността
на машинната
команда
зависи от
метода за достъп
до данните,
който е
реализиран в
съответното
запомнящото
устройство.
Както беше
изяснено в
глава 4, освен
директен,
съществува
още и
последователен
метод за достъп,
по силата на
който, в една
двуместна
операция
могат да
участвуват
само
операнди, запомнени
в съседни
клетки,
достъпът до
които
машинните
команди не
могат да
управляват.
Такива
процесори се
наричат стекови,
а
структурата
на техните
машинни
команди съдържа
само код на
операцията -
“Поле 1”, поради което
те се наричат
още безадресни.
Адресността на машинните команди зависи главно от принципни концепции и от водещите за конструктора критерии, подчиняващи логическата структура на процесора и най-вече структурата на онова устройство, в което ще се изпълняват повечето двуместни операции. В съвременни условия в структурата на процесора съществува множество от функционални устройства – за работа с фиксирана запетая, за работа с плаваща запетая и други специализирани устройства. Дори и в тези случаи обаче постановката на въпроса и разбирането на адресността не е по-различно от класическата ситуация - процесор с едно функционално устройство, най-често за обработка на числа с фиксирана запетая (така нареченото CPU). А тази структура съществува в достатъчно много съвременни модели и по много причини не е обречена на изчезване в близко бъдеще.
Твърдението, че адресността се определя от вида на суматора и структурата на аритметично-логическото устройство, в голяма степен е вярно, тъй като операцията, на която се пада основната част от изпълняваните операции, е операция от тип събиране (вижте таблица 3.1.1). Като имаме предвид, че операции умножение и деление се изпълняват фактически чрез операции от тип събиране, то сумарно излиза, че операциите от тип събиране надхвърлят 60% от всички изпълнявани в АЛУ операции. Ето защо видът на суматора (комбинационен или натрупващ) играе определяща роля и в този случай. За този логически възел най-подробно четете в книга [2].
При това разнообразие в адресността на машинните команди, естествено възниква въпросът кой от вариантите е за предпочитане. Качествата и ефективността на машинните команди със споменатите структури могат да бъдат оценени чрез броя на обръщенията към оперативната памет, които предизвикват в хода на своето изпълнение. Това е така, защото на това ниво на дискретизация, броят на обръщенията към ОП определя времето за изпълнение на машинната команда, а от там и на програмата. За целта на сравнението, което е направено по-долу, е прието, че извличането на машинните команди от оперативната памет (виж фигура 5.1.3), се осъществява за едно обръщение към паметта. Ще бъдат оценени машинните команди за четирите основни аритметически операции като най-типични.
1. Триадресен
процесор
Възможността в адресната част на командите да се указват три адреса означава, че за всяка двуместна операция могат да се посочват не само адресите на операндите, но и адресът за поместване на резултата. Така се определя следната структура и действие на командите:
Събиране: <
ADD Адр.1, Адр.2, Адр.3
> ;
Адр.3 := (Адр.1) +
(Адр.2) ;
Изваждане: <
SUB Адр.1, Адр.2, Адр.3
> ;
Адр.3 := (Адр.1) -
(Адр.2) ;
Умножение: <
MPY Адр.1, Адр.2, Адр.3
> ;
Адр.3 := (Адр.1) *
(Адр.2) ;
Деление: <
DIV Адр.1, Адр.2, Адр.3
> ;
Адр.3 := (Адр.1) /
(Адр.2) .
където,
според езика
на
микрооперациите,
деклариран в
глава 2,
означението
на операцията
следва да се
чете така: “съдържанието
на клетка с
адрес Адр1 се
събира (изважда,
умножава или
дели) със
съдържанието
на клетка с
адрес Адр2 и
полученият
резултат се
записва в
клетка с
адрес Адр3”.
Действието на тези команди включва извличане на двата операнда от оперативната памет, изпълнение на операцията и запис на получения резултат обратно в паметта. При това клетките, съдържащи операндите, съхраняват своето съдържание и след операцията. Тук под адрес може да разбираме и адрес на регистър от регистровата памет. За реализация на тази адресност аритметично-логическото устройство следва да има така наречената “три-регистрова” структура (вижте фигура 3.8.1.1 и фигура 3.8.1.2), в която към комбинационния суматор се подават едновременно във времето и двата операнда.
2. Двуадресен
процесор
В повечето практически случаи конструкторите предпочитат да съкратят формáта (дължината) на командата, като приемат, че резултатът се записва на мястото на първия операнд. При това положение, за същите действия, се определят следните команди:
Събиране: <
ADD Адр.1, Адр.2 > ; Адр.1 := (Адр.1) +
(Адр.2) ;
Изваждане: <
SUB Адр.1, Адр.2 > ; Адр.1 :=
(Адр.1) - (Адр.2) ;
Умножение: <
MPY Адр.1, Адр.2 > ; Адр.1 :=
(Адр.1) * (Адр.2) ;
Деление: <
DIV Адр.1, Адр.2 > ; Адр.1 :=
(Адр.1) / (Адр.2) .
Обърнете
внимание на
факта, че
резултатът при
това изтрива
участвалия в
операцията операнд.
Това
означава, че
тези
действия следва
да бъдат
съобразени
още при
синтеза на
алгоритъма.
И тук
аритметично-логическото
устройство
има
три-регистровата
структура (вижте
фигура 3.8.1.1
и фигура
3.8.1.2). Ако
командата е
от тип
“регистър-регистър”,
в нея са
указани
адреси
(номера) на
регистри.
Въпреки, че в
тези команди
посочените
адреси са
два, когато
това са
адреси в
оперативната
памет,
обръщенията
към нея
остават три. При
използуване
на такива
команди
програмистът
не бива да
забравя, че
след тяхното
изпълнение
първият
операнд се
изтрива и на негово
място се
помества
резултатът.
Двуадресната
командна
система е
по-ефективна от
три-адресната,
тъй като
всяка
команда е
по-къса, а
оттук
програмата
съставена от
такива команди,
ще заема
по-малко
клетки в
паметта. Така
е възможно да
се повиши и
бързодействието
на
програмата в
следствие на
по-бързото
извличане на
машинните
команди
(особено в
случаите,
когато те се
разполагат в
няколко
последователни
клетки).
3.
Едноадресен
процесор
Едноадресен
е този
процесор,
чиито машинни
команди не
могат да
съдържат в
адресната си
част повече
от един
адрес. Това е
възможно
само когато
архитектурата
на
аритметично-логическото
устройство е
реализирана
въз основа на
принципа на
натрупващия
суматор.
Разбирането
за процесор
от натрупващ
тип се състои
в
изказването,
че в такъв
процесор “всяка
операция се
изпълнява с
резултата от
предидущото
действие”. В
такъв случай
изчисленията
в процесора
(и в частност
в АЛУ)
се
организират
така, че един
от
операндите винаги
да се намира
в регистър с
общо предназначение,
който се
подразбира
от КОП
на командите.
Така от
структурата
на командата
може да бъде
премахнат
вторият
адрес и тя от
двуадресна
ще се
редуцира в едноадресна.
При това се
скъсява
нейният формат
и се постига
същия
положителен
ефект, както
в предидущия
случай.
Съществена особеност на този поход е, че резултатът, така както и в двуадресната машина, се помества на мястото на първия операнд. С други думи, след изпълнение на операцията, която машинната команда заповядва, първият операнд вече не съществува. Така говорим, че всяка нова операция се изпълнява с резултата от предидущото действие (в качеството му на първи операнд). От своя страна, новият резултат се явява първи операнд в следващата операция, което разбира се не е задължително от алгоритмична гледна точка. Регистърът, чието съдържание се взема в качеството му на първи операнд и после съхранява резултата, обикновено се нарича акумулатор и се отбелязва Акм или Асс. Така структурата и действието на машинните команди в такива процесори се представят по следния начин:
Събиране: <
ADD Адр.1 > ; Асс := (Асс) +
(Адр.1) ;
Изваждане: <
SUB Адр.1 > ; Асс := (Асс) -
(Адр.1) ;
Умножение: <
MPY Адр.1 > ; Асс := (Асс) *
(Адр.1) ;
Деление: <
DIV Адр.1 > ; Асс := (Асс) /
(Адр.1) ;
Използването
на резултата
от
предидущото
действие не
винаги е
необходимо
за следващата
операция. Ако
програмата
трябва да започне
ново
изчисление,
по нова
формула например,
този
резултат
следва да
освободи акумулатора,
да бъде
изнесен от
него и съхранен
в друг
регистър или
в клетка от
оперативната
памет. Това
действие
обаче се
явява ново в
системата от
изпълними в
процесора
операции. То
се налага
заради
правилната
реализация
на
алгоритмите.
Като такова
то се определя
като едноместно.
Така в
процесори от
натрупващ
тип се появява
необходимост
от отделна
команда от
тип запис (Store),
работеща с
акумулатора:
Запис: <
STORE Адр.1 > ; Адр.1 := (Acc) .
Едновременно
с това
действие е
необходимо и
действието в
обратна
посока.
Действието в
обратната
посока е също
едноместно и
има за цел да
внесе в
акумулатора
ново (начално)
съдържание,
което да се
използва
като първи
операнд в
следваща
двуместна
операция.
Така се
появява
необходимост
от втората
команда за
зареждане (Load)
на
акумулатора:
Зареждане: <
LOAD Адр.1 > ; Acc := (Адр.1) .
Всички
команди за
процесори от
този тип изискват
поне едно
обръщение
към паметта.
4.
Безадресен
(стеков)
процесор
Развивайки
идеята за
подразбиращият
се от кода на
операцията
адрес на
операнд и върху
двата
операнда на
двуместните
операции, се
стига до
организацията
на
изчисленията
чрез стек. В
този случай регистрите
с общо
предназначение
в АЛУ
са
организирани
за достъп
чрез метода LIFO. Ако
се приеме, че
операндите
на машинните команди
се намират в
стека
(подредени по
подходящ
начин),
тогава е
възможно да
се приеме, че
всяка
аритметична
операция се
извършва на
върха на
стека - между
съдържанията
на първата и
на втората
върхови
клетки. По
този начин
отпада всякаква
необходимост
от явно или
косвено посочване
на адресите
на операндите
в
структурата
на командата.
Така в командата
остава само
кода на
операцията (КОП),
поради което
такива
команди се
наричат
безадресни:
Събиране: <
ADD > ;
SL:=(SL) + (TL), POP ;
Изваждане: <
SUB > ;
SL:=(SL) - (TL), POP ;
Умножение: <
MPY > ;
SL:=(SL) * (TL), POP ;
Деление: <
DIV > ;
SL:=(SL) / (TL), POP ;
Символните
означения TL и SL в
дефинираните
по-горе
команди
съответстват
на върховите
клетки на
стека (Top Level, Second Level).
Ако стекът не
е апаратен и
не
присъствува в
структурата
на АЛУ,
а е
организиран
като
програмен в
оперативната
памет, всяка
от горните
аритметични
операции
извършва по 3
обръщения към
паметта. Това
снижава
ефективността
на тази
организация,
ето защо тя
се прилага само
в случаите,
когато
стекът е
апаратен и присъства
в
логическата
структура на
АЛУ. Все пак
необходимите
за нормална
работа на такъв
процесор
команди LOAD и STORE
изискват
едно обръщение
към паметта.
Става дума за
реализация
на
необходимия
в този случай
трансфер на
данни между
стека и
оперативната
памет:
Зареждане
(на върха): < LOAD Адр.1 > ; TL:=(Адр.1) , PUSH ;
Запис (на
върха): < STORE Адр.1 > ; Адр.1:=(TL), POP .
Стекът,
като
безадресно
запомнящо
устройство,
позволява
достъп
единствено
до върховата
клетка TL, ето
защо тези
команди са
едноадресни –
указват само
адреса на
клетка от паметта.
Сравнението
на
представените
по-горе системи
от команди с
различна
адресност
трябва да
бъде
извършено
при еднакви
условия. За
целта
обикновено
във всяка от
системите се
анализира
откъс от
програма,
реализиращ
изчисляването
на даден
израз:
Z = (A*B) + (C*D) .
Ако се
приеме, че
дължината на
полето КОП е m[b],
а дължината
на адреса n[b],
за всяка от
четирите
системи, то
машинните
команди имат
следните
дължини:
·
Триадресна
команда: m + 3n [b] ;
·
Двуадресна
команда: m + 2n [b] ;
·
Едноадресна
команда: m + n [b] ;
·
Безадресна
команда: m
[b] .
В
таблица 5.1.2.1 са
представени
текстовете
на програмите
за
изчисляване
на
стойността Z
според
горния израз,
като се
изхожда от
положението,
че
стойностите
на променливите
A, B, C и D са
разположени
в паметта
предварително.
Таблица
5.1.2.1
|
|
Обем
на програмата в [b] |
Брой
на
обръщенията
към паметта |
|
Адресност |
Програма |
за
пренасяне
на данни |
за
цялостно
изпълнение |
|
3А |
MPY A,B,A MPY C,D,C ADD
A,C,Z |
3.(m+3.n) |
3 3 3 |
3.3=9 |
2А |
MPY A,B MPY C,D ADD A,C SUB Z,Z ADD
Z,A |
5.(m+2.n) |
3 3 3 3 3 |
5.3=15 |
MPY A,B MPY C,D ADD A,C MOVE Z,A |
4.(m+2.n) |
3 3 3 3 |
4.3=12 |
|
1A |
LOAD A MPY B STORE Z LOAD C MPY D ADD Z STORE Z |
7.(m+n) |
1 1 1 1 1 1 1 |
7.1=7 |
0A |
LOAD A LOAD B MPY LOAD C LOAD D MPY ADD STORE Z |
3.m+5.(m+n) |
1 1 1 1 1 |
5.1=5 |
Както
се вижда от
таблицата, в
случай на двуадресна
командна
система, са
представени
два варианта.
В първия, налагащото
се
предварително
нулиране на
клетка Z се
постига чрез
команда за
изваждане: Z:=(Z)-(Z).
На практика
за тази цел
се използва
логическата
операция
"изключващо
или": Z:=(Z)mod2(Z). В този
вариант
първоначалните
стойности на
променливите
А и С се унищожават
от временно
запомнените
в тях междинни
резултати.
Оптимизирането
на програмите
в тази
система
машинни
команди се
постига чрез
въвеждане на
чисто
трансферни команди,
наричани
обикновено MOVE (Прехвърляне).
Машинните
команди за
трансфер на
данни са също
двуадресни,
което е
естествено,
тъй като
следва да
посочат
адрес на
източник и
адрес на
приемник.
Оптималният
вариант за
програмиране
на израза, с
използване
на команда MOVE, е
представен
на второ
място в таблицата.
Вижда се
ясно, че при
него се
печели и според
двата
критерия.
Очевидно, че най-неефективна, според степента на използване на адресната част на командата, е триадресната система, но затова пък тя постига най-кратко записване на алгоритъма. В същото време програмата за стековата машина е най-дълга, но ще се изпълни най-бързо.
Машините
със стекова
организация
имат големи
преимущества
при
изчисляване
на сложни
изрази. Тези
машини имат
най-късите
команди и
въпреки, че
програмите
написани за тях
могат да
бъдат много
по-дълги в
сравнение с
аналогичните
текстове за
други
системи,
много често
те заемат
по-малко
място в
паметта.
(много
команди, но
къси).Това е в
сила дори и
спрямо
процесори,
имащи голям
брой
регистри с общо
предназначение,
чиито
програми
могат да се
запишат само
с команди от
тип “регистър-регистър”
(R-R).
Въпреки,
че
програмите в
процесори
със стекова
организация
могат да се
окажат по-къси
в сравнение с
тези за
едноадресните,
това не
означава, че
тези
процесори
имат по-високо
бързодействие
от
процесорите
с богата
регистрова
памет. Бързодействието
на
съвременните
процесори се
ограничава
най-вече от
бързодействието
на отделните
нива в
йерархичната
запомняща
система
(вижте
глава 6). Ето
защо, за
получаване
на
сравнително
надеждна и
правдоподобна
оценка за
скоростта на
изпълнение
на програмата,
трябва да се
определи
броя на обръщенията,
които тя
прави към
паметта,
както при
изпълнение
на отделните
команди, така
и при
извличане на
последните,
според
алгоритъма
на командния
цикъл. В
процесори
със сложна
архитектура,
характеризираща
се с използване
на всички
съвременни
технологии за
повишена
производителност,
критериите
за оценка на
последната
са свързани с
качествата
именно на
тези
технологии –
конвейерна
организация,
суперскаларност,
буфериране
(кеширане) на
командите и
на
микрокомандите
с прилагане
на сложни
алгоритми за
предсказване
на условните
преходи и
прочие.
Стековите процесори постигат високо бързодействие в случаите, когато стекът е апаратен и се намира в логическата структура на АЛУ, която обаче се явява скъпо апаратно устройство. За да се подобри от друга страна качеството на програмния стек, конструкторите често разполагат няколко от върховите му клетки в "свръхоперативни" регистри на процесора. Когато програмата се обръща към върха на стека, апаратен достъп до паметта се извършва само в случаите, когато регистрите от стека са вече заети или свободни, поради превишаване на броя на операциите "зареждане" спрямо броя на операциите "запис" в стека и обратно. Въпреки този компромис, все още е спорен въпросът за възможността да се създаде изчислителна машина със стекова организация на паметта, притежаваща бързодействието на машина с буферно регистрово запомнящо устройство, при еднакъв обем на апаратурните разходи. Стековата структура е най-подходяща не само за изчисления на сложни изрази, тя е най-естествената структура при реализация на различни видове прекъсвания, за които ще стане дума по-късно. Не случайно тя е избрана като структура за реализация на виртуалните процесори от типа JVM (JAVA virtual machine). Ще отбележим, че една от главните цели на езикът JAVA е да представи текста на програмата така, че той да се пренесе по Internet-мрежата, да се компилира и да се изпълни безпроблемно върху всяка потребителска платформа. Стековата архитектура на JVM води до простота в машинните команди и лесна компилация на програмите.
Изискваното време и необходимото оборудване в процесора зависи от класа алгоритми, за ефективната реализация на които е предназначена дадената изчислителна машина. В частност това са следните характеристики на алгоритмите:
·
Честотата,
с която се
употребяват
аритметическите
операции и
средния брой
операции в
аритметическите
(логическите)
изрази ;
·
Честотата,
с която се
използуват
операциите
от другите
групи, както
и броя на
адресите
необходими
за отделните
операции .
Архитектурата
на
съвременните
процесори се
характеризира
с много
особености.
Една от тях
се състои в
това, че
командите и
данните се
съхраняват в
едно и също
запомнящо устройство.
За повечето
системи това
е необходимост,
произтичаща
от принципа
на програмно
управление.
Това е
необходимо и
за някои програмни
инструменти,
с чиято помощ
програмите
се
обработват
като данни
(например при
зареждането
им в паметта).
В много
съвременни
системи
обаче
липсват
резидентни
средства за
разработване
на програми,
в резултат на
което
последните
никога не се
смесват с данните.
Не са
изключение и
процесори с
разделни за
програмите и
за данните
памети.
В съвременни условия търсенето на оптимална архитектура за дадено изчислително устройство е свързано с изследването на различни методи за организация на процесите в него, при които обаче основополагащите принципи остават в сила. Както твърдят някои съвременни автори, конструирането на системата машинни команди с техните структури и формати, се характеризира по-скоро като изкуство, отколкото резултат на формални научни методи. Конструирането на машинните команди в голяма степен се влияе от ширината на данновата шина, от дължината на адресируемата единица, от структурирането на адресното пространство, от методите за достъп до информацията, от структурата и организацията на операционните устройства, а така също от дължината на декларираните за данните формати.
Следващият
раздел е: