Inštrukcia (strojový príkaz) v informatike — definícia, formát a typy
Komplexný sprievodca inštrukciami (strojovými príkazmi): definícia, formát, typy, režimy adresovania a príklady naprieč procesorovými architektúrami.
V informatike je inštrukcia jedna operácia procesora definovaná inštrukčnou sadou procesora. Inštrukcia určuje, aký krok má procesor vykonať — napríklad načítať alebo zapísať dáta, vykonať aritmetickú alebo logickú operáciu, zmeniť tok riadenia programu alebo manipulovať so statusovými bitmi. Inštrukcie tvoria základ spustiteľného kódu a sú jadrom komunikácie medzi softvérom a hardvérom.
Veľkosť alebo dĺžka inštrukcie sa značne líši, od 4 bitov v niektorých mikrokontroléroch až po násobky bajtov v niektorých systémoch s veľmi dlhým inštrukčným slovom (VLIW). Väčšina moderných procesorov používaných v osobných počítačoch, mainframoch a superpočítačoch má veľkosť inštrukcií od 16 do 64 bitov. V niektorých architektúrach, najmä v počítačoch s redukovanou inštrukčnou sadou, majú inštrukcie pevnú dĺžku, ktorá zvyčajne zodpovedá veľkosti slova danej architektúry.
Na tradičných architektúrach inštrukcia obsahuje opkód určujúci operáciu, ktorá sa má vykonať, napríklad "pridať obsah pamäte do registra", a nula alebo viac špecifikátorov operandov, ktoré môžu určovať registre, pamäťové miesta alebo doslovné údaje. Špecifikátory operandov môžu mať režimy adresovania, ktoré určujú ich význam, alebo môžu byť v pevných poliach. Typický opkód môže byť doplnený políčkami pre registre, posuny, dĺžky operácie, alebo príznakové bity, ktoré menia správanie inštrukcie.
V architektúrach VLIW, medzi ktoré patria mnohé architektúry mikrokódu, sa v jednej inštrukcii špecifikuje viacero simultánnych operácií a operandov — cieľom je využiť paralelizmus na úrovni inštrukcií bez nutnosti zložitého dynamického plánovania v hardvéri.
Inštrukcie sa zriedkavo špecifikujú v podobe strojového kódu; môžu ich špecifikovať programátori pomocou jazyka assembleru alebo, čo je častejšie, ich môžu generovať kompilátory. Assemblery a kompilátory prekladajú čitateľnú symbolickú reprezentáciu do binárneho kódovania, ktoré procesor dokáže priamo vykonať.
Existuje aj iná, všeobecnejšia definícia "inštrukcie", ktorá sa netýka len inštrukčnej sady procesora, a to: inštrukcia môže byť akákoľvek reprezentácia prvku spustiteľného počítačového programu — napríklad mikrokód v riadiacej jednotke, mikrooperácie v superskalárnych procesoroch alebo elementárne príkazy v interpretoch.
Formáty inštrukcií
Formát inštrukcie popisuje rozloženie bitov v inštrukčnom slove. Bežné formáty zahŕňajú:
- nultý-operandový (stackové inštrukcie) — operandy sú implicitne na vrchu zásobníka,
- jedno-adresový (akumulátorové systémy) — inštrukcie ukazujú na akumulátor a pamäť/registra,
- dva-adresový — operand a cieľ môžu byť rovnaké alebo zdieľané,
- tri-adresový — oddelené zdrojové a cieľové registre (časté v RISC architektúrach),
- variabilné polia — opkód + polia s adresami/registrom/imm hodnotami a voliteľnými prefixmi/flagmi.
Rôzne procesorové rodiny používajú vlastné schémy kódovania, pričom niektoré (napr. MIPS, ARM v režime A32) preferujú jednoduché, pevné dĺžky inštrukcií, zatiaľ čo iné (x86) používajú zložité, variabilné kódovanie s prefixmi, modifikátormi šírky a rozličnými režimami.
Adresovanie operandov
Spôsob, akým inštrukcia špecifikuje operandy, sa nazýva režim adresovania. Bežné režimy sú:
- registrový (operand je v registri),
- priame (adresovanie pamäte pevnou adresou),
- registrovo-indirectné (adresu určuje obsah registra),
- indexované (registro + offset),
- imediátne (operand je zakódovaný priamo v inštrukcii),
- relatívne (adresy vetvenia sú relatívne k aktuálnej inštrukcii).
Niektoré z týchto režimov sú popísané vo výraze režimy adresovania, ktoré v pôvodnom texte odkazuje na súvisiacu problematiku.
Typy inštrukcií podľa funkcie
- Aritmeticko-logické inštrukcie (ADD, SUB, AND, OR, XOR, SHIFT),
- Nakladacie a ukladacie inštrukcie (LOAD, STORE),
- Inštrukcie pre riadenie toku (JMP, CALL, RET, podmienené skoky),
- Inštrukcie pre manipuláciu s príznakmi a stavom (SET, TEST),
- Vstupno-výstupné a privilegované inštrukcie (I/O, správa pamäti, systémové volania),
- Súborovo-špecifické alebo multimediálne rozšírenia (SIMD, vektorové inštrukcie).
Dĺžka, kódovanie a komplikácie
Krátke a pevné inštrukcie uľahčujú dekódovanie a predvídateľné načítavanie, čo je výhoda RISC architektúr. Variabilné dĺžky a komplexné kódovanie (ako u x86) umožňujú hustejšie a flexibilnejšie kódovanie bohatých inštrukčných sád, no komplikujú dekódovaciu jednotku a robia pipelining náročnejším. Moderné implementácie často používajú dekódery, ktoré prekladajú komplexné inštrukcie na interné mikrooperácie (micro-ops) alebo mikroinštrukcie, ktoré sú potom vykonávané paralelne alebo superskalárne.
Výkon a vykonávanie
Vykonávanie inštrukcií v modernom procesore zahŕňa viacero fáz: načítanie inštrukcie (fetch), dekódovanie, načítanie operandov (read), vykonanie operácie (execute), prístup do pamäti ak treba (memory access) a zápis výsledku (write-back). Optimalizácie zahŕňajú:
- pipelining — rozdelenie vykonania inštrukcie do stupňov pre zvýšenie priechodnosti,
- superskalárne vykonávanie — paralelné vykonávanie viacerých inštrukcií za hodinu (cyklus),
- out-of-order execution — dynamické plánovanie inštrukcií podľa dostupnosti operandov,
- predikcia vetvenia — znižovanie strát spôsobených skočnými inštrukciami,
- jednotky pre vektorové/SIMD operácie a špecializované výkonné bloky.
Tieto techniky zvyšujú rýchlosť ale zvyšujú zložitosť správy závislostí medzi inštrukciami a zaťažujú návrh hardvéru (hazardy dát, control hazards, resource conflicts).
Programovanie a reprezentácia
Programátor obyčajne nepracuje priamo so strojovým kódom, ale s assemblerom alebo vyššími programovacími jazykmi. Jazyk assembleru poskytuje symbolické názvy inštrukcií a operandov, ktoré sa prekladajú do strojového kódu. Kompilátory a optimalizátory rozhodujú o rozmiestnení inštrukcií, registrách a o použití rozšírených inštrukcií podľa cieľovej architektúry.
Existujú aj kategórie inštrukcií a mechanizmov, ktoré sú dôležité z hľadiska bezpečnosti a správy systému: privilegované inštrukcie (prístupné len v režime jadra), inštrukcie pre správu pamäte (MMU), prerušenia a výnimky, a inštrukcie umožňujúce synchronizáciu v multiprocesorových systémoch.
Zhrnutie
Inštrukcia je základný prvok, ktorým softvér komunikuje s procesorom. Jej formát, dĺžka, režimy adresovania a funkcionalita tvoria súbor pravidiel (inštrukčnú sadu), ktorý zásadne ovplyvňuje výkon, zložitosť a použiteľnosť danej architektúry. Moderné návrhy kombinujú tradičné princípy kódovania inštrukcií s pokročilými technikami vykonávania, ako sú dekódovanie do mikrooperácií, pipelining, superskalárnosť a predikcia vetvenia, aby dosiahli vysoký výkon pri zachovaní spätnej kompatibility a funkčnosti.
Súvisiace stránky
Otázky a odpovede
Otázka: Čo je to inštrukcia v informatike?
Odpoveď: Inštrukcia v informatike je jedna operácia procesora definovaná inštrukčnou sadou procesora.
Otázka: Aké dlhé môžu byť inštrukcie?
Odpoveď: Veľkosť alebo dĺžka inštrukcie je veľmi rôzna, od 4 bitov v niektorých mikrokontroléroch až po násobky bajtov v niektorých systémoch s veľmi dlhým inštrukčným slovom (VLIW). Väčšina moderných procesorov používaných v osobných počítačoch, mainframoch a superpočítačoch má veľkosť inštrukcií od 16 do 64 bitov. V niektorých architektúrach, najmä v počítačoch s redukovanou inštrukčnou sadou (RISC), majú inštrukcie pevnú dĺžku, ktorá zvyčajne zodpovedá veľkosti slova danej architektúry.
Otázka: Čo obsahuje inštrukcia?
Odpoveď: Inštrukcia obsahuje opkód špecifikujúci operáciu, ktorá sa má vykonať, napríklad "pridaj obsah pamäte do registra", a nula alebo viac špecifikátorov operandov, ktoré môžu špecifikovať registre, pamäťové miesta alebo literálne údaje. Špecifikátory operandov môžu mať režimy adresovania, ktoré určujú ich význam, alebo môžu byť v pevných poliach. V architektúrach VLIW sa v jednej inštrukcii špecifikuje viacero súbežných operácií a operandov.
Otázka: Ako sa zvyčajne špecifikujú inštrukcie?
Odpoveď: Inštrukcie sa zriedkavo špecifikujú pomocou ich formy strojového kódu; môžu ich špecifikovať programátori pomocou jazyka assembleru alebo častejšie ich generujú kompilátory.
Otázka: Existuje iná definícia pojmu "inštrukcia"?
Odpoveď: Áno, existuje ďalšia všeobecnejšia definícia "inštrukcie", ktorá sa netýka len inštrukčnej sady procesora, čo je akákoľvek reprezentácia prvku spustiteľného počítačového programu.
Otázka: Majú všetky inštrukcie rovnakú veľkosť?
Odpoveď: Nie, veľkosť alebo dĺžka inštrukcií sa značne líši v závislosti od typu použitého procesora, od 4 bitov až po niekoľko bajtov v prípade systémov VLIW, pričom väčšina moderných procesorov má veľkosť medzi 16 a 64 bitmi, zatiaľ čo architektúry RISC majú zvyčajne inštrukcie s pevnou dĺžkou zodpovedajúcou veľkosti slova danej architektúry.
Prehľadať