Последната актуализация на този раздел е от 2020 година.

 

5.2.1.  Методи за адресиране на операндите

 

 

      Тук ще бъдат изяснени основните методи за посочване адреса на операнд, необходим на машинната команда за изпълнение на текущата операция. Всеки от методите има разновидности, част от които ние ще посочим. Още тук, в началото, искаме да обърнем внимание на читателя, че фирмите производителки именуват твърде произволно реализираните от тях схеми за адресиране, водейки се от не съвсем теоретични разбирания. Стига се до там, че сходни схеми за адресиране, в различни процесори, имат различни наименования. Ето защо ние сме дълбоко убедени, че усвояването на основните методи за адресиране според класификацията, която ще дадем по-долу, ще предпази читателя от комерсиалния елемент в тяхното фирмено обяснение и ще му помогне за по-бързото овладяване на достойнствата и недостатъците на всяка конкретна схема за адресиране. Така той ще бъде в състояние правилно да оценява, сравнява и избира необходимия процесор за своите конкретни потребности.

1.  Безадресни команди

      Ще започнем с така наречените безадресни команди. Това са команди, които не съдържат в структурата си адресна част. Те се представят само от кода на операцията (КОП). Ясно е, че поради липса на адресна част, тук не можем да говорим за явен метод на адресиране, въпреки че тези команди имат своите операнди. Реализацията на съответната схема за достъп до тези операнди е “зашита” (запрограмирана) в техните микропрограми, което означава, че програмистът не е в състояние да я управлява. Микропрограмата на всяка такава команда се идентифицира (декодира, дешифрира) и стартира чрез уникалния й КОП.

      По принцип безадресните команди се делят на два вида:

а) Команди с подразбиращ се операнд. Това са команди, които изпълняват определена операция, в която операндът(-дите) се подразбира(-ат) от кода на операцията. Обикновено тези операции се наричат унитарни и те бяха разгледани по-рано тук, в пункт 3.2.10. Такива операции са например +1 (increment), -1 (decrement), нулиране и др., в които единият от операндите се явява съдържание на точно определен логически възел в структурата на процесора. Резултатът от операцията се явява новото му съдържание.

б) Команди с подразбиращ се адрес. Това са команди, които адресират (намират) операндите си в регистровата памет на процесора. При канонична система машинни команди достъпът до данни в регистровата памет се осигурява от микропрограмата на машинната команда на ниво управляващи сигнали. При ортогонална система машинни команди, когато КОП е структуриран, в него е възможно да се разпознават спецификатори, обезпечаващи и подпомагащи този достъп. В подкрепа на току що казаното вижте например фигура 5.1.1.1 и таблица 5.1.1.1. Принципно малкият обем на регистровата памет води до сравнително малка дължина (от 2 до 4 бита) на изпълнителния адрес на операнда (с други думи на спецификатора). По този начин става възможно вмъкването на регистровия адрес в операционната част на командата (под формата на спецификатор). Тези команди са най-често от тип R-R (регистър-регистър). Тяхната структура зависи много от структурата на аритметично-логическото устройство, т.е. дали е от комбинационен, от натрупващ или от стеков тип. Някои автори, основавайки се на особеностите на съответните операционни устройства и на последователната (стекова) организация на техните работни регистри, са склонни да отделят и да говорят за самостоятелен стеков метод за адресиране на операнди. По наше мнение техните аргументи не са достатъчно силни за подобно разграничаване.

      Микропрограмите на безадресните команди съдържат само фазата на същинското действие и фазата за фиксиране на резултата и неговите признаци. Това означава, че тези команди са много бързи. Освен това те се изпълняват върху стандартните формати на данните, тъй като регистрите с общо предназначение обикновено имат дължината на разрядната мрежа.

2.  Непосредствена адресация

      Така наречената непосредствена адресация е основен метод за адресиране на операнди. Според този метод се приема, че командата не търси операнда, тъй като той се съдържа в самата нея, т.е. командата “носи” със себе си своя операнд.

 

Фиг. 5.2.1.1.  Структура на едноадресна команда с непосредствен операнд

 

      Такъв операнд, който за нуждите на операцията се доставя от самата команда, се нарича непосредствен. Непосредственият операнд се поставя (записва) в адресната част на машинната команда от програмиста при съставяне на програмата. В този смисъл адресната част на такива команди има дължина най-често равна на разрядната мрежа. Може да твърдим, че това е единственият случай, когато данните се съдържат в кода на програмата. Тъй като в един съвременен процесор използваните форми и формати за представяне данните са твърде разнообразни, този метод има твърде ограничено приложение. Практически той се използува главно за зареждане на определени системни константи в съответни програмно достъпни възли на процесора, обикновено със специализирано предназначение. Както и в предидущия случай, пренасянето на операнда от командата в операционното устройство, се осъществява от микропрограмата на командата, на ниво управляващи сигнали. Такова встъпването на операнда в операцията се нарича непосредствено и то дава име на метода за адресиране.

      Системните константи, които споменахме по-горе, обикновено представляват стойности, които като съдържание на определени регистри или входно-изходни портове, декларират (определят) съответните възможности на хардуера. В този смисъл, тяхното зареждане (“разтоварване”) непосредствено от командата в съответния регистър, се определя като инициализация на хардуера. Освен това непосредствено адресираните операнди могат да бъдат инициализиращи (начални) стойности на променливи в системни процедури. Когато тези константи имат отношение към адресирането, се наричат адресни. На този факт следва да обърнем специално внимание. Когато непосредственият операнд е число и е предназначен за обработка в АЛУ, той следва да има дължината на разрядната мрежа или някой от възможните за нея формати. Когато обаче непосредственият операнд е адресна константа, той има дължината на адреса. Тъй като тези две различни по вид константи не винаги имат една и съща дължина, то структурата на адресната част на командата се подлага на известно “напрежение”, което конструкторите на процесора отстраняват чрез подходящи компромиси още по време на проектирането му.

      Непосредственото адресиране (както и безадресните команди) има същественото достойнство да позволява на командата да извършва своето действие без обръщение към оперативната памет. Така се постига високо бързодействие на програмата. Ето защо, всеки програмист се стреми така да организира изчислението, че в максимална степен да използува тези достойнства.

      Методът непосредствено адресиране на операнд има смисъл да бъде реализиран само за някои групи команди (обикновено за малък брой команди). Но дори в двуадресни командни системи, прилагането на метода води до едноадресна структура на съответната машинна команда. И това е естествено, тъй като поставянето на 2 непосредствени стойности в една команда значително усложнява нейното изпълнение и поражда твърде много дилеми – еднакъв ли да е форматът на 2-те  непосредствени константи? Еднаква ли да е тяхната форма? Може ли например едната да е число, а другата адрес? За кои регистри ще се отнасят константите? и т.н. Ето защо машинните команди за основните аритметични операции (ще припомним, че те са двуместни) не практикуват този метод за адресиране на операнд. Най-често непосредственото адресиране се прилага за команди, осъществяващи трансфер на данни.

      В същото време този метод за адресиране не е задължителен за архитектурните свойства на процесора, тъй като всяка константа може да бъде съхранявана в произволна клетка на паметта, адресирана с абсолютния си адрес. Въпреки това този метод се използува активно, дори само поради това, че облекчава програмиста в задължението му да използува уникални идентификатори за именуване на отделните константи.

      Като следствие от казаното следва, че регистърът на командата (Рг.К) (виж фигура 5.1.3) трябва да бъде свързан по данновата шина с АЛУ и с всички възли, в които ще предава съдържанието на адресната си част.

3.  Пряка адресация

      Методът, наречен пряка адресация, е основен метод за адресиране на операнди. Пряко адресиран е всеки операнд, чиито абсолютен (действителен) адрес се съдържа в адресната част на машинната команда (вижте фигура 5.2.1, рисунка А)).

 

Фиг. 5.2.1.2.  Структура на команди с пряко адресиран(-и) операнд(-ди)

 

      При програмиране на ниско ниво, една от задачите на програмиста е да направи така нареченото разпределение на паметта. Като се абстрахираме от съвременните средства за автоматично решаване на тази задача, които са неизменна част от операционните системи, тук става дума за това, че той (или тя) трябва да се погрижи къде в адресното пространство на оперативната памет ще бъде заредена приложната програма, къде ще бъдат записани нейните изходни данни, къде ще бъдат запазени клетките за междинните резултати, къде ще бъде паметта на стека и т.н. Решавайки тази задача, на програмиста стават известни адресите на клетките в оперативната памет, в които ще се съдържат операндите на всяка команда. Създавайки своята програма, в адресната част на команди използващи пряк метод за адресиране на операнди, той следва да запише техните действителни адреси, тъй като те са му известни.

      Като имаме предвид, че типичната дължина на една адресируема единица е 8[b], а дължината на операндите може да надхвърли 4[B], т.е. той се разполага в няколко последователни клетки. Така естествено възниква въпросът – кой е адреса на операнда? Въпросната ситуация ще поясним със следната рисунка:

 

Фиг. 5.2.1.3.  Разположение на операнди в няколко последователни клетки

 

      Илюстрираната двуадресна машинна команда адресира за своята операция два 4 байтови операнда, всеки от които е разположен в оперативната памет така, че заема по 4 последователни клетки. Ако това разположение на операндите е известно, то при съставяне на програмата програмистът следва да запише в адресните полета на тази команда началните адреси на операндите – за първи операнд адрес a, а за втори операнд адрес b, както е показано на горната рисунка. Лесно може да се съобрази, че адресът на операнда е най-малкият от групата последователни адреси. Освен това се вижда, че операндът е разположен с младшите си байтове напред. Всъщност дължината на операнда е без значение – началният му адрес е единствен. Читателят може да се увери в изложеното, ако разгледа дискутираната тема върху една реална компютърна система, за която се пише в книга [4].

      Като основен, методът за пряко адресиране, под една или друга форма, присъства в командната система на всеки процесор. Дължината на адресната част на командата в този случай е свързана с обема на адресното пространство на оперативната памет на процесора. Ако то е например 1[Mi], адресът на всяка клетка има дължина 20[b]. Така адресът, който представлява 20 битова двоична комбинация, трябва да присъства в адресната част на командата. При това за всеки операнд, което означава, че ако командата е двуадресна, адресната й част следва да бъде 40 битова. В случай, че обемът на адресируемото пространство е по-голям, то и дължината на адреса също нараства. Така например при 16[Mi] обем на адресируемото пространство дължината на адреса е 24[b], а при 4[Gi] той следва да бъде 32[b]. В случай на двуадресна структура на командата, при този метод на адресация, дължината й може да надхвърли 7 байта.

      Тук е моментът, когато се налага да обърнем внимание на един факт, който ще имаме повод да обсъждаме и по-късно. Става дума за дължината на командата, която се формира в частност, както тук се разбира, и от дължината на адреса на операнда. Общата дължина на командата обаче не винаги е кратна на дължината на разрядната мрежа на процесора и в същото време не винаги е кратна на ширината на данновата шина, по която се трансферира. Този разнороден характер на съдържанието на отделните полета в структурата на командата определено изправя конструктора на процесора пред известни затруднения. Тези затруднения се разрешават с компромиси, които при един окончателно завършен продукт, не винаги се разкриват на потребителя. Така бихме отговорили на последния, ако той зададе например следния въпрос: защо дължината на адреса е избрана да бъде 32[b]? или, защо данновата шина е широка 64[b]? Един от подходите за разрешаване на тези проблеми е архитектурен. Като пример в това отношение може да послужи така наречената архитектура Харвард. (вижте например фигура 6.3.2.1.1).

      Микропрограмите на командите с пряка адресация не съдържат фазата на формиране на изпълнителните адреси, тъй като адресът, който се съдържа в командата, представлява действителен адрес - той пряко съвпада с изпълнителния. В този смисъл, хардуерната реализация на метода пряка адресация, изисква само една логическа връзка в структурата на процесора – тази връзка е от изхода на регистъра на командата към адресната шина. Така адресът на операнда от Рг.К да се изпраща по адресната шина на процесора направо в адресния регистър на оперативната памет (виж фигура 5.1.3). Това прави командите с пряка адресация едни от най-бързо изпълняващите се. В същото време прякото адресиране притежава един съществен недостатък. Фиксираният в командата (в програмата) адрес на операнда е един и същ при всяко стартиране на програмата! Това означава, че по място в адресното пространство на оперативната памет той е непресместваем! В този смисъл този метод за адресиране е приложим най-вече за твърдо разпределени по място в паметта данни, каквито са системните данни. В този смисъл, този недостатък на прякото адресиране, кара много конструктори да ограничават неговото приложение. С това ограничение разбира се следва да се съобразява и всеки програмист.

      Пълноразрядните адреси значително удължава формата на командата, а това определено е недостатък, тъй като от една страна дългите команди заемат повече място в паметта, а от друга страна се извличат по-бавно. Ето защо не са изненада някои подходи, с които се цели да се намали дължината на машинната команда. Когато това се постигне, влиянието на споменатите недостатъци отслабва. При преследване на тази цел, като модификация на метода на прякото адресиране, в много процесори се прилагат различни форми на скъсена пряка адресация.

      Скъсената пряка адресация се постига чрез ограничаване на възможността за приложението й само върху част от адресното пространство. Така например, ако адресът има дължина 32[b] и в командата се съдържат явно само младшите му 16 бита, абсолютният адрес може да се получи върху адресната шина чрез допълване на липсващите старши 16 бита автоматично. Обикновено старшите разряди на адреса се формират автоматично по правилото наречено знаково разширение. Същността на това правило се състои в това, че старшият разряд на записаната в командата младша част на адреса, се копира във всички разряди на частта, допълваща я до абсолютния адрес. Така например, при условията на горния пример, са възможни следните адреси:

 

Фиг. 5.2.1.4.  Знаково разширение до пълен пряк адрес

 

      Както се вижда от фигурата, съдържащите се в адресната част на командата 16 бита от адреса остават непроменени. Точно в това е смисълът на прякото адресиране. Пълноразрядният изпълнителен адрес се получава чрез допълване отдясно с още 16 бита, въз основа на правилото на знаковото разширение. Така в крайна сметка върху адресната шина са възможни указаните адреси. Това са адреси на области, намиращи се в началото и в края на адресното пространство.

 

Фиг. 5.2.1.5.  Области в оперативната памет със скъсено пряко адресиране

 

      При дължина на скъсения адрес от 16[b], възможностите за адресиране с тази модификация на метода са ограничени в две области с обем от по 32[Ki], или общо 64[Ki].

      Скъсената пряка адресация има достойнството да повишава общото бързодействие на изчислителния процес по два начина:

1.       Благодарение на скъсения формат на самата команда, което означава, че тя ще се извлича от паметта по-бързо;

2.       Благодарение на липсата в нейната микропрограма на фазата за формиране на изпълнителния адрес на операнда.

      Това прави този метод за адресация твърде ценен. Областите в началото и края на адресното пространство, достъпни за скъсената пряка адресация, обикновено се използуват за разполагане на системни данни. Това означава, че този вид адресиране не се предлага от всички машинни команди. По тази причина не е правилно в тези области програмистът да разполага програми, тъй като с това губи възможността да прилага споменатия метод за адресация.

      Пряката адресация се прилага под различни форми, които силно се влияят от общата организация на адресното пространство, за която ще стане дума в следващата глава.

4.  Косвена адресация

      Методът, наречен косвена адресация, е основен метод за адресиране на операнди. Според този метод в адресната част на командата не се намира нито самия операнд, нито неговия изпълнителен адрес, а адресен указател къде се намира адресът на операнда. С други думи адрес препратка или още адрес пощенска кутия. Съдържащият се в командата адрес се нарича косвен адрес. Според това правило, адресният указател препраща командата в търсенето на операнда, т.е. стоящият в адресната й част адрес, не е изпълнителен. В същото време следва да отбележим, че адресът препратка е пряк (действителен) адрес. Това прави препратката (пощенската кутия) непреместваема, но нейното съдържание може да бъде променяно преди всяко ново обръщение. Последното означава, че операндът придобива свойството да бъде свободен и преместваем. За да се получи достъп до операнда, указателят се използува за отваряне на клетка, в която се съдържа изпълнителният адрес. С други думи операндът се доставя на операционното устройство поне след две обръщения към паметта, което е илюстрирано на следващата фигура.

 

Фиг. 5.2.1.6.  Схема на косвено пряко адресиране

 

      Необходимо е да отбележим още тук, че адресът на препратката (указателя) може да бъде представен в машинната команда не само пряко, но и чрез друг метод за адресиране, за което ще стане дума по-късно тук. Според това дали указателят адресира клетка от оперативната памет или регистър в регистровата памет, косвената адресация се прилага в различни форми.

      На фигура 5.2.1.7 е илюстрирана апаратурата, която свързва описаните до момента методи за адресиране. Това са преди всичко логически връзки, управлението на които води до реализация на необходимия на всяка схема за адресиране трансфер.

 

Фиг. 5.2.1.7.  Логически връзки за реализация на непосредствено, пряко и косвено адресиране

 

      Така например при непосредствена адресация, съдържанието на адресната част на командата се предава непосредствено в АЛУ, в качеството му на операнд, или в регистър с общо предназначение, или във входно-изходен порт (понятие, което ще изясняваме по-късно), или в адресен регистър. При пряка адресация съдържанието на адресната част на командата, в качеството й на изпълнителен адрес, се предава по адресната шина на процесора в адресния регистър на оперативната памет. В случай на скъсена пряка адресация централното управляващо устройство определя цялостния адрес според правилото на знаковото разширение, манипулирайки изходните буферни логически елементи на процесора върху адресната шина. При косвена адресация съдържанието на адресната част на командата, в качеството му на действителен адрес, се предава по адресната шина в адресния регистър на оперативната памет. След това централното управляващо устройство осъществява управлението на обмена и по данновата шина в регистър от структурата на процесора се записва извлечения по косвения адрес изпълнителен адрес. Регистърът, за който споменахме, обикновено е служебен и не е програмно достъпен. В някои процесори това е самият регистър на командата. Второто обръщение, чрез което се трансферира операндът, се реализира автоматично под управлението на ЦУУ. При този трансфер адресираната клетка се свързва с АЛУ или с съответния регистър с общо предназначение. Обръщаме внимание, че по отношение на клетката от оперативната памет, операцията може да бъде както четене така и запис.

      На следващата фигура 5.2.1.8 е изразена обобщената микропрограма и съответните микрооперации в структурата на процесора, изпълняваща се като част от микропрограмите на машинните команди, използващи тези методи за адресиране на своите операнди – непосредствено, пряко и косвено. Едни или други микрооперации в микропрограмата на машинната команда зависят от установения в нея спецификатор (СА) на метод за адресиране.

 

Фиг. 5.2.1.8.  Обобщена микропрограма и микрооперации на

косвено, пряко и непосредствено адресиране

 

      Напомняме на читателя, че задълбоченото изучаване на даден метод за адресиране е свързано не само с логиката на трансфера, но изисква и детайлното познаване на функционирането на съответната апаратура. В микропрограмата от горната фигура се вижда, че ако адресирането не е косвено и не е пряко, то е непосредствено и съдържанието на адресната част на командата се зарежда във входен регистър на АЛУ. В останалите случаи – при косвено адресиране, могат да се проследят двете обръщения към оперативната памет, където се изпълнява операция четене. След извличане от паметта действителният адрес попада в регистъра на командата. Следва извличане на операнда и записването му във входен регистър на АЛУ.

      В зависимост от ширината на данновата шина (вижте по-горе фигура 5.2.1.7) извличането на операнда или на адреса може да става чрез няколко последователни обръщения – ситуация, която многократно сме коментирали (вижте например тук по-горе фигура 5.2.1.3 или да кажем изложеното в §6.2, раздел Б)). Тук имаме предвид както автоматичната модификация на адресите, така и “сглобяването” на прочетените порции в регистъра на командата, или в АЛУ. Съдържащите се в командата в тези случаи адреси са начални, което налага, както вече споменахме, тяхното модифициране след всяко поредно извличане.

А)   Косвена адресация с дълбочина по-голяма от 1

      В някои случаи правилото за препращане или още моделът на пощенската кутия може да се приложи многократно, при което се образува верига от косвени указатели (КУ) (верига от последователни препратки или верига от пощенски кутии):

<КУ1>  Þ  <КУ2>  Þ ...... Þ  <КУm>   Þ     <Изпълнителен Адрес> ,

<-------------------  m  ------------------->

      Препратките се изпълняват последователно и лавинообразно докато се достигне изпълнителния адрес. Броят m на косвените указатели, препращащи се един на друг, се нарича дълбочина на косвената адресация. Дълбочината се определя от програмиста според нуждите на алгоритъма. Всички косвени указатели представляват действителни адреси и по тази причина възниква проблемът с разпознаване на изпълнителния адрес. Решенията на този проблем са две. В първия случай дълбочината m на косвената препратка е поставена като число в отделно поле на машинната команда. По това допълнително поле тази команда се отличава от командата с обикновено косвено адресиране. Така, използвайки това число, като организира цикъл обръщения, микропрограмата на командата може да достигне изпълнителния адрес. Цикълът е от вида с предварително известен брой повторения. Условието за край на този цикъл може да се реализира апаратно чрез брояч и дешифратор (вижте това решение в структурата на устройството за управление от фигура 7.4.2).

      Във втория случай разпознаването на поредния адрес като изпълнителен може да се реализира чрез признак в структурата на указателя. В този случай структурата на командата не се различава от тази на командата с обикновено косвено адресиране. Ако дължината на указателя е в такова отношение с дължината на клетката в оперативната памет, че позволява поместването освен действителен адрес още поне на един допълнителен бит, то този подход е възможен. Допълнителният бит в структурата на указателя може да играе ролята на признак за същността на действителния адрес. Ако този специален разряд съдържа единица, това е признак, че е извлечен поредният косвен указател, а ако е нула - че е извлечен изпълнителният адрес. Всяка верига от косвени указатели трябва да завършва с изпълнителен адрес. На микропрограмно ниво достигането на изпълнителния адрес в този случай се организира в цикъл от вида с предварително неизвестен брой повторения. Условието за край на този цикъл може да се реализира апаратно именно чрез стойността на допълнителния бит в извлечената структура. Реализацията на този вид косвено адресиране е възможна само ако бъде реализирано правилното и автоматично формиране на стойността на описания признак в структурата на косвения указател. Винаги когато се създава препратка този признак трябва да има стойност единица (1), а когато структурата не е препратка а изпълнителен адрес – нула (0).

      Косвената пряка адресация има същите недостатъци като пряката адресация. В този си вид се прилага най-вече в процесори с по-елементарна структура.

      Косвената адресация е много удобна при работа със списъци, като при неявно указана дълбочина (има се предвид втория случай, описан по-горе), може да се организира произволен по дължина списък. Косвената адресация е достатъчно универсален метод и на ниво асемблерни езици неговото приложение позволява да се постигне оптимален програмен код. Освен това той е удобен и за работа с подпрограмна техника. Чрез косвена адресация може да се реализира необходимата организация за предаване на действителните параметрите между викащата и виканата процедури. Така например, викащата програма (например главна програма) записва действителните адреси на формалните параметри във фиксирани или предварително уговорени (избрани) клетки на оперативната памет. От своя страна извиканата процедура използува тези параметри, като ги адресира косвено, чрез адресите на фиксираните клетки.

      Косвената адресация може да се използува също за организиране на връщане от подпрограма. В случая трябва специално да обърнем внимание на това, че става дума за адресиране на алгоритмичен преход, а не за адресиране на операнд. Това е съществено отличие, за което ще се говори в следващия параграф. За реализация на алгоритмичен преход връщане от подпрограма се употребява команда за безусловен преход косвено адресиран към фиксирана клетка. В случая е важно съдържанието на тази фиксирана клетка - то трябва да бъде адреса за връщане. Съдържанието на косвено адресираната клетка подменя в крайна сметка адресът за преход на командата и така тя предава управление в нужното място на извикващата програма. Схемата от фигура 5.2.1.6 илюстрира току що обясненото. Адресът за връщане (както се нарича съдържанието на клетката с фиксиран адрес) от своя страна се записва в тази фиксирана клетка при извикване на подпрограмата. За целта е необходима специална машинна команда, която да записва съдържанието на програмния брояч във фиксираната клетка. За съжаление в съвременните процесори такива команди не се реализират, тъй като манипулирането на съдържанието на програмния брояч е опасно. Описаното приложение на косвения метод за адресиране може да бъде прилагано в процесори без програмен стек.

Б)   Косвена регистрова адресация

      За да се преодолеят недостатъците на дългия пряк косвен адрес и с цел да се приложи къс регистров формат на машинните команди, се прилага комбинация между спецификатора за косвена адресация и спецификатора за регистров формат на командата. Така в структурата на машинната команда в качеството на косвен адрес (указател или адрес на пощенска кутия) може да се използува регистров адрес. Това означава, че за разлика от класическия случай, който вече изяснихме, в настоящия вариант на косвената адресация, косвеният адрес е адрес на регистър с общо предназначение, в който се съдържа изпълнителният адрес. Така обръщенията с цел извличане пак са две, но само едно от тях е към оперативната памет. Този вид косвено адресиране печели в съревнованието за бързодействие по два пункта – късият формат на командата означава бързо извличане, а поставянето на изпълнителния адрес в регистър води до бързото му извличане. В последния четвърти такт се извлича операндът.

      Адресираният от командата регистър №k в регистровата памет (СОЗУ) трябва да бъде предварително зареден с изпълнителния адрес. От тук следва, че в регистрите с общо предназначение освен данни могат да се съдържат и адреси, а това означава, че тяхната дължина следва да бъде съобразена и с този вид информация. За възможностите, свойствата и изискванията към регистровата памет на процесора, читателят може да чете в пункт 6.1.1 в глава 6.

 

Фиг. 5.2.1.9.  Схема на косвена регистрова адресация

 

      На фигура 5.2.1.9, в логическата структура на процесора, са изобразени четирите стъпки от микропрограмата на косвената регистрова адресация, която пояснихме по-горе.

      Ако изпълняваната машинна команда трябва да укаже освен регистър-източник още и регистър-приемник на информация, то в нейната структура може да бъде въведен още един регистров адрес, който да сочи регистър за приемане на прочетените от паметта данни. Обикновено адресната част на командата, дори и в късите си формати, може да съдържа два регистрови адреса.

В)  Авто-косвени регистрови адресации

      Косвената регистрова адресация е основа за усъвършенстване на системата за адресиране на операндите, което се постига въз основа на специфичните операции, изпълнявани в регистровата памет на процесора. Най-типични за регистрите с общо предназначение са унитарните операции събиране и изваждане, при които съдържанието на даден регистър може да бъде увеличено или намалено с единица, или с друга константа, обикновено свързана с форматите на данните - Рг.№k:=(Рг.№k)±1. За манипулиране на съдържанието на регистрите в системата машинни команди съществуват специални команди – команди за работа с регистрите.

      Тук изясняваме една модификация на косвената регистрова адресация, при която манипулирането на съдържанието на регистър от СОЗУ е “зашито” на микропрограмно ниво в микропрограмите на съответните машинни команди.Така изменението на съдържанието на регистър с общо предназначение, за което става дума тук, се осъществява автоматично по апаратен път при всяко обръщение към него, когато съдържанието му се използува като косвен адрес. От тук идват и наименованията "автоинкрементна" и "автодекрементна" на разглежданата модификация косвено регистрово адресиране. От казаното следва, че съдържанието на регистър с общо предназначение може да бъде манипулирано от всяка машинна команда, стига в нея да са указани спецификаторите за косвена автоинкрементна или автодекрементна адресации (вижте по-горе фигура 5.2.1.9.).

      Ползата от този вид модификация на косвената адресация се състои в удобствата, които тя създава на програмиста. Така например в случаите, когато в някакъв алгоритъм трябва да се адресират последователно много клетки в паметта, съдържащи даннови структури от тип списък, съществено може да се ускори процесът на достъп. Ускорението се дължи на премахване на многократното четене от оперативната памет при верига от косвени указатели, а в случая, на премахване на многократния запис на изпълнителния адрес в косвено адресиращия регистър, тъй като съдържащият се в него адрес се преадресира автоматично, т.е. от микропрограмата на командата. Естествено това се постига чрез допълнителен хардуер.

      Схемите на тези авто-косвени регистрови адресации са илюстрирани по-долу на фигура 5.2.1.10, където се вижда, че косвеният регистров адрес (Рг.№k), намиращ се в командата (вижте фигура 5.2.1.9), остава непроменен при всяко нейно изпълнение. В същото време съдържанието на регистъра (съдържанието на пощенската кутия) се променя многократно.

 

Фиг. 5.2.1.10.  Автоинкрементна и автодекрементна косвена регистрова адресации

 

      На фигурата изменението на изпълнителния адрес е с единица, но ако операндът заема няколко клетки в паметта, тогава той следва да се променя с константа L, представляваща дължината на операнда в брой адресируеми единици.

      Освен казаното до момента, важно е да отбележим малката разлика в двете адресации:

·         При автоинкрементната, изменението на изпълнителния адрес се извършва след обръщение към оперативната памет ;

·         При автодекрементната, изменението на изпълнителния адрес се извършва преди обръщението към оперативната памет .

      Комбинацията от автоинкрементна и автодекрементна адресации в един и същи регистър позволява на програмиста да организира чрез него свой собствен програмен LIFO-стек. Регистърът, който ще избере програмиста, ще играе ролята на стеков указател. Поради това, че стековете имат важна роля в програмирането, много процесори, в които липсва този метод за адресиране, разполагат с машинни команди от тип PUSH и POP, които се наричат команди за работа със стека и с които стекът освен това може да се използува като допълнително запомнящо устройство. Произволното използуване на тези команди в програмите обаче е твърде опасно, тъй като те могат да объркат реда на записаните данни, особено в случаите, когато стекът се използува за организиране на прекъсванията, за които ще стане дума по-късно. Читателят не бива да забравя, че при всеки запис в стека текущият изпълнителен адрес (т.е. стековия указател) се променя, а всяко четене от него е съпроводено с изхвърляне” на информацията, т.е. отново с промяна на текущия изпълнителен адрес. Текущият изпълнителен адрес в същност е указател към върха на стека. Опасността, за която споменахме, се състои в това, че програмистът може да забрави записаната от него в стека потребителска информация.

      Автоинкрементната и автодекрементната косвени регистрови адресации, за разлика от разгледаните до момента методи, изменят адресната част на машинните команди неявно и вън от тяхната структура, т.е. вън от програмата, с помощта на апаратни средства. Такова изменение по време на изпълнение на програмата се нарича преадресация, а описаните по-горе методи се наричат още автоиндексация (автоиндексираща се адресация).

5.  Относителна адресация

      Методът, наречен относителна адресация, е основен метод за адресиране на операнди. Този метод за адресиране изисква допълнителна апаратура за своята реализация и е наложен от изискванията за ефективно програмиране. По тази причина е бил приложен сравнително на по-късен етап в развитието на изчислителната техника.

      Изпълнителният адрес Аи на операндите при този метод се формира въз основа на закона

където В се нарича база (базов адрес), а D  (displacement)  -  отместване (или относителен адрес). Отместването се измерва относно базовия адрес в брой адресируеми единици.

      Според (5.2.1.1) всеки адрес, като цяло число, адресиращ клетка в оперативната памет, може да се представи като сума от други две числа. Базовият адрес (първото число) по същество е указател на място (опорна точка) в адресното пространство, спрямо което може да се извърши ново номериране на клетките, започвайки с нула: 0,1,2,3, ... и т.н. Обикновено опорната точка е начална точка (начален адрес на програма, начален адрес на масив от данни и пр.), относно която се подреждат командите на една програма, или елементите на един масив. В този смисъл, адресът В на физическата клетка, избрана за начало, представлява базов адрес. Адресирането на информацията относно базовия адрес (т.е. спрямо опорната точка) се нарича относително адресиране. Нарича се още относително, защото номерът на дадена клетка D е число, което показва положението (отместването) й не спрямо началото на адресното пространство, а спрямо базовия адрес. Казаното е илюстрирано на следващата фигура.

 

Фиг. 5.2.1.11.  Схема на относителния адрес

 

      От рисунката се вижда, че преместването на базовия адрес нагоре или надолу в адресното пространство не променя конструкцията на изпълнителния адрес.

      Относителното адресиране позволява на програмиста да записва в командите адреси на операнди, формирани чрез номерация относно опорната точка, а тази номерация е постоянна и непроменяща се при промяна на базовия адрес. Тъй като по време на разработване на програмата абсолютният адрес на опорната точка в адресното пространство на ОП не е известен, то за нея най-често предварително се избира стойността нула., т.е. програмните единици са базирани относно предполагаем адрес нула. Така записана програмата и нейните данни могат да бъдат зареждани в произволно място на адресното пространство, но за да се осигури връзката й с реалното положение, е необходимо всеки относителен адрес, който се подава от програмата, да се преработва по закона (5.2.1.1). Естествено това преработване трябва да се извършва вън от командата, по чисто апаратен път и по време на нейното изпълнение.

      За да може да се работи с няколко опорни точки (базови адреси), примерно една за програмата, друга за данните, трета за резултатите и т.н., обикновено се създават условия за използуване на няколко базови адреса.

      И така, методът за относително адресиране на операнд изисква в структурата на машинната команда да се съдържат два елемента. Първият има за цел да посочи къде се намира конкретният базов адрес, а вторият – какво е отместването на операнда спрямо него. Базовите адреси (като променливи величини) се разполагат в регистровата памет на процесора, т.е. вън от командите, а относителните адреси (отместванията), които могат да се определят като алгоритмични константи, се разполагат в самите команди от програмиста при създаване на програмата. Базовите адреси се определят като променливи величини, защото техните стойности не се определят от програмиста (в повечето случаи). Така една едноадресна команда има следната структура.

 

Фиг. 5.2.1.12.  Структура на машинната команда при относително адресиране на операнд

 

      Двата елемента в адресната част са:

b - адрес на регистър в структурата на процесора,  D – отместване.

      Тогава законът (5.2.1.1) се реализира в следната форма:

където b е адрес на регистър в регистровата памет на процесора. (b) означава съдържанието на този регистър, което по същество е базовия адрес, т.е. (b)=B. Всеки регистър в структурата на процесора, който може да съдържа базов адрес и да участва във формиране на изпълнителния адрес на операнда според (5.2.1.2), наричаме базов регистър.

      На фигура 5.2.1.13 е показана логическата структура за реализация на закона (5.2.1.2). За разлика от разгледаните до момента методи за адресация, относителната адресация освен логически връзки, изисква пълноценен двоичен суматор, свързан към адресната шина.

 

Фиг. 5.2.1.13.  Схема на относително адресиране на операнд

 

      В процесори с един базов регистър командите не съдържат в структурата си полето за адрес на базов регистър, тъй като този регистър се адресира по подразбиране чрез кода на операцията.

      Отместването е число и в зависимост от това дали е със, или без знак, апаратната реализация на (5.2.1.2) изисква различни логически възли. Ако отместването е число със знак, това означава, че могат да се адресират клетки и в двете посоки спрямо опорната точка (надолу и нагоре, напред и назад в адресното пространство). Ако отместването е число без знак, това означава, че могат да се адресират клетки само в едната посока спрямо опорната точка (само надолу, само напред).

      Дължината на полето D определя максималната стойност на отместването, което може да се реализира. Ако полето има дължина m[b], то максималната стойност на отместването, когато то се интерпретира като число без знак, е:

а когато е число със знак, отместването е число в интервала:

      Малката дължина на полето за отместването ограничава възможността на програмиста да работи с големи масиви от данни, а голямата дължина прави неефективна самата команда. По тази причина, дължината на това поле най-често се определя във връзка със структурната организация на адресното пространство на процесора, като практически във всички случаи е по-малка от дължината на изпълнителния адрес. Суматорът в схемата, който генерира изпълнителния адрес върху адресната шина, е пълноразряден. Той събира пълноразрядния базов адрес с разширеното отместване. Последното се формира според правилото за знаково разширение (ляво разширение при допълнителен код), което изяснихме по-горе. Относителното адресиране се прилага във всички случаи, когато е необходимо да се осигури преместваемост на данните. Освен това относителното адресиране се използува още в следните програмни ситуации:

·         При адресиране на данни в параметрическата област на подпрограма, чийто базов адрес се предава в подпрограмата ;

·         При адресиране на данни, разположени в областта на стека, при което базовият адрес представлява указател на рамка в стека ;

·         При адресиране на данни в конкретен блок, в свързан списък, при което базовият регистър се зарежда с началния адрес на необходимия блок.

      Известно е, че операция събиране причинява определено закъснение, ето защо реализацията на закона (5.2.1.2) може да не бъде буквална, а да се постига чрез операция конкатенация. Схемата на такова адресиране не съдържа суматор. Изпълнителният адрес има вида (b)|D=АИ, което означава, че в базовия регистър се съдържат само старшите разряди на базовия адрес. В този случай не всеки адрес може да бъде базов, а само онези адреси, които имат определен брой нули в младшата си част: В=bbb...bb000...00. След конкатенация с отместването, се формира пълноразрядният изпълнителен адрес във вида:

AИ = bbb...bb | ddd...dd,           където   () = bbb...bb ;   D = ddd...dd.            (5.2.1.5)

      При това, в тази схема отместването D е число без знак, т.е. възможно е относително адресиране само в една посока (положителната). Възможните базови адреси при тази схема на формиране на изпълнителния адрес са разположени в адресното пространство равномерно, със стъпка S, равна на максималното отместване плюс единица:  S=Dmax+1=(11…11) + 1. По този начин за определяне на възможните базови адреси, адресното пространство се разделя на области с обем S. Тези области се наричат параграфи.

      Съществуват примери за смесено формиране на изпълнителния адрес, какъвто е случаят с процесори на фирмата Intel. В тези структури устройството за формиране на изпълнителния адрес извършва събирането на базовия адрес с отместването по следната схема:

 

Фиг. 5.2.1.14.  Схема на смесено събиране

 

      Представената смесена схема (събиране и конкатениране) структурира паметта в параграфи с обем от 16[B]. Сегментният адрес и отместването са с еднакви дължини, но благодарение на не особено голямото отместване (само 4 бита) структурирането на паметта е значително по-фино и много по-голям брой адреси могат да бъдат избирани за базови (сегментни). В по-новите модели процесори фирма Intel се отказа от тази схема и премина към линейна схема, при която всеки адрес може да бъде базов.

      В съвременните процесори са популярни и различни модификации на относителното адресиране. Така например, при относително адресиране с индексиране, основният закон (5.2.1.2) се прилага върху съдържанието не на базов, а на индексен регистър:

      В този случай базовият адрес и отместването си разменят местата – базовият адрес се намира в адресната част на командата Рг.К[АЧ], а отместването в индексния регистър Х. Въпреки, че още не сме изяснили последното понятие, ще отбележим, че съдържанието на индексният регистър Х може да бъде променяно (обикновено чрез инкрементна или декрементна операция), до изпълнение на машинната команда, която адресира относително своя операнд. Тогава може да се съобрази, че при постоянно съдържание в адресната част на командата, последната ще адресира различни клетки, тъй като те ще бъдат променливо отмествани относно базовия адрес. Законът (5.2.1.6) изцяло може да се реализира в логическата структура от фигура 5.2.1.13.

      Законите за относителна адресация (5.2.1.2) и (5.2.1.6) могат да бъдат обединени. Така се получава следния закон:

      Тъй като тук се използват два различни регистъра, следва че адресната част на машинната команда трябва да има структурата, показана по-долу:

 

Фиг. 5.2.1.15.  Структура на машинната команда при относително адресиране с база и индексиране

 

      Апаратната реализация на закона (5.2.1.7) ще бъде представена в следващия пункт. Приложният смисъл на неговата функционалност се състои в това, че базовият адрес и отместването (Вм=(b)+D) адресират началния адрес Вм на масив, а съдържанието на индексния регистър (Х)=j адресира поредния j-ти елемент от масива. Тук в заключение ще отбележим, че съвместното изменение на съдържанието на базовия b и на индексния Х регистри позволява на програмиста да постигне организация по-голяма гъвкавост в преместването на данните.

6.  Индексна адресация

      Методът, наречен индексна адресация, е основен метод за адресиране на операнди. За да представим този метод за адресиране е необходимо да бъдат изяснени практическите нужди, чието отражение е той. Следва да отбележим, че това е единственият метод за адресиране, който е разработен по причина на алгоритмични (софтуерни) проблеми.

Въведение

      Още с появата на изчислителните машини е била осъзната аритметичната същност на много изчисления, провеждани върху организирани множества от данни. Последните се наричат обикновено масиви. Организацията (подреждането) на елементите в даден масив се изразява чрез техния индекс. Индексът (например (i,j,k,l,m)) представлява списък от индексиращи количества, които изразяват заеманото място от дадения елемент в цялото множество, според вида на организацията му. В този смисъл на читателя е известно, че има едномерни, двумерни и многомерни масиви. Така например, Bk е означение на k-тия елемент в едномерния масив В, където k=1, 2, ... , K, ако В има K на брой елемента. Този вид данни е основен.

      В същото време най-често срещаната алгоритмична структура, която описва определен вид изчислителен процес, е цикличната структура. Като правило тази алгоритмична структура е свързана с данни от вида масив. Искаме да кажем, че обработката на данни от вида масив, на практика във всички случаи, се постига чрез циклически алгоритми. От алгоритмична и от програмна гледна точка е известно, че при изпълнение на цикъл, дадена машинна команда, намираща се в тялото на цикъла, се изпълнява многократно. За пример ще разгледаме класическата задача за намиране на сумата от елементите на един масив – да кажем за споменатия по-горе едномерен масив В, имащ K на брой елемента. На фигурата по-долу е представена дефиниционната блок-схема за структурата цикъл (лявата рисунка). Дясната рисунка представя чрез блок-схема алгоритъма на поставената задача.

 

Фиг. 5.2.1.16.  Цикъл за натрупване на сумата от елементите на масив В

 

      Тук се вижда, че машинната команда за операция събиране, с която ще се реализира действието S:=S+B(k) в тялото на цикъла, ще се изпълни K пъти. Важното в случая е това, че при всяко свое ново изпълнение, тя трябва да работи с нов операнд! Новият операнд B(k) е следващият елемент от масива В, което е изразено чрез новата стойност на неговия индекс - променливата k. Отново ще подчертаем – едно и също действие, една и съща команда, записана в текста на програмата само веднъж, трябва да се изпълнява многократно, но с променлива адресна част!

      В така изразения изчислителен процес се съдържа един съществен проблем, който задължително следва да бъде видян и разбран. Това е проблемът за реализация на автоматичната смяна на операнда на командата. Този проблем се нарича преадресиране на командата и същността му се състои в това, че нейната адресна част трябва се променя по време на изпълнение на програмата, т.е. адресът на операнда е променлива величина (променящ се адрес).

      За да може да се реши проблемът с променливата адресна част на машинната команда се използува математическата организация на елементите в масива. Тази организация (тази подреденост) се пренася заедно с елементите на масива в паметта на изчислителната машина, като става организация на техните адреси. Това означава, че едно организирано множество от данни, се разполага в паметта, в аналогично организирано множество от адреси. С други думи, множеството се превръща в масив, чиито елементи са разположени в последователни клетки. Така се сдобиваме с пряко съответствие между индекс и адрес на елемент от масива, което може да се изрази формално така:

{ k := k+1 }    Û    { Ak := Ak-1 + L }  ,                         (5.2.1.8)

където k е новата стойност на индекса и е с начална стойност 1; Аk е новият адрес, а L е дължината на елемента в брой адресируеми единици. Ако елементите на масива заемат по една клетка, то Аkk-1+1. Зависимостта (5.2.1.8) показва как регулярно може да се формира адресът на всеки нов операнд на машинната команда за събиране в алгоритъма от фигура 5.2.1.16. След тези съждения, алгоритъмът от примера може да се изрази както е показано на следващата фигура 5.2.1.17.

 

Фиг. 5.2.1.17.  Блок-схема на алгоритъма с изразена преадресация

 

      Връзката между изпълнителния адрес Аи и индекса k може да бъде изразена явно по следния начин:

      В горния израз адресът А0 е базов (начален) адрес на масива, а произведението (k.L) е отместването на k-тия елемент спрямо базата, измерено в брой адресируеми единици.

      В края на обясненията, изложени току що, трябва да се каже, че изчисляването на изпълнителния адрес на текущия операнд на машинната команда, трябва да се извършва вън от нея (вън от програмата), т.е. с апаратни средства. Това е така, защото принципно в софтуера не се правят изменения по време на изпълнение, т.е. зареденият за изпълнение машинен код (текст) е непроменящ се при никакви обстоятелства. С други думи, в машинната команда е възможно да се посочват само онези величини, които не се променят, а променливите величини, участващи при формиране на адреса, следва да се поставят вън от нея, във логически възли, реализиращи закона на преадресирането (5.2.1.8), или (5.2.1.9).

      Техническата реализация на преадресирането се изразява във въвеждане в структурата на процесора на регистри със специално предназначение, които да формират и да съхраняват индекса на текущия елемент, с чиято помощ се изчислява изпълнителният адрес. Това им предназначение е причина за историческия произход на тяхното наименование - индексни регистри. В съвременните процесори индексните регистри са част от регистровата памет и са тяхна архитектурна характеристика. Законите (5.2.1.8) и (5.2.1.9) определят, че в тези регистри трябва да е възможно изпълнението на унитарни операции. Тези операции правят тези регистри програмно достъпни. За целта в системата от машинни команди се разработва специална група команди, наричани команди за работа с индексните регистри.

Изпълнимите в индексните регистри операции обикновено имат следните наименования "Изчистване", "Зареждане", "Запомняне", "Събиране с константа",  "Изваждане на константа" и други. С помощта на командите за работа с индексните регистри се реализира модификацията на адресния код, или още преадресацията.

      В процесори с по-елементарна структура обикновено има само един индексен регистър. В такива процесори преадресацията се извършва по закона (5.2.1.8), според който първоначално индексният регистър се зарежда с начална стойност, представляваща база (начален адрес на масива). Преадресацията представлява изменение на съдържанието на индексния регистър чрез съответната операция. Тъй като в индексния регистър са възможни както инкрементни така и декрементни операции, обхождането на елементите му може да се осъществи и в двете посоки. Така в индексния регистър непрекъснато се намира изпълнителният адрес на операнда. За да бъде командата с индексна адресация обаче по-гъвкава, обикновено в нейната структура се въвежда поле за отместване, което позволява на програмиста да реализира алгоритми, в които се обработват повече от един масиви. В такива системи структурата на командата има вида:

 

Фиг. 5.2.1.15.  Структура на машинната команда при индексно адресиране

 

а изпълнителният адрес на операнда се формира по закона:

според който, съдържанието на индексния регистър Х се събира с числото D, наричано отместване.

      При изпълнение на програмата преадресацията се извършва в индексния регистър, с отделна команда, която реализира закона X:=(X)+k, където k е дължината на алгоритмичната стъпка в масива.

      В процесори с няколко индексни регистри, в структурата на командата се налага включване на поле за адресиране на конкретния регистър, който съдържа индекса на търсения операнд. В общия случай преадресацията се реализира по закона (5.2.1.9). Достойнството на този закон се състои в това, че в явна форма използува базовият адрес А0. Това дава възможност, с помощта на базов регистър, да се реализира посочения по-горе закон (5.2.1.7). При този закон структурата на адресното поле на командата е както е посочено по-горе на фигура 5.2.1.15.

      Законът (5.2.1.7) е възможно най-общата форма за индексна адресация с базиране и изисква за своята реализация логическа структура, която е показана на фигура 5.2.1.16. Адресите Х и b отварят в двупортовото СОЗУ два регистъра, съдържащи съответно индекса k и базата В. Хардуерните суматори реализират окончателното изчисляване на изпълнителния адрес (адреса на операнда).

 

Фиг. 5.2.1.16.  Схема на базово индексно адресиране на операнд

 

      От фигура 5.2.1.16 може да се види, че една и съща команда може да имитира или да работи само по някой от споменатите закони, като този избор се управлява чрез съдържанието на адресните полета b и Х в командата. Така например, ако b=0, това може да означава изключване на възможността за подаване на базов адрес, с което се постига законът (5.2.1.10). Функционирането на структурата е показано със следващата блок-схема на микропрограма за тези адресации. Тази блок-схема може да се разглежда като продължение на онази, която представихме на фигура 5.2.1.8.

 

Фиг. 5.2.1.17.  Примерна микропрограма за относително, индексно и безадресно адресиране

 

      Както базовите, така и индексните регистри, по същество съдържат само адресна информация и по тази причина тяхната дължина е съобразена най-вече с дължината на адреса или на структурните единици в паметта.

      Така както и при относителната адресация и тук в индексната адресация отместването D, което програмистът може да постави в командата, е число със знак или без знак и всичко казано в пункт 6 за това число се отнася и към разглеждания тук метод. В архитектурно по-богатите процесори се практикуват по два и повече формата на полето за отместване – късо 8[b], дълго 16[b] или и други.

      В много процесори индексните регистри са с разширена функционалност и не се различават например от базовите.

7.  Кратко заключение

      Ние вече направихме съществения коментар относно отделните методи за адресиране, но той беше свързан в голяма степен с апаратното им реализиране. В специализираната научна литература читателят би могъл да намери различни публикации, които съдържат обобщаващи констатации и изводи относно полезността и използваемостта на различните методи за адресиране от гледна точка на реалните програми. По същество се поставя следния въпрос: колко често се използват отделните методи в реалните програми?. Подобни оценки са полезни както за програмиста, така и за конструктора. В следващата таблица са представени такива оценки за три програмни продукта, масово използвани в компютри с архитектура VAX.

Таблица 5.2.1.1  Относителен дял на различни методи за адресиране

 

косвена

Базово индексна

регистрова

непосредствена

базова

Текст-редактор  TeX

1%

0%

24%

43%

32%

CAD-система  Spice

6%

16%

3%

17%

55%

С-компилатор  GCC

1%

6%

11%

39%

40%

 

      Изводът, който се налага от приведените оценки е, че в използването доминират методите за непосредствено и относително адресиране. При това основният въпрос пред конструктора, който възниква за относителния метод на адресиране, е свързан с дължината на отместването. Изборът на дължината на отместването определя дължината на неговото поле в командата. Практиката показва, че в болшинството случаи 16-битовата дължина е напълно достатъчна. Естествено при големите дължини на разрядната мрежа, на адресите и на шините, които в последно време се реализират в много процесори, се реализират и команди с 32 битови отмествания.

Този въпрос е важен и за непосредственото адресиране. Непосредственото адресиране се прилага най-вече при аритметически операции, операции от тип сравнение, а така също операции зареждане на константи в регистри. И тук статистиката показва, че 16 битовата дължина на полето в командата за непосредствен операнд е достатъчна в повечето случаи. Тук обаче за целите на изчисляване на адресите могат да бъдат дефинирани константи и с по-големи дължини, свързани с конкретната архитектура на процесора.

 

 

 

Следващият раздел е:

 

5.2.2  Методи за адресиране на командите