Instruksjon (datamaskin)

I datamaskiner er en **instruksjon** den grunnleggende enheten dataprogrammer er bygd opp av. En instruksjon forteller en prosessor hvilken oppgave den skal utføre og på hvilke data. En kjørbar sekvens av instruksjoner kalles maskinkode. Instruksjonene en gitt prosessor eller prosessorarkitektur kan utføre er definert i et instruksjonssett.

Enkle prosessorer bruker instruksjonene direkte til å styre den interne logikken, men mer kompliserte prosessorer, slik som Intel Pentium og senere, oversetter instruksjonene til mikrokode som igjen styrer prosessorens interne enheter.

## Typer
Instruksjoner grupperes etter hvilke operasjoner de får prosessoren til å utføre.

### Aritmetiske instruksjoner
Instruksjoner som utfører aritmetiske regneoperasjoner på heltall. Det kan også finnes andre instruksjoner som utfører en aritmetisk operasjon som en deloperasjon, men aritmetiske operasjoner er de som primært regner med tall. Hvor mange av de fire regneartene en prosessor har egne instruksjoner for varierer.

### Logiske instruksjoner
Disse har mye til felles med artimetiske operasjoner, men utfører operasjoner som konjunksjon, disjunksjon og negasjon på bitverdier.

### Flyttallsinstruksjoner
Mens vanlige aritmetiske instruksjoner opererer på heltall, opererer flyttallsinstruksjoner på flyttall. Disse vil i større grad kunne omfatte matematiske funksjoner, slik som trigonometriske funksjoner, og ikke bare de grunnleggende regneartene.

### Kontrollflytinstruksjoner
Disse instruksjonene bryter opp den sekvensielle utførelsen av instruksjoner ved å utføre hopp. Disse instruksjonene er nødvendige for å få til løkker og for å få programmet til å utføre forskjellige handlinger ut fra dataene den er gitt og annen ytre påvirkning.

### Flytteinstruksjoner
Disse instruksjonene flytter bare data fra et register til et annet. Dersom arkitekturen ikke har egne minneinstruksjoner, vil disse også kunne flytte data mellom minnet og registre.

### Minneinstruksjoner
På noen arkitekturer er det egne instruksjoner for å kommunisere med minnet og andre enheter over databussen, mens andre arkitekturer lar alle typer instruksjoner operere mot minnet. Minneinstruksjoner leser data fra minnet og plasserer det i et prosessorregister eller skriver data fra et register og til minnet.

### I/O-instruksjoner
Disse instruksjonene benyttes for å kommunisere med periferiutstyr i arkitekturer med separat I/O- og minnebuss.

### Nop
Nop-instruksjonen (*No OPeration*) er en spesiell instruksjon som, dersom det finnes, får prosessoren til å gjøre ingenting før den går videre til neste instruksjon. Andre instruksjoner vil når de blir gitt spesielle operander kunne fungere som en nop-instruksjon, men det er viktig at de ikke endrer noen data- eller statusregistre utover at programtelleren økes. Nop-instruksjoner kan brukes for å få tiden til å gå, dersom prosessoren må vente på svar fra en annen enhet, eller til å fylle minnet med harmløse kode, for eksempel for at en senere instruksjon skal ligge på en ideell plass i minnet.

### Andre spesielle instruksjoner
Det finnes også andre instruksjoner enn de som faller inn i de generelle kategoriene over. Dette kan være instruksjoner som forteller hva slags prosessor programmet kjører på, instruksjoner som endrer måten prosessoren jobber på og feilsøkingsinstruksjoner.

## Struktur
Hvordan en instruksjon er bygd opp varierer fra prosessorarkitektur til prosessorarkitektur, men de består i alle tilfeller av én eller flere felter. CISC-arkitekturer har kompliserte instruksjoner som kan utføre sammensatte operasjoner, mens RISC-arkitekturer har enklere instruksjoner som bare utfører grunnleggende operasjoner.

Størrelsen på en instruksjon kan variere både mellom prosessorer og mellom forskjellige instruksjoner på samme prosessor. RISC-prosessorer har typisk instruksjoner av samme lengde, noe som gjør henting av instruksjoner fra minnet enklere. Instruksjonsstørrelsen vil normalt være like stor som ordstørrelsen eller minnebussbredden, eller et helt antall av disse størrelsene. Instruksjoner som ikke bruker alle feltene vil derfor kaste bort litt plass på bekostning av høyere prosessorhastighet. Andre prosessorer har varierende instruksjonsstørrelse som bare tar med de feltene som trengs. Disse prosessoren sparer minneplass, men gjør at dekoding og henting av instruksjonene tar lenger tid, noe som var mer vanlig før.

### Opkode
Opkoden, eller operasjonskoden, er den viktigste delen av en instruksjon og er gjerne det første feltet. Den beskriver hvilken operasjon den aktuelle instruksjonen vil at prosessoren skal utføre, slik som addere to tall, hente data fra minnet eller utføre et hopp.

### Operander
Operandene angir dataene instruksjonen skal operere på. Dette kan være tallene som skal adderes, registeret dataene skal leses fra og hvilken minneadresse de skal skrives til, eller minneadressen det skal hoppes til. Det som angis som operander kan være registre, minneadresser, I/O-porter eller hardkodede tallverdier. Noen instruksjoner har fastsatte data de opererer på, og får bare noen eller ingen av sine operander oppgitt som en del av instruksjonen.

### Modifikatorer
Instruksjoner kan kombineres med modifikatorer som påvirker deres oppførsel. Instruksjonene i x86-arkitekturen kan for eksempel utstyres med ett eller flere prefiks som angir om instruksjonen skal repeteres, om instruksjonen skal operere på 16- eller 32-biters data, om prosessoren skal skaffe seg eksklusiv tilgang til minnet mens den utfører påfølgende instruksjon, og flere andre ting.