Strojová instrukce

nejmenší krok při provádění počítačového programu

Strojová instrukce je v informatice označení kódovaného příkazu pro provedení elementární operace procesoru, kterou je procesor schopen přímo vykonat (procesor je základní součástí počítače). Posloupnost strojových instrukcí je označována jako strojový kód. Různé procesory mají různé sady strojových instrukcí. Některé procesory podporují více sad strojových instrukcí (např. současné procesory pro počítače IBM PC kompatibilní podporují sadu x86-16, IA-32 a x86-64, které se celkově označují jako x86).

Zápis strojové instrukce editovat

Funkce strojové instrukce se pojmenovává tzv. mnemonikou. Za mnemonikou mohou (ale nemusí) následovat operandy, neboli parametry dané strojové instrukce.

Mnemonika editovat

Mnemoniky se většinou skládají z několika písmen zkratkovitě v angličtině naznačujících funkci dané strojové instrukce. Například mnemonika SUB (z anglického SUBtract – odečti) se může použít pro operaci odečítání, mnemonika CMP (CoMPare) může být použita pro označení strojové instrukce pro porovnání dvou čísel. Pro zápis ani pro implementaci instrukcí neexistují jednotná pravidla, každá rodina procesorů (nebo také architektura) má vlastní instrukční sadu s vlastními mnemonikami, kterou vytváří výrobce procesoru.

Operand editovat

Jestliže mnemonika označuje co daná strojová instrukce dělá, její operandy určují s čím. Jinými slovy, operand určuje zdrojová nebo cílová data, nad kterými daná strojová instrukce pracuje. Operand bývá buď konstantou, nebo adresou v některém z paměťových prostorů počítače. Typicky jsou to adresový prostor registrů a operační paměti.

Adresa může být určena buď přímo (tzv. přímé adresování) – jako konstanta určující index buňky v operační paměti počítače. Druhou základní možností je nepřímé adresování, kdy je operandem registr jehož obsah je interpretován jako index buňky v operační paměti počítače.

Příklady instrukcí editovat

Následující jsou uvedeny v instrukčním kódu procesoru Siemens SAB 80C166. Z hlediska výkladu je vhodný, protože jde o jednoduchý 16bitový procesor s poměrně čistou, nijak extrémní architekturou.

  • add r0, r2; – sčítání – přičte do registru r0 hodnotu uloženou v registru r2
  • addc r1, r3; – sčítání s přenosem – přičte do registru r0 hodnotu registru r1 a příznaku přenosu C
  • mov 1234h, r0; – přesun – uloží do paměti na adresu 1234h hodnotu z registru r0
  • mov 1236h, r1; – přesun – uloží do paměti na adresu 1236h hodnotu z registru r1
  • mov [r7], r0; – přesun – uloží na adresu určenou registrem r7 hodnotu z registru r0
  • cmp r4, r5; – porovnání – porovná hodnoty registrů r4 a r5
  • jmpr cc_UGT, 8100h; – podmíněný skok – pokud byla hodnota registru r4 vyšší, pokračuje program na adrese 8100h

Strojové instrukce se dělí podle svého určení na přesunové, aritmeticko-logické a řídící instrukce. Výrobci většinou používají mnohem jemnější rozdělení (např. přesuny, aritmetické, logické, rotace, násobení a dělení, skoky, zásobníkové, systémové instrukce).

U některých architektur není situace tak jasná. Například přesunová strojová instrukce, která změní hodnotu v systémovém registru procesoru de-facto přebírá funkci systémové instrukce.

Přesunové instrukce editovat

Přesunové slouží ke kopírování dat v paměti. Tyto instrukce mají typicky mnemoniku MOV (z angl. move – přesun), případně LD nebo ST (load, store). Prakticky vždy mají dva operandy – zdrojový a cílový, kdy hodnota uložená ve zdrojovém operandu je uložena do cílového operandu.

Aritmeticko-logické instrukce editovat

Aritmeticko-logické instrukce slouží k vykonávání aritmetických nebo logických operací. V podstatě jde o to, že se zdrojovými operandy se provede určitá matematická operace, jejíž výsledek je uložen do cílového operandu. Velmi častý je případ, kdy jeden ze zdrojových operandů slouží současně jako cílový. To znamená, že např. instrukce add r0, r1 nejprve sečte hodnoty registrů r0 a r1, přičemž výsledek uloží do registru r0.

Typickými funkcemi aritmeticko-logických instrukcí jsou sčítání (ADD), odečítání (SUB), porovnávání (CMP), bitové logické součty (OR) a logické součiny (AND), bitové posuny a rotace.

Aritmetické nebo logické nemusí být vždy dvouoperandové, instrukce realizující např. absolutní hodnotu, násobení minus jedničkou, nebo dvojkový doplněk mají pouze jeden operand.

Podle možností daného procesoru se liší šířka operandů (8/16/32 bitů) a jejich typ. Některé procesory (např. PIC) mají pouze instrukce pro jednoduché operace s malými celými čísly (viz byte), jiné mohou přímo pracovat s čísly v plovoucí řádové čárce (např. dle standardu IEEE 754).

Instrukce a příznakové registry editovat

Záměrným vedlejším efektem provedení instrukce obvykle bývá určité nastavení příznakových bitů v procesoru, který za tímto účelem obsahuje takzvaný registr příznaků. Registr příznaků využívají především podmíněné skoky a instrukce pro přičítání nebo odečítání s přenosem. Způsob nastavování příznaků bývá obvykle pro určitou skupinu instrukcí stejný. Zvláštní funkci z tohoto hlediska zastávají instrukce pro porovnávání, protože nemění hodnotu svých operandů, ale pouze nastavují příznakové bity (anglicky flags).

Téměř vždy jsou přítomny příznakové bity

  • N – negative – nastavuje se, když je výsledkem operace záporné číslo
  • Z – zero – nastavuje se, když je výsledkem operace nula
  • C nebo CY – carry – nastavuje se, když došlo při sčítání k přenosu. Při odčítání nebo porovnávání se nastavuje jako výpůjčka, nebo jako negace výpůjčky, to závisí na architektuře CPU
  • V nebo OV – overflow – nastavuje se, pokud došlo při operaci k přetečení

Probírat přesný význam příznakových bitů je nad rámec tohoto článku, navíc co se týče CY existují dvě možnosti implementace při odčítání a porovnávání. Různé procesory mohou implementovat více, ale jen výjimečně méně příznakových bitů (např. Intel 8080 neimplementoval příznak přetečení).

Řídící instrukce editovat

Tyto instrukce mění buď tok programu, nebo způsob, jakým procesor funguje. Základní řídící instrukcí je instrukce skoku (typicky má mnemoniku JMP), která říká, že vykonávání programu nepokračuje následující instrukcí, ale instrukcí která je uložena na adrese definované operandem instrukce JMP.

Podobnou funkci má instrukce podmíněného skoku, která se používá v kombinaci s instrukcemi nastavujícími příznakové bity k větvení programu. Ke skoku dojde pouze za předpokladu, že jsou určitým způsobem nastaveny příznakové bity procesoru. Následující instrukce podmíněného skoku (např. JMPR CC_NZ, 1234h – skoč, když není nastaven příznak Z – zero) může například „přehodit výhybku programu“, pokud výsledkem kontrolního součtu nebyla nula.

Opakovaně využívané sekvence kódu je možné vyvolat pomocí instrukce volání podprogramu (typicky „CALL“), konec podprogramu označuje instrukce návratu z podprogramu (typicky „RET“ nebo „RETURN“).

Kromě toho mohou některé instrukce měnit způsob chodu procesoru, extrémním případem může být procesor ARM, který může být přepínán mezi dvěma různými soubory instrukcí – mezi „ARM“ módem a „thumb“ módem. Přičemž instrukční soubor ARM je optimalizovaný na rychlost, zatímco instrukční soubor „thumb“ je optimalizovaný na velikost kódu.

Kódování instrukcí editovat

Aby mohly být instrukce vykonávány procesorem, je nutno je uložit do polovodičové paměti, jako sekvence několikaciferných dvojkových čísel. Tato sekvence se nazývá strojový kód. Výrobce procesoru proto pro každou instrukci definuje, jakým způsobem má být zakódována do paměti počítače.

Abychom si to ozřejmili, výrobce procesoru může například stanovit, že každá instrukce je zakódována pomocí 16 bitů (neboli dvojkových cifer). Přitom do prvních šesti bitů se zakóduje mnemonika instrukce (šestibitové číslo nám dovolí implementovat 64 typů instrukcí – mnemonik), do druhých pěti bitů zakódujeme první operand, do posledních pěti bitů druhý operand. Ve skutečnosti bývá kódování instrukcí mnohem složitější, avšak princip je stejný.