Последната
актуализация
на този
раздел е от 2020
година.
5.2.2 Методи
за
адресиране
на командите
Първоначално
дефинирахме
теоретичната
структура на
машинната
команда
(вижте фигура
5.1.2). Адресът от
“Поле 3” на тази
структура бе
предназначен
да осъществява
логическата
(алгоритмичната)
връзка на
текущата
команда със
следващата,
по силата на
алгоритъма,
който тя
реализира. Тази
задача на
командата
обаче трябва
да се
разглежда в
контекста на
видовете
алгоритмични
структури. В
тази връзка
веднага трябва
да се каже, че
съществуват
два основни
вида предаване
на
управлението,
или два вида
преходи - безалтернативни
и
алтернативни,
които
още се
наричат
безусловни и
условни. Според
принципа за
програмно
управление, командите
се намират в
оперативната
памет, което
означава, че алгоритмичният
преход от
едно
действие към
друго
действие се
превръща
чрез програмната
реализация в адресен
преход. Адресът
за връзка със
следващата
по действие
команда,
който
текущата
съдържа в
себе си, се
нарича адрес
за преход.
Така алгоритмичните
преходи се
реализират
чрез адресни
преходи, в
резултат на
което се
постига автоматичния
ход на
изчислителния
процес, т.е.
изпълнението
на
програмата
без намесата
на
потребителя.
Изпълнението
на алгоритъма,
т.е. на
програмата,
може да се
наблюдава в
адресното
пространство
на процесора
като
последователно
“подскачане”
(преход) от адрес
на адрес
(разбирайте
от команда на
команда). Тук
отново
искаме да
обърнем
внимание на
читателя, че
ние
разбираме
машинната програма
като текст
(последователност
от машинни
команди). В
този текст,
записаната
като
следваща по
ред команда, не
винаги е
следващата
по действие.
Нека
припомним, че
поредното
изпълнение на
програмата
представлява
реалния,
единствения
ход на
изчислителния
процес, а
алгоритъмът,
който тя
изразява като
текст, се
характеризира
със свойството
общност
(вижте поясненията
след фигура 2.1.2)
като съдържа
пълното
множество
възможни за
изпълнение
пътища. Този
пункт е
посветен на
техническата
реализация
на алгоритмичния
преход към
следващата
команда.
Съществуват два метода за адресиране на команда. Естественото решение, както беше казано по-горе, е основано на определението за машинна команда и се представя по следния начин:
Фиг. 5.2.2.1. Принудителна
реализация
на
алгоритмичния
преход към
следващата
команда
Когато
в
структурата
на машинните
команди
присъства
адресът за
преход,
говорим, че логическата
връзка между
отделните
команди е
осъществена
чрез метода
на принудителното
адресиране.
А) Принудителна
адресация на
командите
Според
този метод,
адресният
преход се осъществява
чрез явно
указване на
адреса на следващата
(по действие,
по алгоритъм)
команда, в
адресната
част на всяка
команда
(фигура 5.2.2.1).
Така всяка
машинна
команда
решава и
трите задачи,
които са й
поставени, т.е.
тя:
· Заповядва
операцията ;
· Извлича
операндите
си и
изпълнява
заповяданото
върху тях
действие,
получавайки
при това
съответния
резултат ;
· Предава
управлението
на
следващата
команда.
Независимо
къде се
намира
последната, чрез
командния
цикъл на
процесора
(вижте фигура
5.1.4), могат да
се свържат и
изпълнят в
логическа
последователност
машинни
команди, разположени
в произволни
адреси.
Това,
че
програмистът
може да
разположи следващата
команда от
програмата в
произволно
място в
паметта, е
съществено
достойнство
на този метод
за
адресиране,
тъй като по
този начин
може да се
постигне
висока степен
на
уплътняване
в адресното
пространство
и ефективно
използуване
на паметта. За
съжаление
това
адресиране
има съществени
недостатъци,
които се
изразяват в
следното:
·
На
първо място в
затрудненото
разполагане
на
програмата в
паметта от
страна на
автоматизираните
средства за
програмиране
;
·
И
на второ
място в
удължаване
на машинната команда,
а от там в
снижаване на
бързодействието
на
програмата.
Тези
недостатъци
се засилват в
случаите,
когато
трябва да се
реализира
алтернативен
преход, при
който в “Поле 3” на
адресната
част на
командата (вижте
фигура 5.1.2)
трябва да
бъдат
указани поне
два адреса за
преход.
Във
връзка с
това, че
командата
съдържа решенията
и на трите си
задачи,
методът за
принудително
адресиране
не поражда
необходимост
от специални команди,
предназначени
за
безалтернативни
(безусловни)
преходи. В
тази връзка
следва да
кажем, че
необходимата
апаратура за
реализация
на адресния
преход се
изразява само
в една
логическа
връзка от
регистъра на
командата Рг.К
към схемата
за формиране
на адреса за
преход СФАП,
както е
показано на фигура 5.1.3.
Въпреки
привлекателните
страни на
този метод за
адресиране
на команди,
той не намира
широко
практическо
приложение,
тъй като той
води до
усложнена
структура на
машинната
команда и
съществено
затруднява
реализацията
на
принципите
за автоматизирана
подготовка и
обработка на
програмите,
вложени в
съвременните
операционни
системи. Все
пак неговото
приложение
не е тотално
изключено
тъй като
съществуват
условия и
форми за
неговото
използване.
Особено
полезен е той
на
микропрограмно
ниво.
Б) Естествена
адресация на
командите
Основен
подход за
облекчаване
структурата
на командата
и
опростяване
на адресния преход
между
командите е
въвеждане на регулярност
в тяхното
разположение.
Регулярното
(последователното)
подреждане
на командите
при
създаване на
текста на
програмите е
нещо естествено.
Така една
линейна
алгоритмична
последователност
се превръща в
текст на
програма с
последователно
записани
машинни
команди.
Приема се за естествено
положението,
че ако няколко
машинни
команди
реализират няколко
последователни
операции в
даден алгоритъм
и са записани
последователно,
то тези
команди
следва да се
разположат в
оперативната
памет в последователни
клетки! Ако
тази
уговорка
бъде
реализирана,
то при това
разположение
на командите
възниква регулярна
(закономерна)
връзка между
адресите на
клетките, в
които те се
намират, която
може да бъде
изразена
както следва:
където,
както може да
се види от
рисунката
по-долу, Ak е
началният
адрес на
група от Lk=3
последователни
клетки, в
които е
поместена k-тата по ред
в текста на
програмата
машинна команда,
а
непосредствено
следващият
адрес Ak+1, е
началният
адрес на
следващата (k+1)-ва
машинна
команда.
Фиг.
5.2.2.2. Начални
адреси на
последователно
записани
команди
Дължината
на всяка
команда Lk е
изразена в
брой
адресируеми
единици. Зависимостта
(5.2.2.1) може да се
използува
само, ако в
процесора е осигурено
задължителното
разположение
на
последователните
команди, в
последователни
клетки. При
това условие,
адресирането
на прехода
между
командите,
може да се извади
от
структурата
й и функциите
на самата
команда и да
се реализира
вън от нея, с
апаратни
средства.
Това
означава, че “Поле 3”
няма да
присъства в
структурата
на командата,
а функциите
му се
възлагат за
изпълнение
на
управляващото
устройство, в
съответната
фаза на
командния
цикъл.
Непосредствената
реализация
на закона (5.2.2.1) е
апаратна и се
съдържа в
схемата за
формиране на
адреса за
преход СФАП
(вижте фигура
5.1.3). Тъй
като
извличането
на машинната
команда се
постига чрез
последователни
обръщения
към
последователни
клетки на
оперативната
памет (на
брой три
според
примера по-горе),
то микропрограмната
процедура за
извличане на
машинната
команда, като
следствие
подготвя и
адреса на
следващата
команда. Така
например, ако
Ak=a, то
първата
команда от
дадения
пример заема
клетките a, a+1 и a+2.
Функционалността
на тези
адреси е
инкрементна,
а тя се
реализира
апаратно
лесно с
помощта на
един сумиращ
брояч. Този
брояч се
нарича програмен брояч (ПБ).
Програмният
брояч
формира
адресите на
клетките,
съдържащи
машинните
команди и в
този смисъл
може да се
интерпретира
като адресен
указател,
следователно
неговата
дължина
трябва да
съответства
на обема на
адресното
пространство
на процесора.
Програмният
брояч
изразява
зависимостта
(5.2.2.1) по следния
начин
Ако
съдържанието
на
програмния
брояч е Ak, т.е.
равно на a, то
след три
поредни
обръщения
към паметта,
след всяко от
които се
изпълнява
инкрементното
модифициране
на
програмния
брояч ПБ:=(ПБ)+1, k-тата
машинна
команда ще
бъде
извлечена, а
съдържанието
на
програмния
брояч ще се
окаже равно,
според
зависимостта
(5.2.2.2), на следващия
по ред адрес,
т.е. на a+3. Не е
трудно да се
разбере, че
при този
начин на
функциониране
на
програмния
брояч, следващият
адрес, който
се оказва
автоматично
получен като
негово
съдържание, е в
същото време
и адрес на
следващата
команда
във всички случаи
на линейни
алгоритмични
(програмни) участъци.
Този начин на
получаване
на адреса на
следващата
команда
прави напълно
излишно
адресното
поле за
преход и то
не присъства
в
структурата
на машинната
команда.
Модифицирането
на
програмния брояч
с +1
дава наименованието
естествено
адресиране
на този
метод.
Така
реализацията
на метода
естествената
адресация на
машинните
команди
изисква всяка
програма да
се разполага
в паметта като
масив, а в
структурата
на процесора
да се въведе логическият
възел програмен
брояч.
Дължината на
последния се
определя от
дължината на
адреса и
основния
пряк метод за
адресиране.
Програмният
брояч е
възел, който
се управлява
микропрограмно
от управляващото
устройство и
програмистът
няма достъп
до него. Този
логически
възел в
структурата
на процесора
е един от
програмно
недостъпните
за
непосредствени
манипулации и
това е
разбираемо,
като се има
предвид объркването,
което може да
настъпи при
случайно, или
умишлено
изменение на
неговото съдържание.
Като
следствие от
казаното
по-горе е изводът,
че
стартирането
на една
програма в
изчислителната
машина в тези
условия, означава
преди всичко зареждане
на
програмния
брояч с
началния адрес
на нейната
първа
команда.
Това
зареждане се
извършва от
операционната
система чрез
механизма на
програмните
прекъсвания.
С определяне
на съдържанието
на
програмния
брояч, по
силата на
командния
цикъл,
започва
извличането
и изпълнението
на команди по
тези адреси,
т.е. стартира
изпълнението
на избраната
по
съответния
начален
адрес програма.
Във
връзка с
казаното
веднага
възниква
въпросът за завършването
на
програмата.
Той стои по
аналогичен
начин, тъй
като
принципно
спиране на
изчислителния
процес
според
теорията на
крайните автомати,
не е
възможно.
Завършването
на една
програма
всъщност е преход
към друга, т.е.
стартира се
друга
програма.
Групата
от машинни
команди в
командната система
на един
процесор,
които не
съдържат в
структурата
си адрес за
преход и
които след
изпълнение
на
съответното
действие предават
управлението
на
следващата
по ред команда
чрез програмния
брояч, се
нарича основна.
По силата на
казаното
става ясно,
че структурата
на машинна
команда от
групата на основните,
може да има
един от
следните
видове:
Фиг. 5.2.2.3. Възможни
формати на
команди от
групата на основните
С
други думи
съществуват
безадресни и
адресни
команди, като
адресността
на последните
се отнася
само до
операндите
на означеното
действие. И в
двата случая
адресният преход
към
следващата
команда се
реализира
вън от
командата
чрез
програмния
брояч.
За
съжаление
съществуват
и други,
по-сложни
алгоритмични
структури, за
чието реализиране
методът на
естествената
адресация е
неудобен. На
първо място
това са
разклонените
алгоритмични
структури.
Естественият
ход на
адресирането
може да бъде
нарушен още
при преход
към
подпрограми,
при поява на
прекъсване,
при команди
от тип
заместване,
или при
преход към
друго
състояние,
или режим на
работа на
процесора. С
други думи непоследователните
адресни
преходи са
нещо
нормално,
както в хода
на дадената
програма,
така и при
преход от
една
завършила,
или прекъсната
програма към
друга,
съхранявана
в паметта, но
в друга
адресна
последователност.
Преминаването
от една
адресна
последователност
към друга
представлява
безусловен
алгоритмичен
преход със
скок. Този
скок се изразява
в
рязка, смяна
на
съдържанието
на програмния
брояч.
Реализацията
на
безусловния
адресен преход
не е във
възможностите
на командния
цикъл, ето
защо за
реализиране
на така
споменатите
адресни
преходи,
системата от
машинни
команди на
всеки реален
процесор се
допълва с
една нова и
сравнително
голяма група
от специално
предназначени
машинни
команди,
наречени команди
за
управление
на прехода.
В) Команди
за
управление
на прехода
Преди всичко трябва да изясним, че командите, на които ще се спрем, имат за решаване само една от дефинираните за една машинна команда принципни задачи (вижте определението), а именно само третата задача! С други думи, това са машинни команди, които реализират само адресния преход към следващата команда. Те нямат операнди и не предизвикват действия в операционните устройства на процесора. Единственото им предназначение е да свържат командите от една адресна последователност с командите в друга адресна последователност при автоматичния ход на изчислителния процес. Това се налага като самостоятелна задача, тъй като на практика съществуват множество причини, заради които естественото адресиране с помощта на програмния брояч, е невъзможно.
В1) Команди
за
безусловен
преход (БПр)
Машинните команди от тази група са предназначени да реализират безалтернативните (безусловните) алгоритмични преходи. Необходимостта от тези команди се обосновава от практически съществуващото положение, че трябва да бъдат свързани в логическа последователност машинни команди, които не са разположени в съседни (последователни) клетки.
За да изясним необходимостта, структурата и функционирането на тези команди ще си послужим с пример. Разглеждаме примера от фигура 5.2.2.4, където е представена част от блок-схема на алгоритъм, както и примерното разположение на реализиращите тази част машинни команди.
Фиг. 5.2.2.4. Схеми
на
безусловен
алгоритмичен
и адресен
преходи
Ако
приемем, че
(Действие №q),
(Действие №k) и
(Действие №k+1)
от
алгоритъма
се
реализират с
машинните
команди
(Команда №q),
(Команда №k) и
(Команда №k+1),
съответно
разположени
по адресите Aq,
Ak и Ak+1, и че
това са
машинни
команди от
групата на основните,
това
означава
следното -
всяка от тези
команди след
изпълнение
на означеното
действие ще
се свързва
със следващата
по ред, по
силата на
въведената
закономерност
(5.2.2.1). От тук
следва, че
след
изпълнение
на q-тата
команда,
управлението
ще се предаде
на адреса Aq+1.
Според
алгоритъма
обаче,
управлението
трябва да се
предаде на
команда,
изпълняваща (k+1)-то
действие,
което е
реализирано
с машинна
команда,
разположена
по адрес Ak+1. С
други думи, в
този случай
механизмът
на естественото
адресиране
на командите
реализира неправилен
преход -
вместо от
адрес Aq в
адрес Ak+1, се
извършва
преход от Aq в
Aq+1 ! Ето
защо за да се
реализира
алгоритмичният
преход от
(Действие №q)
към (Действие
№k+1), в клетката
с адрес Aq+1
трябва задължително
да бъде
разположена
машинна команда
за
безусловен
преход (БПр)
към адрес Ak+1
!
Така
безусловният
алгоритмичен
преход от (Действие
№q) към (Действие
№k+1) се
реализира
чрез два
адресни
прехода (на
рисунката са
означени с
червен цвят).
Принудителният безусловен адресен преход, който се реализира с командата БПр трябва да запазва в новата адресна последователност реализацията на основния метод за адресиране на командите - естествения ред, ето защо действието на командите за безусловен преход е твърде просто и се описва в два пункта:
1.
Формиране на
адреса за
преход Апр ;
2.
Зареждане на
адреса за
преход Апр в
програмния
брояч (ПБ:= Апр).
От
тук следва,
че
структурата
на всички
команди за
безусловен
преход е едноадресна,
т.е. тези
команди
задължително
имат адресна
част, чиято
адресност е
единица.
Апаратното
обезпечаване
на
действието на
тези команди
изисква
единствено
необходимостта
от връзка между
регистъра на
командата РгК и
програмния
брояч ПБ,
който е част
от СФАП
-
вижте фигура
5.1.3. При
зареждане на
ново
съдържание в
програмния
брояч,
старото се
унищожава.
Адресната
част на
командите за
безусловен
преход по
същество
трябва да
съдържа адреса
за преход.
Този адрес
обаче може да
бъде представен
както явно,
така и
неявно. С
други думи,
поставя се
въпроса за
изобразяване
на този
адрес. Както
вече беше
изяснено в
предидущия
пункт, този
въпрос се
решава с помощта
на
съответните
методи за
адресиране.
Така че тук
ние следва да
поясним,
приложими ли
са
разгледаните
вече методи
за адресиране
на операнди,
при
адресиране
на машинни
команди. В
случая,
приложимостта
на методите
за
адресиране
на операнди
следва да бъде
разгледана
много
внимателно,
тъй като предварително
нищо не я
гарантира.
За
изразяване
на адресния
преход, в
командата за
безусловен
преход БПр, се
прилагат
следните
основни
методи за адресиране
-
пряка,
косвена и
относителна
адресация, имащи
редица
модификации
в практиката.
Индексният
метод за
адресиране
не се
прилага,
защото той е
без смисъл
при
изразяване
на адрес за
преход.
За
изразяване
на адреса за
преход
най-естествено
се прилага
методът на прякото
адресиране.
Прякото
адресиране
изисква в
адресната
част на
командата за
безусловен
преход (БПр)
да се съдържа
изпълнителният
адрес на
прехода:
Фиг. 5.2.2.5. Формат
на команда за
пряко
адресиран
безусловен
преход
От тук
следва, че
дължината на
адресната част
на тези
команди се
определя от
дължината на
адреса. Изпълнението
на пряко
адресираната
команда за
безусловен
преход се
свежда до
изпълнението
на една
единствена
микрооперация:
ПБ:=(Рг.К[A]).
В
чист вид този
метод за
адресиране
се среща в
процесори с
линейно
адресиране,
т.е. в процесори,
чиято
логическа
структура не
е
предопределена
от
логическата организация
на адресното
пространство.
Такива
процесори са
преди всичко
микропроцесорите
с малка
дължина на
разрядната
мрежа. В
много
практически
реализации
прякото
адресиране
има
модификации,
които обикновено
се наричат "близък
преход",или "далечен
преход".
Това е
свързано с
желанието на
конструкторите
да скъсят
командите за
безусловен
преход, а от
там и да
повишат
бързодействието
им. В тези
случаи
частично
изразеният
адрес за
преход в
командата се
допълва въз
основа на
правилото на
знаковото
разширение.
Съществено
достойнство
на този метод
за адресиране
е високата
скорост на
прехода.
Пряката
адресация
като метод за
адресиране
на команди
обаче има
съществен
недостатък,
който се
изразява в
това, че
програмите,
съдържащи
такива
команди, са
непреместваеми.
Затова пък в
състава на
системно
локализирани
програми
(например в
памет от тип ROM)
те са предпочитани.
При косвено
адресирана
машинна
команда се
предполага,
че в
адресната
част на
командата за
безусловен
преход се намира
указател
(косвен адрес
на прехода). Последното
се разбира от
спецификатора
за косвено
адресиране
КА. Формално
командата
има следния
формат:
Фиг. 5.2.2.6. Формат
на команда за
косвено
адресиран безусловен
преход
Така както
и при
адресиране
на операнди и
тук при адресиране
на команди
могат да се
различават пряка
косвена
адресация и косвена
регистрова
адресация. Пряката
косвена
адресация с
дълбочина единица,
изисква едно
обръщение
към основната
памет с
адреса, който
е посочен в
командата. В
резултат на
това обръщение
се извлича
изпълнителният
адрес на прехода.
Действието
на такава
команда е
изразено със
следващата
микропрограма.
Фиг. 5.2.2.7. Пряко
и косвено
адресиран
безусловен
преход
При косвената
регистрова
адресация
адресната
част на
командата за
безусловен
преход се
съдържа само
адрес на
регистър
Рг.№n от регистровата
памет на
процесора. В
този случай
команда е
къса и бърза -
нейното
изпълнение
представлява
само микрооперацията
ПБ:=(Рг.№n).
За
реализиране
на този метод
за адресиране
на команди се
изисква
специална
връзка между
данновата
шина и
програмния
брояч, разрешавана
само в този
случай. Като
посредник
може да се
използва
регистърът
на командата.
При относително
адресирана
машинна команда
се
предполага,
че в
адресната
част на
командата за
безусловен
преход
най-често се
намира
отместване. Относителното
адресиране на
командите е
най-широко
застъпеният
метод
практически
във всеки
реален
процесор. Основните
свойства на
този метод
вече бяха
разгледани. В
случая обаче
на относителен
безусловен
преход има
специфична
особеност,
свързана
именно с
факта, че се
адресира
команда.
Командата,
както вече
многократно
беше изтъквано,
е структурен
елемент в
програмата,
която пък е
масив в
последователни
клетки на
оперативната
памет. В този
смисъл
адресирането
на
безусловния
преход може
да се извърши
само относно
текущото
положение,
или с други
думи - относно
адреса на
текущата
команда. В
адресната
част на
командата се
поставя стойност,
която
наричаме отместване
– число, което
изразява
дължината на
прехода,
измерена
спрямо
споменатия адрес
в брой
адресируеми
единици.
Фиг. 5.2.2.8. Формат
на команда за
относително
адресиран
безусловен
преход
Изпълнителният адрес на прехода се формира по закона:
ПБ := [ (ПБ) - Lq+1 ] + D , (5.2.2.3)
където
отместването
D, за
дадения
пример, се
изчислява
така: D=Ak+1
- Aq+1.
Като
имаме
предвид, че
съдържанието
на програмния
брояч се
инкрементира
след всяко извличане
на команда,
трябва да
съобразим, че
по време на
изпълнение
на командата
за
безусловен преход,
в него се
съдържа
следващият
адрес. Ако
обърнем
внимание на
схемата
представена
на фигура 5.2.2.4
по-горе, това
съдържание е
адресът Aq+2.
Тъй като
отместването
D се
измерва
спрямо
адреса на
текущата
команда Aq+1,
то в закона (5.2.2.3)
по-горе
виждаме
разликата (ПБ)-Lq+1,
т.е.
съдържанието
на
програмния
брояч минус
дължината Lq+1
на командата
за
безусловен
преход. За
схемата от
посочената
фигура това е
[(ПБ)-1]. Операциите
в закона (5.2.2.3)
навеждат на
извода, че програмният
брояч ПБ
е възел,
който трябва
да е в
състояние да
изпълнява
операция натрупващо
събиране.
Така, след
всичко
казано за
програмния
брояч до
момента, се
налага
заключението,
че той
представлява
логически
възел с
богата
функционалност.
Тъй като
адресният
преход може
да бъде както
в посока
напред, така
и в посока
назад относно
текущото
положение
(текущото
съдържание
на
програмния
брояч),
следва че отместването
е число със
знак и
следователно
трябва да
бъде
изразено в допълнителен
код.
Често
в реалните
процесори
конструкторите
реализират
два вида
команди за
безусловен
преход -
команди за
безусловен къс
преход и
команди за
безусловен дълъг
преход. В
първия
случай за
отместването
D
в машинната
команда се
отделя поле
със
сравнително
малка дължина,
например 8
бита. С
такива
команди
могат да
бъдат
реализирани
преходи в
близката околност
на текущия
адрес -
например в
интервала [-128 ¸ +127]
адресируеми
единици.
Въпреки
малката дължина
на прехода,
командите за
безусловен
преход с този
формат се
предпочитат
от
програмиста,
тъй като те
са къси и в
резултат на
това
повишават
бързодействието
на
програмата.
Операцията
събиране в (5.2.2.3)
в този случай
се изпълнява
според правилото
на знаковото
разширение.
Съществуват
реализации,
при които
диапазонът
на прехода
може да се
разширява,
като вместо D
в (5.2.2.3) се
прибавя 2D.
Разширението
се постига
чрез
управлявано
шинно
изместване
наляво на
един бит на D.
Командите
за
безусловен
дълъг преход
имат същата
структура, но
дължината на
полето за
отместване е
по-голяма,
например 16
бита, което с
нищо не променя
закона (5.2.2.3).
Единственото
нещо, което
се повлиява,
това е
състава на
апаратурата
и нейното
управление. В
много
алгоритмични
ситуации
дългият
относителен
преход се
предпочита
пред прякото
адресиране,
защото
скъсява
командата и
запазва
свойството й
да бъде
преместваема.
При
формиране на
изпълнителния
адрес е
възможна
комбинация с
базов
регистър:
ПБ := (b) + [ (ПБ) - Lk ] + D , (5.2.2.4)
И накрая ще споменем, че програмирането на машинен език се практикува рядко. Обикновено машинното програмиране се извършва на асемблерен език. Автоматизираните програмни среди освобождават програмиста от задачата за изчисляване на отместването, като го заместват с правилото за поставяне на етикети (маркери), с които се бележат точките на преходите. Така асемблерният вид на командата се дефинира така:
<КОП
за
безусловен
преход>
<етикет
№ m>
Мястото на етикета в блок-схемата и неговото адресно съответствие за дадения пример може да видите на фигура 5.2.2.4 по-горе.
Към
групата на
командите за
безусловен
преход може
да се
причисли и
една
специална команда,
която може да
се нарече "Заместване
на КОП" .
Командата
има
структурата,
показана
по-горе на
фигура 5.2.2.5.
Тази команда
може да бъде
употребена в
една
програма, в
определено
място с
неизяснена
операция.
Изпълнението
на
неизяснената
операция
програмистът
може да
организира
вън от
основната
част на
програмата,
като при това
може да
експериментира
многократно,
без да се
налагат
изменения в
основната част
на
програмата.
Въпреки
че е команда
за
безусловен
преход, тази
команда не
изменя
съдържанието
на програмния
брояч, в
което се
съдържа и
възможността
за подмяна на
КОП.
Действието
на командата
е следното.
След като тя
бъде
заредена в
регистъра на
командите и
се установи,
че е команда
за заместване
(КОП=ЗАМ), се
извършва
обръщение
към паметта,
по адреса
указан в
адресната й
част. По този
адрес
програмистът
е длъжен да
постави
желаната
(експериментираната)
от него
команда. Тази
команда се
прочита от
оперативната
памет в
регистъра на
командите, в
резултат на
което
затрива
стоящата до
този момент
команда “ЗАМ”
и се
изпълнява.
Ако така
извлечената
команда е от
групата на
основните,
след
затваряне на
командния
цикъл, се
извлича
следващата
по ред
команда от нормалната
последователност
на програмата,
стояща след
командата за
заместване.
Краткото
обяснение се
илюстрира на
следващата
фигура.
Фиг. 5.2.2.9. Действие
на команда
“Заместване
на КОП”
Микропрограмата на командата за заместване на КОП е представена на фигура 5.2.2.10.
Фиг.
5.2.2.10. Микропрограма
на команда
“Заместване
на КОП”
Като
пример за
такава
команда
читателят може
да разгледа
командата с
мнемоника ВКРТ
за
32-разрядните
микропроцесори
на фирма Motorola.
Това е
двубайтова
команда,
която е още
по-гъвкава,
тъй като чрез
косвена
регистрова адресация
адресира
клетка в
оперативната
памет и
прочетеното
от нея
зарежда в
регистъра на
командата. В
случай, че
прочетеното
не е команда,
се генерира
прекъсване.
В2) Команди
за условен
преход (УПр)
Машинните
команди от
тази група са
предназначени
да
реализират
алтернативните
алгоритмични
преходи. Тези
преходи се
наричат условни,
тъй като
извършването
им зависи от
предварително
поставено
условие.
Блок-схемите
и програмите
в тези случаи
се наричат разклонени.
За да изясним връзката на алгоритмичния преход с неговата програмна реализация отново ще си послужим с пример. Примерът с разклонен участък в някаква блок-схема е представен на следващата фигура 5.2.2.11.
Фиг.
5.2.2.11. Схеми на
условен
алгоритмичен
и адресен преходи
Според
блок-схемата
от тази
фигура, след
(Действие №k)
има
възможност
да се изпълни
едно от
действията -
(Действие №(k+1)),
или (Действие
№q). Кой от
двата
алгоритмични
изхода ще
бъде избран
зависи от
проверката
на (Условие Х),
което може да
бъде изпълнено
(Да, Х=1, Х=True),
но може и да
не е
изпълнено (Не, X=0, X=False).
От
казаното
следва, че за
да се направи
избор, трябва
да се извърши
проверка на
условието X, а
това е едно
специфично
действие,
характерно
единствено
за командите
за условен преход.
В резултат на
проверката
се установява
логическа
стойност.
Тази
логическа
стойност е
формирана до
момента на
проверката и
обикновено е
фиксирана в
определен
бит на
регистъра на
признаците,
който както
вече
изяснихме
(вижте глава
3), е
неразделна
част от
структурата
на операционните
устройства.
Проверяваната
логическа
стойност се
нарича код
на условието (КУ).
Условието е кодирано,
тъй като е
възможно да
бъде логическа
стойност на
по-сложна
логическа
функция Х, чиито
аргументи
могат да
бъдат
няколко признака
(флага).
Кодирането
обикновено
има следния
смисъл:
КУ = 0 -
условието не
е изпълнено;
КУ = 1 -
условието е
изпълнено.
Кодът
на условието
е логическа
стойност на
логическата
функция Х,
разпознаваща
настъпването
на определено
събитие, при
изпълнение
на
последната
операция,
която го е
формирала.
Структурата на командата за условен преход е същата както и на командата за безусловен преход, т.е. в адресната си част тя съдържа адрес. По същество командата за условен преход следва да указва два адреса за преход. Това са начални адреси на клон “ИСТИНА” и на клон “ЛЪЖА”. В резултат на господстващия естествен метод за адресиране на машинните команди обаче в структурата на машинната команда се представя само единият адрес – обикновено адресът за преход към клона “Истина” (в горната схема това е адресът Aq). За начален адрес на клона “ЛЪЖА” се избира онзи, който автоматично е подготвил програмният брояч, при извличане на командата за условен преход. Ако погледнем горната схема ще видим, че това е адресът Аk+2. Така естествено се налага изводът, че когато програмираме, т.е. записваме текста на машинната (асемблерската) програма, след записване на командата за условен преход, сме задължени да запрограмираме най-напред действията в клона “ЛЪЖА” на условния преход. Вторият неизбежен извод е, че командите за условен преход имат едноадресна структура:
Фиг. 5.2.2.12. Формат
на команда за
пряко
адресиран
условен
преход
Действията,
които
изпълняват
командите за
условен
преход, са
изразени с
обобщената микропрограма
от
следващата
фигура 5.2.2.13. На нея
могат да се
видят трите
вида
изменения на
съдържанието
на програмния
брояч ПБ,
според
представените
три типични
метода за
адресиране
на команди за
управление
на прехода –
косен,
относителен
и пряк. В
случай, че
условието за
преход не е
изпълнено
(КУ=0), адресът
за преход е
този, който е
формиран в
програмния
брояч. Тогава
не са
предвидени
никакви
микрооперации
и командният
цикъл се
затваря –
следва
извличане на
команда от
следващия по
ред адрес.
Фиг. 5.2.2.13. Микропрограма
на команда за
косвен, относителен
и пряк
условен
преход
Структурата на машинната команда за условен преход при различните методи за адресиране на прехода (пряк, косвен, относителен) е аналогична на командата за безусловен преход. Аналогично е разбирането и за така наречения етикет в асемблерния език.
От
казаното става
ясно, че при
реализиране
на алгоритмичната
структура,
т.е. при
програмиране,
програмистът
е зависим от
действието
на командата
за условен
преход. Така
например, ако
преходът,
който трябва
да се извърши
е в посока
назад, към
вече
записани
машинни команди,
то
програмистът
вече знае
неговия
адрес. Ако
обаче
преходът е
напред, към
все още
незаписана в
текста на
програмата
машинна
команда, то
нейният
адрес е все още
неизвестен
и
програмистът
не е в
състояние да
попълни адресната
й част. Ето
защо, както
вече казахме
по-горе, при
програмиране
обикновено
се реализира
най-напред
клонът "ЛЪЖА"
на условния
преход, а в
последствие -
клонът
"ИСТИНА".
Признаците,
които
процесорът
фиксира в регистъра
на
признаците
(вижте
например фигура 3.2.1.1),
както и кодът
на условието КУ,
представляват
информация,
която се
консумира от
управляващото
устройство,
по силата на
факта, че то
реализира
микропрограмата
на всяка
команда
(вижте фигура
2.2.5).
Селекцията
на
конкретния
признак,
необходим за
проверка, се
извършва
според кода
на
операцията в
командата за
условен преход.
Това може да
става
директно, или
с помощта на
допълнителна
специализирана
информация.
Директната
селекция на
признака чрез
КОП се
практикува в
маломощните
процесори, в
чиито
команди за
условен
преход не може
да се посочи
ясно
изразено
поле на
условието.
Един
по-универсален
подход
предвижда структурата
на командата
да съдържа
отделно поле,
част от
полето КОП,
което се
нарича маска
на условието.
Маската
позволява
кодът на условието
КУ да
се формира
като
логическа
стойност в
една
комбинационна
схема, след което
да постъпва
за проверка в
управляващото
устройство
като
абстрактна
величина.
Така в
управляващото
устройство
се съхранява само
една
универсална
микропрограма,
а не много
специализирани.
Стойността
на кода на
условието се
изчислява
според
следната функция
Всеки
бит от
маската М,
която се
намира в
полето
"Условие" е
свързан с
конституент
на единицата,
формиран от признаците,
съдържащи се
в регистъра
на признаците
РгПр на
процесора.
Видът на
зависимостта
(5.2.2.5) позволява
проверка на
няколко
признака
едновременно.
Като пример
на казаното
по-горе е
представена
таблицата на
възможните
за проверка в
процесори на Intel
условия
(таблица 5.2.2.1).
Старшите 3
бита на маската
кодират
условието, а
най-младшия
бит кодира
правото или
инверсното
условие.
Таблица
5.2.2.1
Маски на
условията
Маска |
Проверявано
условие |
Мнемоника |
Логическа
функция |
0 0 0 0 |
Препълване |
O |
OF = 1 |
0 0 0 1 |
Няма
препълване |
NO |
OF = 0 |
0 0 1 0 |
Под/не
над или
равно |
B/NAE |
CF = 1 |
0 0 1 1 |
Не
под/над или
равно |
NB/AE |
CF = 0 |
0 1 0 0 |
Равно/нула |
E/Z |
ZF = 1 |
0 1 0 1 |
Не
равно/не
нула |
NE/NZ |
ZF = 0 |
0 1 1 0 |
Под
или равно/не
над |
BE/NA |
CF Ç ZF = 1 |
0 1 1 1 |
Не
под или
равно/над |
NBE/NA |
CF Ç ZF = 0 |
1 0 0 0 |
Със
знак |
S |
SF = 1 |
1 0 0 1 |
Няма
знак |
NS |
SF = 0 |
1 0 1 0 |
Четност |
P/PE |
PF = 1 |
1 0 1 1 |
Нечетност |
NP/PO |
PF = 0 |
1 1 0 0 |
По-малко
от/не
по-голямо
или равно |
L/NGE |
SFÅOF = 1 |
1 1 0 1 |
Не
по-малко
от/по-голямо
или равно |
NL/GE |
SFÅOF = 0 |
1 1 1 0 |
По-малко
или равно/не
по-голямо от |
LE/NG |
(SFÅOF) Ç ZF = 1 |
1 1 1 1 |
Не
по-малко или
равно/по-голямо
от |
NLE/G |
(SFÅOF) Ç ZF = 0 |
Чрез излишните комбинации на маската в някои процесори е кодирано специално изпълнение на командите за условен преход - например, като команда за безусловен преход, или като празна команда.
Празна
се нарича
онази
машинна
команда,
която не е
свързана с
изпълнима
операция. В
структурата
на тази
команда има
само КОП, т.е.
тя е безадресна
команда.
Употребата
на такава команда
по отношение
на
алгоритъма,
който се реализира
в дадената
програма, е
напълно
безопасно,
тъй като тя
не притежава
собствена
микропрограма.
Единственият
ефект от
употребата
на празна
команда в
дадено място
на
програмата е
загубата на
време за
нейното
извличане от
паметта. В
този смисъл,
тази команда
често се
използува за
реализиране
по програмен
път на осмислени
времеви
закъснения
(времеви
задръжки или
още паузи) в
действието
на
програмата. Освен
това тази
команда може
да се
използува за
резервация
на място в
програмата и
в последствие
да бъде
заменена с
подходяща команда,
без при това
да се налага
разместване
на командите.
В някои
случаи, като
например при
кратно
изравняване
на адресите
(вижте обясненията
в пункт 6.3.2.3),
празната
команда се
употребява
именно за попълване
на клетките
между две
раздалечени
команди. Ето защо
тази команда
се използува
активно от компилаторите
при
генериране
на машинния
код на
програми
написани на
език от високо
ниво.
В
процесори с
развита
командна
система съществуват
специфични
машинни
команди за условен
преход,
предназначени
за реализация
на циклически
алгоритмични
структури.
Както беше
изяснено в
предидущия
пункт, обработката
на данни,
нуждаещи се
от индексна
адресация, е
свързана с преадресиране
на командата.
Преадресацията
по същество е
операция за
изменение на
съдържанието
на индексния
регистър.
Много често,
поради
специфичните
им
възможности,
индексните
регистри се използуват
като броячи,
с цел да се
организират
цикли.
Условието за
край, което
обикновено
се формира
чрез
индексен
регистър, се
отнася до
съдържанието
му, което се
чете така: “е
ли то станало
нула?”, или до
отношението
на
съдържанието
му към дадена
стойност,
което се чете
така: “е ли то
станало
равно на?”.
Машинните
команди за
условен
преход, свързани
с проверка на
условие,
формирано
върху
признаците
на резултата
при операции
в индексните
регистри, се
наричат индексни.
Специфичното
за тези
команди е
това, че освен
проверката
на условието,
свързано с индексния
регистър, те
включват в
своята микропрограма
и
модификацията
на съдържанието
на регистъра,
която
обикновено е
декрементна
операция.
Съчетаването
на операцията
по изменение
на
съдържанието
на регистъра,
с проверката
на
формираните
при нея признаци,
дава в ръцете
на
програмиста
една бърза
команда, с
чиято помощ
реализацията
на програмни
цикли е много
ефективна.
Примери
за такива
команди
могат да
бъдат дадени
за много
реални
процесори.
Така
например, в
32-разрядните
микропроцесори
на фирмата Motorola,
има команди с
общата
мнемоника DBcc, (Test Condition, Decrement and
Branch -
Проверка на
условие,
декремент на
регистър и преход).
Структурата
на тези
4-байтови
команди е
следната:
< DBcc > < M >
< Reg.№n > < D
> .
Маската
М в
структурата
на командата
кодира
условието за
преход, което
за този вид
процесори е
представено
в следващата
таблица
Таблица
5.2.2.2
Маски на
условията
Маска |
Проверявано
условие |
Мнемоника |
Логическа
функция |
0 0 0 0 |
Истина |
T |
1 |
0 0 0 1 |
Неистина |
F |
0 |
0 0 1 0 |
Логическо
по-голямо |
HI |
notC Ç notZ |
0 0 1 1 |
Логическо
по-малко или
равно |
LS |
C È Z |
0 1 0 0 |
Няма
пренос |
CC (HS) |
notC |
0 1 0 1 |
Има
пренос |
CS (LO) |
C |
0 1 1 0 |
Не е
равно |
NE |
notZ |
0 1 1 1 |
Равно |
EQ |
Z |
1 0 0 0 |
Няма
препълване |
VC |
notV |
1 0 0 1 |
Има
препълване |
VS |
V |
1 0 1 0 |
Плюс |
PL |
notN |
1 0 1 1 |
Минус |
MI |
N |
1 1 0 0 |
По-голямо
или равно |
GE |
(NÇV) È (notNÇnotV) |
1 1 0 1 |
По-малко |
LT |
(NÇnotV) È (notNÇV) |
1 1 1 0 |
По-голямо |
GT |
(NÇVÇnotZ) È (notNÇnotVÇnotZ) |
1 1 1 1 |
По-малко
или равно |
LE |
Z È (NÇnotV) È (notNÇV) |
Изпълнението
на командата
им започва с
проверка на
условието (сс)
според
признаците,
формирани от
предходната
команда.
Веднага
трябва да
кажем, че ако
това условие
е изпълнено
(КУ=1),
управлението
се предава на
следващата
по ред
команда, т.е.
по текущото
съдържание
на
програмния
брояч. Така
фактически
се излиза от
цикъла.
Ако условието не е изпълнено (КУ=0), тогава се извършва следното:
1. Първо
се намалява с
единица
съдържанието
на указания
регистър Reg.№n, [Reg.№n:=(Reg.№n)-1].
2. След
това се
проверява
дали преди
това съдържанието
на регистъра
не е било
нула, т.е. проверява
се дали сега
то е равно на (-1). Ако е (-1), се
осъществява
преход, т.е.
формира се
ново
съдържание
на
програмния
брояч: ПБ:=(ПБ)+D,
където
отместването
D,
е 16-разрядно
число със
знак. С други
думи се прави
преход (затваря
се цикъла). В
случай, че
подусловието
не е изпълнено,
т.е. ако след
декрементиране
съдържанието
на регистър Reg.№n е
все още
положително
число, то
управлението
се предава на
следващата
по ред
команда (излиза
се от цикъла).
Описаната машинна команда е изключително интересна, тъй като тя по същество реализира проверка на две логически условия и реализира три различни вида алгоритмични прехода. Фактически тази команда чрез съдържанието на избрания регистър реализира цикъл от вида с предварително известен брой повторения. Цикълът се затваря, т.е. действията в тялото му се повтарят, докато предварително заредената в този регистър стойност не се изчерпи. Чрез проверката на условието сс обаче този цикъл може да бъде преждевременно напуснат. Вижда се, че входната точка на тялото на цикъла се адресира относително, което прави цикъла преместваем заедно с програмата. Освен това 16-битовото отместване позволява достатъчно дълъг преход, т.е. достатъчно голямо тяло на цикъла.
При достатъчно голяма начална стойност в регистъра-брояч с това условие може да бъде организиран и цикъл с предварително неизвестен брой повторения, а това прави командата изключително универсална и бърза. В командната система на тези процесори има още няколко подобни команди.
В
микропроцесорите
на Intel също има
аналогични
команди за
условен преход,
предназначени
за
реализация
на цикли.
Това са
командите с
мнемониката LOOPcc. Тези
команди имат
2-байтова
структура:
< LOOPcc > < D > ,
в която
отместването
D,
е 8-разрядно
число със
знак. Тези
команди работят
само с
регистър СХ и
действието
им е
следното.
Първо се
намалява
съдържанието
на регистър СХ с
единица: CX:=(CX)-1,
без при това
да се
променят
признаците в
регистъра на
признаците.
След това се
проверява
указаното
условие (сс),
отнасящо се
до новото
съдържание
на регистър СХ и ако то е
изпълнено
(КУ=1), се
извършва
относителен
преход, т.е.
съдържанието
на програмния
брояч се
променя така:
ПБ:=(ПБ)+D (затваря
се цикъла).
Ако
условието сс
не е
изпълнено
(КУ=0),
управлението
се предава на
следващата
по ред
команда (излиза
се от цикъла).
В тази
команда
могат да
бъдат проверени
само някои от
възможните
условия.
Става дума за
условията ZF=1? и
ZF=0? (вижте
по-горе
таблица 5.2.2.1). И в
командната
система на
тези
процесори също
има още
няколко
подобни
команди.
Що
се отнася до
командите за
условен
преход,
проверяващи
отношения
между
стойности (например
граници на
интервал),
читателят
може да изучи
действието
им самостоятелно,
в
конкретните
процесори.
Като пример в
случая могат
да се посочат
команди от
тип проверка - СНК, за
микропроцесори
на Motorola и BOUND
за
микропроцесори
на Intel.
Характерното
за тези
команди е, че
когато
проверяваното
отношение не
е изпълнено,
се генерира
прекъсване, в
противния
случай
управлението
се предава на
следващата
по ред
команда.
В3) Команди,
реализиращи
подпрограмна
техника
Както
беше
пояснено в
глава 2 на
тази книга, в
алгоритмичните
структури,
освен регулярни
(циклически)
повторения,
съществуват
и нерегулярни
(нециклически)
повторения.
Именно за
реализиране
на
нерегулярни
повторения в
командната
система на
всеки реален
процесор
съществува
определен
вид команди,
наричани команди
за работа с
подпрограми.
Тъй като това
са команди,
които по
своеобразен
начин
предават
управлението
от една команда
към друга, те
ще бъдат
разгледани в този
пункт.
Понятието
подпрограма
е свързано с определен
начин на
оформяне и
стартиране на
програмна
единица. Подпрограмата
обикновено
реализира
структурно и
функционално
обособена
част от цялостен
алгоритъм,
имаща
самостоятелно
и обобщено
(независимо)
значение
(приложение).
Запрограмираната
в
подпрограмата
обработка се
извършва
върху
обобщени
(структурно определени)
данни,
наричани формални
параметри.
Всеки път,
когато
потребителят
има нужда от
съответния
начин на
обработване
на конкретни
(действителни)
данни, т.е.
чрез алгоритъма
на дадената
подпрограма,
той може да използува
последната
като
инструмент
за тази цел. При
съвместното
функциониране
на софтуер с
подпрограми
говорим, че
изпълнението
на текущата
програма се прекъсва,
стартира се
изпълнението
на
подпрограмата,
а след
нейното
завършване
се възобновява
изпълнението
на
прекъснатата
програма. В този
процес
съществуват
два основни
проблема:
·
Автоматично
свързване на
две различни
програмни
единици за
съвместна
работа и ;
·
Обмен на
параметри
(данни) между
тях.
Без
да
коментираме
чисто
програмните
ефекти от
използуването
на
подпрограмната
техника, тук
ще бъдат
разгледани
средствата
за нейното
реализиране.
На първо
място това са
специалните
машинни команди
за безусловен
преход към
подпрограма
и безусловен
преход за
връщане от
подпрограма.
На второ
място това е
програмният
стек като
специализирано
запомнящо
устройство, реализиращо
определена
дисциплина
(ред).
Командите
за преход
към
подпрограма (ППП) имат
едноадресна
структура,
която не се
отличава от
тази на
командите за
безусловен преход
(вижте
по-горе фигура
5.2.2.5).
Адресната
част на тези
команди
съдържа началния
(стартовия)
адрес на
подпрограмата.
За да се осъществи
преход към
подпрограмата
и да започне
изпълнение
на нейните
команди, по
силата на
главния
метод на
естествена
адресация на
командите,
програмният
брояч трябва
да бъде
зареден с
нейния
начален
адрес. Обикновено
командите за
преход към
подпрограма
адресират
прехода
пряко,
косвено, или
относително,
аналогично
на командите
за безусловен
преход. В
някои
процесори
има група
команди за
къс преход и
група
команди за дълъг
преход към
подпрограма.
Освен
смяната на
адресната
последователност,
командата ППП
трябва да
осигури
възможност
за връщане на
управлението
след
изпълнение
на подпрограмата,
обратно в
програмата,
която я е повикала.
За да се
осигури тази
възможност,
командата ППП
трябва преди
да измени
съдържанието
на
програмния
брояч, да
запомни
текущото му
съдържание.
Текущото
съдържание
на
програмния
брояч представлява
адреса
за връщане
от
подпрограмата,
т.е. адреса за
продължение
на
прекъснатата
програма.
Командата ППП
изпълнява
запис на
съдържанието
на програмния
брояч във
фиксиран за
целта
регистър, или
в стека. По
принцип
фиксирането
на адреса за
връщане е
възможно да
се
организира на
няколко
места, но ние
ще
разгледаме
само най-оптималното
– програмния
стек, който
осигурява
дълбочина на
влагане на
подпрограмите,
а така също и
тяхната
преместваемост
(реентрабилност).
Така
действието
на командата
за преход към
подпрограма ППП
може да бъде
представено
чрез
следната микропрограма:
Фиг. 5.2.2.14. Обобщена
микропрограма
на команда за
преход към
подпрограма
В представената микропрограма адресът за преход се формира относително - чрез събиране на отместването, което стои в адресната част на командата със старото съдържание на програмния брояч. Както споменахме обаче, могат да се прилагат и други методи за адресиране на прехода. Със записване на адреса за преход в програмния брояч завършва изпълнението на микропрограмата, след което командния цикъл се затваря. При следващото му повторение, чрез новото съдържание на програмния брояч, се извлича и изпълнява първата команда от подпрограмата. В този момент казваме, че предидущата програма е прекъсната. Нейното изпълнение ще се възобнови след изпълнение на подпрограмата.
Операцията,
с която се
изменя
адреса в стековия
указател СУ
зависи от вида
на стека -
прав, или
преобърнат.
От
микропрограмата
се вижда, че в
стека се
занася
съдържанието
на
програмния
брояч, което
представлява
адреса
за връщане
от
подпрограмата.
От тук се
налага
заключението,
че това
съдържание
трябва да
бъде формирано
в командния
цикъл до
момента на
изпълнение
на командата ППП.
Ето защо, в
командния
цикъл,
изпълнението
е последната
фаза. Освен
това
изпълнението
не може да
започне
преди да е
завършило извличането
на командата,
защото ако тя
се окаже
команда за ППП,
първата микрооперация
от нейната
микропрограма
(виж фигура 5.2.2.14)
ще доведе до
неправилна
работа.
Операция
връщане
от
подпрограма (ВПП) е
една напълно
детерминирана
операция, ето
защо, в
системата от
машинни
команди се реализира
обикновено
само една
такава команда.
Командата за
връщане от
подпрограма (ВПП) е безадресна
команда, или
още стекова -
нейната
структура
съдържа само
КОП. Тази команда
изпълнява
операция
четене от
стека (или от
фиксиран
регистър) на
записаната от
командата ППП
стойност, но
в обратен
ред. С тези
действия тя
възстановява
в програмния
брояч
неговото
съдържание
до момента на
изпълнение
на прехода
към
подпрограмата.
Командата
има
микропрограмата,
показана на
следващата
фигура 5.2.2.15.
Фиг. 5.2.2.15. Обобщена
микропрограма
на команда за
връщане от
подпрограма
След затваряне на командния цикъл, следва извличане и изпълнение на команда от прекъснатата програма.
За
машинните
команди,
предназначени
да реализират
подпрограмната
техника е
характерно
това, че те не
засягат
съдържанието
на
признаците в
регистъра на
признаците.
При влизане в
подпрограмата,
тези признаци
могат да
бъдат
анализирани,
а при излизане,
получените в
подпрограмата
признаци, могат
да се
анализират
във викащата
програма.
В
някои
процесори, по
желание на
програмиста,
преходът към
подпрограма
може да се
осъществи
със
запомняне и
на регистъра
на
признаците.
Нещо повече,
за по-голяма
гъвкавост, е
желателно
преходът да е
съпроводен и
с възможност
за
управление на
неслужебна
(потребителска)
информация. За
целта в
процесорите
се
реализират
допълнителни
машинни
команди - команди
за преход
към
процедура (ПП)
и за връщане
от процедура (ВП). С
тези команди
конструкторите
са се постарали
да решат
отчасти и
проблема с
предаване на
параметрите.
На
машинно ниво
понятието процедура
се различава
от понятието
подпрограма
само по това,
че
извикването
и връщането,
е свързано с
предаване на
действителните
параметри на
процедурата.
Предаването
на параметрите
се извършва с
помощта на
декларирана
област в
стека.
Информацията,
която се
записва в
стека при
едно обръщение,
се нарича кадър.
По същество
тази
информация
може да представлява
както данни,
така и адреси
на данни.
Командите за
работа с
процедури
обаче не се
интересуват
от характера
на
информацията,
а единствено от
нейния обем и
средствата
за нейното
управление.
Тъй като, при
такова
съдържание
на стека, е реална
възможността
от
неправилна
работа със
записаната
информация,
споменатите команди
работят с два
адресни
указателя.
В
микропроцесорите
на Motorola,
командите за работа
с процедури
имат
мнемониката: <LINK
Reg.№n, d>
и <UNLK Reg.№n>.
В
горният
запис, с d е
означен
обемът на
областта,
необходим за поместване
на
формалните
параметри, а
с Reg.№n -
адресът на
регистър,
използуван
като адресен
указател в
областта на
формалните
параметри,
т.е. в
областта на
кадъра.
Микропрограмата
на командата LINK
изпълнява
следните
действия:
записва съдържанието
на указания
от командата
регистър Reg.№n в
стека, след
което
прехвърля в
него текущото
съдържание
на стековия
указател.
Това
съдържание е
базовият
адрес за адресиране
в кадъра.
След това,
съдържанието
на стековия
указател се
увеличава с
обема d на
областта,
която
кадърът вече
е заел. Тук е
мястото, в
което
читателят
следва да
помисли за
това, как ще
се реализира
операция
събиране в
стековия
указател при
операнд d по-голям от
единица.
При
команда UNLK се
освобождава
заетата в
стека област.
Това се
постига като
предидущото
съдържание на
стековия
указател,
запомнено в Reg.№n по
команда LINK, се върне
обратно.
По
аналогичен
начин е
реализирана
работата с
процедури и в
микропроцесорите
на Intel, където
вместо
регистър с
общо
предназначение,
за указател
на кадъра има
специален регистър,
наречен BP. Командата,
създаваща
областта на
формалните
параметри в
стека (стеков
кадър), има
мнемониката
<ENTER d, l>, a
командата,
която
освобождава
тази област -
мнемониката
<LEAVE>.
Обикновено
командата ENTER се
използува
като първа
(начална)
команда на
процедура.
Стековият
кадър, който
тя създава е
съвместим с
правилата на
работа на езиците
с блокова
структура,
каквито са
Паскал и Си. В
тези езици
процедурата
има достъп до
своите
параметри,
които са
определени
от програмата.
Областта на
действие на
процедурата
представлява
този набор от
променливи,
до които тя
има достъп.
Правилата в
областта на
действие при
различните
езици се изменят:
те могат да
се основават
на механизма
на влагане на
процедурите;
на разделяне на
програмата
на отделно
компилируеми
файлове; или
на някакъв
друг начин за
реализиране
на
модулността.
Командата
LEAVE е безадресна.
Тя отменя
действията
на
предидущата
команда ENTER като
копъра
съдържанието
на регистър ВР в
регистър SP за да
освободи
стековото
пространство
разпределено
за
процедурата.
След това
командата
възстановява
старото
съдържание на
регистър ВР от стека,
като при това
се
възстановява
и началната стойност
и на регистър
SP. Тази
команда
трябва да
предхожда
командата за
връщане от
процедура RET,
която
"изхвърля"
параметрите
и адреса за връщане
от стека.
За
организиране
на работата
на процедурата
с областта от
стека, която
й принадлежи
(т.е. в кадъра), в
структурата
на процесора
е необходимо
да се въведе
допълнителен
адресен
регистър - указател
на кадъра (УК).
Указателят
на стека (УС) в
такава
структура се
движи по
границите на
кадрите,
което
схематично е
показано
по-долу на
фигура 5.2.2.16.
Фиг. 5.2.2.16. Структура
на
указателите
при работа с
процедури
Реализирането на подобни команди в даден процесор е отличителен признак, че неговата структура е съобразена с изискванията на езиците от високо ниво. Наличието на такива команди означава висока ефективност както при компилация, така и при изпълнение на потребителските програми.
Г) Кратко
обобщение и
изводи
В
английския
език за
обозначаване
на командите
за
безусловен
преход,
обикновено
се използва
думата Jump, а за
командите за
условен
преход –
думата Branch,
въпреки че
различните
производители
използват
незадължителна
терминология.
Например, Intel
се придържа
към думата Jump
както за
безусловни,
така и за
условни преходи.
Вече
представихме
четирите
основни вида
команди за
управление
на прехода.
Разбира се
има и други,
които ще
представим
по-късно във
връзка със
съответната
тематика. За
да може читателят
да оцени
използваемостта
на различните
видове
команди ще
приведем
някои известни
статистически
оценки. Така
например в реалния
софтуер
доминиращо
се използват
командите за
условен
преход.
Техният
относителен
дял спрямо
останалите
три вида се
намира в
границите от
66 до 78%. След тях
се нареждат
командите за
безусловен
преход с
относителен
дял от 12 до 18%.
Приблизително
толкова е и делът
на командите
реализиращи
подпрограмната
техника – от 10
до 16%.
Приблизително
90% от
командите за
безусловен
преход
изпълняват
преход
относително
съдържанието
на
програмния
брояч. При
командите за
обикновен
преход
адресът за
преход е
винаги предварително
известен.
Това обаче не
се отнася за
адреса за
връщане,
който
използват
командите за
връщане от
подпрограма
(процедура).
Тези адреси
не са
известни по
време на
компилация
на
програмите и
следва да се определят
по време на
изпълнението
им. Най-лекият
метод за
определяне
на адреса на
прехода е
използване
на
относителното
адресиране
спрямо
текущото
съдържание
на програмния
брояч. Като
правило
преходите са
в близката
околност на
командата за
преход (от 3 до 7
машинни
команди),
така че
отместването
не е голямо
по стойност
число. От
всички извършвани
преходи 75% са в
положителна
посока (с увеличаване
на адреса).
Този метод за
адресиране
осигурява
изпълнение
на програмата
от
произволно
място в
адресното
пространство.
Реализацията
на преходите
от тип
връщане, както
и преходите
по косвен
адрес, при
които
адресът за
преход не е
известен по
време на
компилацията
на
програмата,
изисква методи
за
адресиране
различни от
относителното
адресиране
спрямо
програмния
брояч. В тези
случаи
адресът за
преход
трябва да се
определя
динамично по
време на
изпълнение
на
програмата.
Най-лесният
начин е да бъде
посочен
регистър,
който да
съхранява адреса
за връщане
или адреса за
преход и при
това да бъде
позволен
всеки метод
за изчисляване
на адреса за
преход. В
повечето случаи
обаче се
прилага
специализирано
запомнящо
устройство
от тип LIFO.
Тъй
като
болшинството
команди за
преход в една
програма са
условните, от
важно значение
за
архитектурата
на процесора
е техническата
реализация
за
определянето
на условието
за преход. Тук
при
различните
процесори се
използват три
различни
подхода:
1. В
структурата
на процесора
се използва
специален
регистър,
отделните
разряди на който
съответстват
на отделните
кодове на условията
за преход.
Командите за
условен
преход, чрез
съдържащия
се в тях код
(маска) на
условието,
мултиплексират
за проверка
стойността
на избраното
условие
(стойността
на признака,
флага).
Главното
достойнство
на такава
реализация
се състои в
това, че
фиксирането
на условието
и преходът
според него
се извършват
без допълнителна
загуба на
време
(тактове). За
съжаление
това
достойнство
се
оползотворява
рядко. Като
недостатък
на тази
реализация може
да бъде
изтъкнато:
първо, че се
появяват
нови
състояния на
процесора,
които следва да
се следят (да
се
съхраняват
при
прекъсване и
след това да
се
възстановяват).
На второ място,
което много
важно за
съвременните
високоскоростни
конвейерни
архитектури,
кодовете на
условията
ограничават
реда на изпълнение
на командите
в потока, тъй
като тяхното
основно
предназначение
е да предадат
стойността
на кода на
условието в
командата за
условен
преход.
2. Същността
на втория
подход се
изразява в обикновено
използване
на регистър с
общо или
специално
предназначение.
В този случай
се изпълнява
проверка на състоянието
на този
регистър, в
който предварително
е фиксиран
резултатът
от операция
сравнение.
Явен
недостатък
на този подход
е
необходимостта
от
“присвояване”
на отделен
регистър на
програмата.
3. Третият
подход
предполага
обединяване
на командата
от тип Сравнение
с командата
за преход в
една
единствена
команда.
Получава се
достатъчно
сложна команда,
в
структурата
на която
трябва да се
поставят код
на условието
за преход
(маска), константа
за сравнение
и адрес за
преход. Такова
команди
обикновено
се реализират
за частен
случай,
например за
случая, когато
константата
е нула. Тази
константа може
да се приеме
по
подразбиране
и да не се съдържа
в командата.
В общия
случай се
използва
регистърът
на
признаците.
При анализ на
резултатите
от командите
за сравнение
след
целочислени
операции и
след
операции с
плаваща
запетая се
използва
различна техника.
Това се
дължи, от
една страна,
на различния
характер на
признаците, а
от друга страна
на блоковата
структура на
операционната
част на
процесора.
Освен това
условните преходи
по условия
след
операции с
плаваща запетая
са
значително
по-малко на
брой, спрямо
тези след
целочислени
операции.
Едно от най-изявените свойства на програмите е преобладаването в тях на условни преходи при условие равно/неравно на нула. По тази причина в редица архитектури такива команди се отделят в отделна група. Обикновено тези преходи са преходи напред. Преходите назад най-често са преходи, с които са организирани цикли, при това те се изпълняват приблизително в 60% от случаите. Поведението на командите за условен преход зависи от конкретното изпълнение на една програма, но при съвременните техники за оптимизация на кода на програмата, реализирани в компилаторите, изпълнението може да бъде различно.
При преход към процедура и при връщане се предполага съхраняване на състоянието на процесора (на неговите регистри). Най-важен е момента със съхраняването и възстановяването на адреса за връщане. Някои архитектури предлагат апаратни механизми за съхраняване на състоянието на регистрите, а други предлагат това да се постига програмно, като необходимите за целта команди следва да се поставят в кода на програмата от компилатора. Възможни са две различни съглашения относно съхраняването на състоянието на регистрите. Когато уговорката е това да прави викащата програма (caller saving), последната трябва да съхрани онези регистри, които ще използва след възстановяването си. Когато уговорката е съхраняването да бъде задача на извиканата процедура, то тя следва да съхрани и с това да освободи онези регистри, които възнамерява да използва. Съществуват обаче случаи, когато викащата програма трябва да извърши съхраняване, което да осигури достъп до глобални параметри, т.е. съхранение със съвместен достъп.
Последното, на което ще обърнем внимание, се отнася до апаратурата, която реализира изчисляването на адреса и извеждането му върху адресната шина към оперативната памет. Читателят вероятно вече е забелязал, че функционалните изчисления при формиране на адреса на операнд не се различават от тези при формиране на адреса на команда. Последното означава, че апаратурата за тези изчисления е обща. Това е и причината, поради която в литературата много автори не разграничават методите за адресиране на операнди от тези за адресиране на команди. Апаратурата, която изяснихме до момента е част от адресиращото устройство на процесора. Неговата структура е значително по-сложна от създадената до момента представа. В следващите глави тя ще бъде значително обогатена.
Следващият
раздел е:
§ 5.3
Етапи при
изпълнение
на машинната команда