Тема 6

Начини за адресация на операндите. Граници на адресите.


страницата се нуждае от дописване/преглеждане


Подравнени и неподравнени данни

От курса по ООП знаем, че съществува такова нещо като alignment - "подравняване". Казано накратко, подравнените в паметта данни започват от адреси, кратни на размера на машинната дума (4 байта в x86). За подравняването може да има други изисквания, например при работа със структури от данни, с примитиви, по-големи от машинната дума (например 8-байтови числа с плаваща запетая в 32-битова архитектура), или с примитиви, които не са с дължина, кратна на байт (80-битови числа с плаваща запетая).
Процесорът може да работи с изравнени или неизравнени граници на данните. Ако се работи с изравнени адреси, при изчисляване на адреса се проверява дали това действително е така (дали адресът е от вида XX…X002 (в 32-битова реализация)). Подравняването е необходимо, защото връзката ОП-ЦП е 32(или 2х32) битова(в общия случай връзката е определен брой битове) и съответно както и да сме записали данните в ОП, трябва да подадем 32 бита по шината.

bit_connection_OP_CP.PNG

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

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

t06_alignment_holes

Начини за адресиране

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

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

Полето съдържа физическия адрес на операнда, който директно се подава на контролера на паметта. Числото ( стойността на операнда ) е представено в допълнителен код, като най-левият бит на операнда съдържа неговия знак. Използва се за задаване на константи или начални стойности на променливи.

$\#n$

Регистров

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

$M[R_i]$

Регистров с отместване

Подава се съдържанието на регистър, към което се прибавя отмесване ("offset") - обикновено цяло 16/32-битово число със знак.
$M[R_i +\#n]$

Индексна форма

Подават се два регистъра, чиито съдържания се сумират.
$M[R_i + R_j]$

Идеята е единия регистър, да речем $R_i$, да играе ролята на базов, а другия да съдържа относителното отместване спрямо базовия. По този начин се получава по-гъвкава програма, защото променяйки базовия адрес, можем да сменяме комплекта данни, които програмата използва, без да правим много промени по кода.

Двойна косвена регистрова форма

Подава се регистър, с чието съдържание се адресира паметта, откъдето се извлича стойност, обозначаваща физическия адрес на операнда (след което следва повторно адресиране с тази стойност).
$M[M[R_i]]$

Автоинкрементална форма

Подава се регистър и се прави адресация със стойността му, която после се увеличава с дължината на операнда - зададена в инструкцията.
$M[R_i]$ ; $R_i +=$ sizeof(операнд)
Подобно е на варианта да се сумират съдържанията на базов и относителен регистър.

Автодекрементална форма

Подава се регистър, намалява се стойността му с дължината на операнда - зададена в инструкцията - и след това с новата стойност се адресира паметта.
$R_i -=$ sizeof(операнд) ; $M[R_i]$

Индексна със скалар

Най-сложен начин на адресиране. Подават се два регистъра. Към съдържанието на първия се прибавя съдържанието на втория, умножено с някакво число (скалар), след което се прибавя отместване, и се получава физическият адрес.
$[R_i + d * R_j + \#n]$
Причината някой да иска да използва толкова сложен метод е желанието за максимална гъвкавост на програмата. В този случай $R_j$ може, например, да съдържа индекс от масив, а $d$ да указва големината на типа на масива.
Ако $d$ е точна степен на 2, за умножението може да се използва по-бързо побитово изместване.

Други

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

Обикновено в една архитектура се използват няколко начина за адресиране. В сложни, големи системи (например любимите ни вече VAX, производство на DEC) се срещат всички тези, и много други начини за адресиране. Знаем (ако не знаем, вече знаем), че VAX са връх на сложността при компютърните архитектури.
Майтапа настрана, VAX наистина са много популярни, особено сред университетите. Обърнете внимание на следното:

The first VAX model sold was the VAX-11/780, which was introduced on October 25, 1977
By 2005 all manufacturing of VAX computers had ceased, but old systems remain in widespread use.

Да, наистина все още ги има

RISC и отмествания

През 70те (на 20 век) на различни места се провеждат проучвания върху най-често използваните начини за адресиране. Оказва се, че най-често използвани (около 93% от всички адресирания) са непосредственият ($\#n$), операнд в регистъра ($R_i$), регистров ($M[R_i]$) и регистров с отместване ($M[R_i + \#n]$) (регистровият може да се разглежда като регистров с отместване, при отместване 0). В RISC е имплементирано именно адресиране чрез регистър и отместване.

Така, при 32-битови регистри може да имаме 6 бита за код на операция, 5 бита за "име" на регистър-цел, 5 бита за "име" на регистър, съдържащ адреса, и 16 бита за стойност на отместването. По този начин се осигуряват еднакви дължини на load и store инструкциите.

t06_risc_instr

Допълнителни четива

Режими на адресиране
Оригинални резервни части и аксесоари за VAX //поредната шега - прахосмукачки…

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License