Instruksjonssett

Et **instruksjonssett** er en liste over alle instruksjoner, og deres varianter, som en prosessor eller virtuell maskin kan utføre. Det er dermed en viktig del av en datamaskinarkitektur siden den angir blant annet hvilke datatyper som kan benyttes, hvilke operasjoner prosessoren kan utføre, hvordan dataminnet brukes og hvordan I/O forgår.

Instruksjonssettet er mer eller mindre uavhengig av mikroarkitekturen den utførende prosessoren er bygd etter, selv om de legger visse føring for hverandre. For eksempel implementerer Intels og AMDs konkurrerende x86-prosessorer stort sett det samme instruksjonssettet, men er bygd opp forskjellig. Tilsvarende er også en Pentium radikalt forskjellig fra en 8086, selv om førstnevnte implementerer sistnevntes instruksjonssett.

## Design
De andre delene av datamaskinarkitekturen påvirker designet av et nytt instruksjonssett. Før i tiden var minne dyrt og det var derfor viktig at programmene kunne være så små som mulig. Dette kan oppnås ved å ha variabel lengde på instruksjonene, hvor ofte brukte instruksjoner er korte, mens de mindre brukte og mer spesialiserte blir kodet med et lengre format. I tillegg vil det være en fordel å slå sammen flere relaterte operasjoner til én instruksjon. Et typisk eksempel vil være å la én instruksjon lese data fra minnet, utføre en operasjon på dataene og så skrive dem tilbake, fremfor å måtte bruke én instruksjon for hver av disse tre operasjonene. Datamaskiner med slike instruksjonssett kalles CISC (*complex instruction set computer*, som betyr datamaskin med komplekst instruksjonssett). Mange og omfattende instruksjoner betyr flere logiske kretser, som igjen betyr større, dyrere og mer kompliserte prosessorer.

Det motsatte av CISC er RISC (*reduced instruction set computer*, som betyr datamaskin med redusert instruksjonssett). Her legger man i stedet vekt på ha et enkelt instruksjonssett bestående kun av de mest grunnleggende instruksjonene. Programmereren eller kompilatoren kan så kombinerer disse enkle instruksjonene for å utføre mer kompliserte oppgaver. Færre og enklere instruksjoner betyr at man trenger færre kretser for å implementere det i maskinvaren, som igjen betyr et enklere prosessordesign, billigere produksjon og mulighet for høyere hastighet. Et fast instruksjonsformat hvor alle instruksjoner er like lange vil også hjelpe.

Et instruksjonssett trenger ikke være rent CISC eller rent RISC, men kan ligge et sted i mellom. Det kan være aktuelt å definere noen instruksjoner som utfører kompliserte oppgaver i et instruksjonssett som ellers følger RISC-tankegangen. Dette vil da være instruksjoner som står for ofte utførte operasjoner, hvor kostnadene av den ekstra kompleksiteten i designet oppveies av hastighetsøkningen man får ved å utføre operasjonene i maskinvare framfor i programvare. Nyere x86-prosessorer (typisk Pentium og utover) implementerer også et CISC-instruksjonssett ved å konvertere instruksjonene til RISC-lignende mikrooperasjoner som så utføres av prosessorkjernen.

Bruksområdet avgjør også i stor grad hvordan instruksjonssettet er. En generell prosessor som masseproduseres for mange formål vil ha instruksjoner som kan benyttes til mange formål. Instruksjonsett for GPUer vil derimot ha instruksjoner for å knuse grafikkrelatert matematikk og hente data som angir geometriens form og utseende, mens digitale signalprosessorer har instruksjonssettet rettet mot sine oppgaver.

Uansett vil det være viktig at man tenker gjennom hvilke instruksjoner et instruksjonssett skal inneholde. For hver instruksjon man inkluderer må man legge til flere logiske kretser i prosessoren, noe som koster tid og penger både å designe og produsere. Hvis man inkluderer en instruksjon det ikke er behov for, vil man ha sløst bort ressurser. Dette kan ha konsekvenser i lang tid framover ettersom man ikke bare kan fjerne en instruksjon fra et instruksjonssett da dette vil føre til at de programmene som bruker denne instruksjonen slutter å virke.

## Liste over instruksjonssett
Denne listen er ikke utfyllende ettersom gamle arkitekturer blir kassert og nye blir funnet opp hele tiden.

### Instruksjonssett implementert i maskinvare
* Alpha
* ARM
* IA-64 (Itanium)
* MIPS
* Motorola 68k
* PA-RISC
* IBM 700/7000
** System/360
** System/370
** System/390
** z/Architecture
* Power-arkitekturen
** IBM POWER
** PowerPC
* PDP-11
** VAX
* SPARC
* SuperH
* Tricore
* Transputer
* UNIVAC 1100/2200
* x86
** IA-32
*** x86-64

### Instruksjonssett vanligvis implementert i programvare
* Microsoft P-Code
* Java VM
* FORTH

### Instruksjonssett aldri implementert i maskinvare
* ALGOL object code
* SECD
* MMIX
* Z-machine

## Eksterne lenker
*