Тема 4

Инструкции - формати, операции, групи инструкции и формати на данните.


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


Instruction set

IS е набор от инструкции за даден процесор - множеството от всички инструкции, които може да изпълнява процесорът (примерно "легни!", "стани!","падни за 20" или "събери тези две числа"). Инструкциите биват в няколко различни формата - тоест, възможни дължини и от какви полета се състоят. Теоретично една инструкция се състои от 4 полета, а именно код на операцията, адрес на операнд 1, адрес на операнд 2 и адрес на резултат.
IS_fourchunk_format.PNG
Като поле в инструкцията може да се сложи стойноста на операнда, но това е неудобно, защото инструкцията е трудна за промяна. Затова е широко прието да се работи с адреси.

Ако операндите са представени със стойности, първо се чете инструкцията, после се отделят операндите и това е най-бързият начин на работа. За сметка на което е много неудобен за работа - операндът има фиксиран размер, който обикновено трябва да е малък (често 1B), за да бъде къса (съответно, бърза) самата инструкция. Използва се понякога, за къси константи.
Тъй като 3 адресни полета може да са много, се решава Арез да се записва на мястото на Аоп1, подменяйки деструктивно съдържанието му. Прочитане на операнда от подаден адрес не влияе на стойността на самия операнд. Така получената инструкция е със следния вид:
IS_threechunk_format.PNG
Кодът на операцията указва на АЛУ какво точно да извърши с операндите.
Върху тази обща форма са възможни три интерпретации на дължината на инструкцията:

  1. Всички инструкции за набора(IS) да се изберат с еднаква дължина(примерно 4B). Това има предимството, че кешът(cache) ще работи много добре, тъй като ще се знае дължината на всяка следваща инструкция, ще се прочита цялата и няма да се налага да се дешифрира предварително (за да се разбере колко е дълга).
  2. Няколко определени дължини на инструкциите (например 4 фиксирани дължини - 2B, 4B, 6B или 8B за дължина на инструкция). Тогава, колко е дълга инструкцията ще се определя от най-левите 2 бита от кода на операцията. Операционните кодове ще се разделят на 4 групи в този случай.
  3. Кодът на операцията няма връзка с дължината - тя е контекстно зависима, променлива за различните инструкции и се определя по време на четенето им. Като се стигне до определен байт, ще се разбере, че инструкцията е свършила. В този случай кодът на операцията определя броя на операндите. След него следват спецификация за операнд1, за операнд2 и за result.
OP_instruction_beg.PNG

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

Функционални групи инструкции

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

Инструкции за трансфер на данни

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

Инструкции за аритметична обработка

Събиране, изваждане, умножение, деление, унарните операции( abs, ++, --, - ) на числа с фиксирана точка, плаваща запетая и пакетирани десетични числа. Изпълнението на аритметичните операции предизвиква трансфер на данни за зареждане на операндите в регистрите на процесора, за да могат да бъдат използвани от АЛУ-то, както и запис на резултата от АЛУ-то в регистър на процесора.

Инструкции за логическа обработка

Булеви операции над битове, дума и др - not, and, or, xor, shiftL, shiftR, rotateL, rotateR ( всички знаем какво правят ).

Инструкции за конвертиране на данните

Форматират данните или променят техния формат (от десетична към двоична бройна система).

Инструкции за управление на системата

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

Инструкции за предаване на управлението

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

Инструкции за безусловен преход

JMP съдържат в адресното си поле адреса на следващата инструкция, която трябва да бъде изпълнена. Предизвиква зареждане на указания адрес на инструкцията в PC.

Инструкции за условен преход

Те тестват кода на условията CC (Condition Code), който включва флаг, отразяващ типа на резултата на определената операция. Когато е изпълнено условието, PC се зарежда с адреса на инструкцията, указана в адресното поле. В противен случай се изпълнява инструкцията, която следва от естествения ред на изпълнение.

Инструкции за символна обработка

MOVS трансфер на низ, CMPS сравнява два низа, търсене на шаблон, търсене на шаблон с канонично заместване, конкатенация, INS въвежда низ, OUTS извежда низ, REP повтаря указаната операция последователно за всеки елемент на низа.

Инструкции за вход и изход

Поддържат вход и изход на данни.

Разделение на процесори по IS

Първите компютри са имали малък брой операции. С времето той се увеличава, респективно се увеличава сложността на процесора. Стига се до машини с няколкостотин инструкции (дори и такива с над 400 - например архитектурата на компютрите VAX, похвалени от доцента като връх на сладоледа в това отношение). Най-късите инструкции са дълги 1B, най-дългите - 160+B (една инструкция в един набор).
Наборът инструкции оказва влияние върху сложността на компилатора. При повече инструкции е по-лесно за компилаторите да превеждат код на машинен език. Също така, при голям набор инструкции става доста лесно и продуктивно (след подходяща квалификация) да се пише на машинен език.

RISC

През 80те год. екип от Бъркли под ръководството на Дейвид Патърсън прави изследвания върху наборите от инструкции - проследяват се възможностите им и ефективността и се стига до извода, че съществува минимален набор от инстркукции, чрез които могат да се изразят всички останали. Този набор се нарича ортогонален(ако не се сещате, ортогонални работи има в алгебрата и геометрията; тук е същото - ако махнем една инструкция, вече не можем да изразим всички останали с този драстично "отслабнал" IS).
Такива компютри биват наречени RISC (Reduced Instruction Set Computer) - компютър с процесор, имащ един ортогонален набор от инструкции. След като в Бъркли намират първия ортогонален набор, се откриват още два такива набора, като трите са различни, но пълни сами по себе си.

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

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