Kompiuterių moksle instrukcija yra viena procesoriaus operacija, aiškiai apibrėžta procesoriaus instrukcijų rinkinyje (ISA — instruction set architecture). Instrukcija nurodo procesoriui, ką daryti (pvz., sudėti du skaičius, perskaityti duomenis iš atminties arba pereiti prie kitos programos vietos) ir kokius operandus naudoti.

Instrukcijos struktūra

Tradicinėje instrukcijoje paprastai yra du pagrindiniai komponentai:

  • opkodas — laukas, nurodantis atliekamą operaciją (pvz., add, load, jump);
  • operandai — nurodymai, su kuo ta operacija atliekama (registrai, atminties vietos arba tiesioginiai (immediate) duomenys).

Operandų žymenys gali turėti papildomus laukus ar bitus, nurodančius adresavimo režimus (pvz., tiesioginis, netiesioginis, indeksuotas) arba būti įkoduoti fiksuotose instrukcijos laukuose.

Ilgis ir kodavimas

Instrukcijų dydis labai varijuoja: nuo vos kelių bitų kai kuriuose mikrovaldikliuose iki kelių baitų ar daugiau VLIW sistemose. Daugumos šiuolaikinių procesorių, naudojamų asmeniniuose kompiuteriuose, pagrindiniuose kompiuteriuose ir superkompiuteriuose, instrukcijų dydis paprastai būna nuo 16 iki 64 bitų.

Kai kuriose architektūrose, ypač redukuoto instrukcijų rinkinio kompiuteriuose (RISC), instrukcijos yra fiksuoto ilgio, paprastai atitinkančio procesoriaus žodžio dydį (word size). Kitos, sudėtingesnės (CISC) architektūros naudoja kintamo ilgio instrukcijas, kurių formato laukai (pvz., opkodas, modR/M, poslinkiai, immediate) gali turėti skirtingą ilgį ir sudėtingumą.

Instrukcijų tipai ir architektūros

  • RISC — mažas, fiksuoto ilgio opkodų rinkinys; paprastesnės, greitos instrukcijos, lengviau pavieniui taktinti.
  • CISC — daug sudėtingų, dažnai kintamo ilgio instrukcijų, kurios gali atlikti aukšto lygio veiksmus per vieną instrukciją.
  • VLIW — vykdomos kelios operacijos vienu metu į vieną labai ilgą instrukcijos žodį; daug instrukcijų atliekama lygiagrečiai.
  • Specifinės paradigmos — akumuliatoriaus pagrindu (accumulator), steko pagrindu (stack-based) arba registrų mašinos (register-based).

Operandai ir adresavimo režimai

Operandai gali būti:

  • registrai (greičiausias prieigos būdas),
  • atminties vietos (tiesioginės arba per registrą/poslinkį),
  • tiesioginiai (immediate) skaičiai, įkoduoti pačioje instrukcijoje.

Adresavimo režimai lemia, kaip procesorius interpretuoja operandų reikšmes: tiesioginis, netiesioginis, indeksuotas, bazinis+offset, relatyvus šuoliams ir kt. Sudėtingesnės architektūros gali turėti daug adresavimo būdų, kas leidžia lanksčiau formuluoti instrukcijas, tačiau padidina dekodavimo sudėtingumą.

Programavimas ir instrukcijų generavimas

Instrukcijos retai rašomos tiesiogiai kaip mašininis kodas. Jas paprastai nurodo programuotojai naudodami asemblerio kalbą, kur kiekviena asamblėjaus instrukcija atitinka vieną ar kelias mašininio kodo instrukcijas. Daug dažniau instrukcijas generuoja kompiliatoriai, kurie aukšto lygio kalbos konstruktus paverčia efektyviomis mašininėmis instrukcijomis.

Taip pat egzistuoja pseudo-instrukcijos (makroinstrukcijos), kurios assemblerio ar kompiliatoriaus metu išskaidomos į kelias tikras instrukcijas. Kai kurios instrukcijos gali būti įgyvendintos aparatinės įrangos lygiu (hardwired), o kitos — per mikrokodą, kuris sudaro vidurinį sluoksnį tarp ISA ir fizinių grandžių.

VLIW, mikrokodas ir mikroarchitektūra

VLIW architektūrose vienoje instrukcijoje pateikiama informacija kelioms lygiagrečioms operacijoms, todėl vykdymo laikas gali būti labai efektyvus, jei suderinamas su kompiliatoriumi. Mikrokodo architektūrose (dažnai naudojamose kai kuriuose CISC procesoriuose) aukšto lygio instruksija suskaidoma į seką paprastesnių mikropasiruošimų, kuriuos atlieka mikrovaldiklis ar valdiklio logika.

Instrukcijų vykdymo eiga ir našumas

Paprastinė instrukcijos vykdymo seka — fetch → decode → execute (nuskaitymas → dekodavimas → vykdymas). Modernūs procesoriai turi papildomus sluoksnius: instrukcijų eilės (queues), pipelinus, išankstinį vykdymą (out-of-order execution), spėjamąjį šuolių atlikimą (branch prediction) ir duomenų talpyklas (caches). Šie mechanizmai gerina pralaidumą, bet kartu introduce instrukcijų lygių priklausomybių ir užrakinimų (hazardų) problematiką.

Praktiniai pavyzdžiai

Paprastas pavyzdys asamblėjaus formatu: ADD R1, R2 — pridėti registro R2 reikšmę prie registro R1. Mašininiu kodu tai bus opkodas, po kurio seka operandų laukai. Sudėtingesnėje architektūroje ta pati aukšto lygio operacija galėtų reikšti kelias mikrokodo instrukcijas arba kelias VLIW polinius operacijas.

Išvados

Instrukcija yra ISA kertinis elementas, apibrėžiantis, kaip programinė įranga gali valdyti aparatinę įrangą. Instrukcijų ilgis, formatas ir galimi operandų adresavimo režimai glaudžiai susiję su procesoriaus mikroarchitektūra ir daro didelę įtaką tinkamiems kompiliavimo ir optimizavimo sprendimams.