# Instructieset

Een instructieset is de verzameling van alle mogelijke machinecodes die een processor kan verwerken. De instructies worden als binaire codes in het geheugen gezet, het programmeren zelf gebeurt in assembleertalen of (meestal) hogere programmeertalen.
De meeste moderne processors hebben een zeer uitgebreide instructieset, waarbij een enkele instructie meerdere functies kan uitvoeren. Bijvoorbeeld: "haal de waarde op die op de geheugenplaats staat die door register X wordt aangewezen, tel deze op bij de waarde in het werkregister en laat register X naar de volgende geheugenplaats wijzen".
Iedere processorfamilie heeft over het algemeen een eigen instructieset die niet uitwisselbaar is met die van andere. Dit betekent dat programma's die voor een bepaald processortype gemaakt zijn niet zonder meer op een ander type kunnen werken. Met hercompileren, emulators of crosscompilers kan dit probleem ondervangen worden.

## Orthogonaliteit

Een orthogonale instructieset biedt onafhankelijkheid tussen enerzijds instructies en anderzijds gegevenstypen en adresseermodi. Hoe orthogonaler de instructieset, hoe eenvoudiger en "zuiverder" deze is, met een aantal voordelen naar flexibiliteit en programmeerbaarheid. Echter, te ver doorgedreven orthogonaliteit kan ook leiden tot veel niet of weinig gebruikte combinaties en daarmee lage bitdichtheden en inefficiëntie op verschillende gebieden. Modernere ontwerpen trachten daarom de voordelen van orthogonaliteit te combineren met de voordelen van compactie voortvloeiend uit niet-orthogonaliteit, door het maken van welbepaalde keuzes. Zo maakt men bijvoorbeeld bij RISC-instructiesets onderscheid tussen instructies die primair gegevens van en naar het hoofdgeheugen verplaatsen, gegevensbewerkingsinstructies en besturingsinstructies, versus de adresseringsmodi welke elke categorie ter beschikking heeft.

## Implementatie
### x86-instructieset

De wellicht bekendste instructieset is de x86-instructieset die gebruikt wordt voor de Intel 8086/8088-processor en (met uitbreidingen) in latere versies daarvan. Minder bekend, maar waarschijnlijk het meest gebruikt, is de ARM-instructieset. Men vindt ARM processors in zeer uiteenlopende soorten apparatuur, van mobiele telefoons en PDA's tot printers of harde schijven.

### RISC en CISC

Bij het ontwerpen van een processor en bijbehorende instructieset worden in het algemeen twee verschillende strategieën gevolgd:
* Ofwel beperkt men het aantal verschillende typen instructies en bouwt een processor die deze eenvoudige instructies zo efficiënt en snel mogelijk uit kan voeren. Door het combineren van meerdere van deze simpele instructies kunnen meer complexe taken worden uitgevoerd. Deze strategie noemt men Reduced instruction set computer (RISC).
* Ofwel ontwerpt men afzonderlijke instructies voor zo veel mogelijk denkbare taken en bouwt een processor die met een enkele instructie al een behoorlijk complexe taak kan uitvoeren. Deze strategie noemt men Complex instruction set computer (CISC).

## Instructies

Een instructieset specificeert verschillende soorten instructies die vaak volgende argumenten bevatten:
* Eén of meerdere registers
* Een adres in het geheugen
* Constanten (vaak in hexadecimale vorm)

### Bewerkingen

De meeste processors bieden instructies voor de volgende functies:

#### Ophalen en wegschrijven van data

* Een register op een constante waarde zetten.
* De waarde van een gegeven geheugenadres ophalen naar een register. Ook omgekeerd de waarde van een register naar het geheugen wegschrijven.
* Data uitlezen van of schrijven naar hardware-onderdelen.

#### Rekenkundige en logische bewerkingen

* Optellen, aftrekken, vermenigvuldigen en delen van twee registers. De uitkomst wordt in een register geplaatst, al dan niet met enkele aanpassingen van andere registers (die bijvoorbeeld overflow zullen aanduiden).
* Logische bewerkingen, zoals de of-, en-, en niet-bewerkingen.
* Twee registers in waarde vergelijken.

#### Control flow-bewerkingen

* Sprongfuncties. Hierbij onderscheidt men 2 categorieën: onvoorwaardelijke sprongen (die altijd genomen worden) en voorwaardelijke sprongen (die enkel op een bepaalde voorwaarde genomen worden).
* Calls naar een functie. De processor keert terug bij de overeenkomstige return-instructie.

#### Andere

* Afhandelen van interrupts
* NOP (doe niets)

### Instructielengte

De instructielengte hangt af van de gebruikte woordlengte in de processor. Voorbeelden zijn 16-bit, 32-bit of 64-bit processoren. Een instructieset kan zowel een vaste instructielengte (bijv. elke instructie bestaat uit 32-bit) als een variabele lengte hebben (bijv. de x86-architectuur, die tot 120 bits kan gaan). Instructies met vaste-lengte zijn meestal gemakkelijker af te handelen (zo zal een instructie niet over twee verschillende cacheblokken liggen). Variabele-lengte instructies bieden echter het voordeel dat er eindeloos nieuwe instructies kunnen geïntroduceerd worden.

### Voorstelling

Machinecode wordt meestal in assembleertaal voorgesteld i.p.v. de binaire vorm, om het geheel leesbaar te houden voor programmeurs. Heel vaak kan de compiler deze genereren.