Arvutiteaduses on käsk üks protsessori operatsioon, mis on määratletud protsessori käsukirjakomplektiga.

Käskude suurus või pikkus on väga erinev, ulatudes nii väikesest 4-bitist mõnes mikrokontrolleris kuni mitmekordse baidini mõnes väga pika käsusõnaga (VLIW) süsteemis. Enamiku kaasaegsete personaalarvutites, suurarvutites ja superarvutites kasutatavate protsessorite käskude suurus jääb vahemikku 16–64 bitti. Mõnes arhitektuuris, eriti vähendatud käsureaarvutites, on käsud fikseeritud pikkusega, mis tavaliselt vastab selle arhitektuuri sõnasuurusele.

Käskude formaadid ja pikkuste praktika

Käsk võib olla kodeeritud erineval viisil:

  • Fikseeritud pikkus — iga käsku väljendatakse üksikasjalikult sama arvu bittidega (näiteks klassikalised RISC-arhitektuurid nagu MIPS või SPARC kasutavad tavaliselt 32-bitiseid käsusõnu). Fikseeritud pikkus lihtsustab dekodeerimist ja torustiku (pipeline) disaini.
  • Muutuv pikkus — käskude pikkused võivad erineda (näiteks x86-64 arhitektuuris on käsk pikkus kuni 15 baiti). Muutuv pikkus võimaldab tihedamat kodeerimist ja rohkem erinevaid adresseerimisvõimalusi, kuid muudab dekodeerimise keerulisemaks.
  • VLIW ja mikrokood — VLIW-arhitektuurides koosnevad käsud väga pikkadest sõnadest, mis määravad samaaegselt mitu operatsiooni ja nende operandid. Mõned protsessorid kasutavad seesmist mikrokoodi, kus kõrgetasemeline käsk tõlgitakse mitmeks väiksemaks mikrooperatsiooniks.

Operatsioonikood, operaandid ja adresseerimine

Traditsioonilistel arhitektuuridel sisaldab käsk operatsioonikoodi, mis määrab sooritatava operatsiooni, näiteks "lisa mälu sisu registrisse", ja nulli või rohkem operandi spetsifikaatorit, mis võivad määrata registrid, mälukohad või literaalandmed. Operandi spetsifikaatoritel võivad olla adresseerimisrežiimid, mis määravad nende tähenduse, või need võivad olla fikseeritud väljadel.

Levinumad adresseerimisviisid (näited):

  • Register — operand on registri number.
  • Immediaatne (literal) — operandiks on käsklasendis olev konstant.
  • Otsene (direct) — käsk sisaldab mäluaadressi.
  • Kaudne (indirect) — käsk viitab registrile, mille sisu on kasutatav mäluaadressina.
  • Indekseeritud/displacement — kombinatsioon registrist ja nihkest (kasulik massiivide indekseerimiseks).

Käskude genereerimine ja esitlus

Käskude määratakse harva masinkoodi kujul; need võivad olla määratud programmeerijate poolt assemblerikeele abil või sagedamini võivad neid genereerida kompilaatorid. Assembleri tekstis olevad sümboolsed käsud vastavad tavaliselt kindlatele masinkoodi kuvadele, kuid kompilaator võib genereerida mitut erinevat masinkoodivormi sõltuvalt optimeerimistest.

Käskude esituses tulevad mängu mitmed täiendavad detailid:

  • Prefiksid ja laiendid — mõnes arhitektuuris (nt x86) kasutatakse käsu alguses prefikseid, mis muudavad opsiooni käitumist või laiendavad aadressi/operandi välja suurust.
  • Endianne — mälu- ja registeri baitide järjekord (big- või little-endian) mõjutab, kuidas mitmebaidilisi silvereid tõlgitakse.
  • Aadressi joondamine — mõned arhitektuurid nõuavad, et mitmebaitilisi andmeid loetakse joondatult; vale joondamine võib põhjustada jõudluse languse või erandi.

VLIW ja samaaegsed operatsioonid

VLIW-arhitektuurides, mille hulka kuuluvad paljud mikrokoodiarhitektuurid, on ühes käsus määratud mitu samaaegset operatsiooni ja operandit. Selline lähenemine eeldab, et kompilaator või programmeerija suudab avastada ja schedule’ida sõltumatud operatsioonid samasse käsusõnasse, et kasutada protsessori paralleelsust maksimaalselt.

Mõju jõudlusele ja riistvara disainile

Käskude formaadil ja adresseerimismeetodil on suur mõju protsessori disainile, jõudlusele ja keerukusele:

  • Fikseeritud pikkusega käsud lihtsustavad paralleelset dekodeerimist ja kõrgeteks kellakiirusteks optimeerimist.
  • Muutuva pikkusega käsud ja rikkalikud adresseerimisvõimalused annavad kompilaatorile ja programmeerijale suurema väljendusrikkuse, kuid suurendavad dekodeerija keerukust.
  • Käsud, mida suunatakse mikrokoodile või lahti muudetakse mikrooperatsioonideks, võimaldavad keerukaid käitumisi ilma palju riistvara lisamata, kuid võivad mõjutada latentsust.
  • Käsusõnade tihedus (code density) mõjutab vahemälu- ja mälukasutuse efektiivsust ning seega programmide jõudlust.

Üldisem tähendus

On olemas veel üks üldisem määratlus "käsu" kohta, mis ei ole seotud ainult protsessori käsukirjakomplektiga, mis on järgmine: "Käsk" võib olla mis tahes täidetava arvutiprogrammi elemendi kujutis — see hõlmab nii madala taseme masinkäske kui ka kõrgema taseme täidetavaid ülikomponente (näiteks vahetuslikult interpreteeritava keele instruktsioonid või virtuaalse masina juhised).

Kokkuvõte

Käsk on protsessori põhiline tegevuseühik, mis koosneb operatsioonikoodist ja võimalikest operanditest. Käskude pikkus, formaadid ja adresseerimisvõimalused varieeruvad suuresti sõltuvalt arhitektuurist ning mõjutavad otseselt protsessori keerukust, dekodeerimist, jõudlust ja kompilaatori tööd. Mõistmine, kuidas käsud on kodeeritud ja kuidas nendega ümber käiakse, on oluline nii riistvara- kui tarkvaraarenduses.