Protsessori käsk (arvutiteadus): määratlus, pikkused ja aadresseerimine
Süvaülevaade protsessori käskudest: määratlus, käsupikkused (4–64+ bitti), adresseerimisrežiimid ja VLIW-erinevused — tehniline juhend õpilastele ja arendajatele.
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.
Seotud leheküljed
Küsimused ja vastused
K: Mis on informaatikaõpetus?
V: Instruktsioon on arvutiteaduses protsessori üksikoperatsioon, mis on määratletud protsessori käsukirjakomplektiga.
K: Kui pikad võivad olla instruktsioonid?
V: Instruktsiooni suurus või pikkus varieerub suuresti, alates 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 (RISC), on käsud fikseeritud pikkusega, mis tavaliselt vastab selle arhitektuuri sõnasuurusele.
K: Mida käsk sisaldab?
V: Käsk sisaldab op-koodi, mis määrab teostatava 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. VLIW-arhitektuurides määratakse ühes käsus mitu üheaegset operatsiooni ja operandi.
K: Kuidas käske tavaliselt täpsustatakse?
V: Harva määratletakse käske masinkoodi kujul; neid võivad programmeerijad määrata assemblerikeelega või sagedamini genereerida kompilaatoritega.
K: Kas "käsu" jaoks on olemas veel üks määratlus?
V: Jah, "käsu" kohta on olemas veel üks üldisem määratlus, mis ei ole seotud ainult protsessori käsukirjakogumiga, mis on mis tahes esitus täidetava arvutiprogrammi elemendi kohta.
K: Kas kõik käsud on ühesuurused?
V: Ei, käskude suurus või pikkus varieerub suuresti sõltuvalt kasutatava protsessori tüübist, ulatudes 4 bitist kuni mitme baidini VLIW-süsteemide puhul, kusjuures enamiku kaasaegsete protsessorite suurus jääb vahemikku 16-64 bitti, samas kui RISC-arhitektuuridel on tavaliselt kindla pikkusega käsud, mis vastavad selle arhitektuuri sõnasuurusele.