# Orthogonale instructieset

Een orthogonale instructieset is een instructieset van een processor waarin elke instructie elke soort gegevens kan gebruiken via elke adresseermodus. Er is in een zuiver orthogonale instructieset dus geen correlatie tussen de instructies en de gegevenstypen/adresseermodi. In een dergelijke instructieset kunnen onder andere alle registers op gelijke wijze in een bepaalde instructie gebruikt worden. Er zijn geen aparte adres- en gegevensregisters met verschillende mogelijkheden: alle registers zijn gelijk.

## Voor- en nadelen

Orthogonaliteit biedt maximale flexibiliteit en biedt de grootste eenvoud, wat voordelen heeft voor de programmeerbaarheid. Men heeft het beperkte aantal instructies, de diverse addresseermodi en kan ze vrijelijk combineren. In een niet-orthogonale instructieset is dit niet het geval maar moet men specifieke instructies met specifieke addresseermogelijkheden in beschouwing nemen, terwijl andere combinaties niet mogelijk zijn. In het meest extreme, irreguliere geval moet men voor elke combinatie weten of ze mogelijk is of niet, een combinatorische explosie.
Het nadeel komt voort uit de expliciete weergave per instructie van alle mogelijke instructies en tevens alle mogelijke addresseermodi. Dit leidt tot een lage bitdichtheid per instructie, door het ontbreken van mogelijkheden tot compactie. Afhankelijk van het gebruik en de juiste optimalisaties, zijn niet-orthogonale instructiesets daardoor potentieel efficiënter. Dit kan zich uiten in minder geheugengebruik, minder informatieverkeer, minder energieverbruik, minder chipoppervlakte en hogere snelheden.

## Zilog Z-80

Een voorbeeld van een processor met een niet-orthogonale instructieset is de 8-bits microprocessor Zilog Z-80. De niet-orthogonaliteit uit zich onder andere door de aanwezigheid van speciale instructies gekoppeld aan specifieke registers of registerparen. In de eerste plaats is er het A-register waar bewerkingen zoals 8-bits optellingen en dergelijke op werken. Deze bewerkingen kunnen niet of beperkter met andere registers of in het geheugen. Verder kent de instructieset bijvoorbeeld de instructie DJNZ - "Decrement and Jump if Not Zero". Deze instructie die men gebruikt om efficiënt iteratielussen te implementeren, werkt uitsluitend op het B-register, maar niet op andere registers of op waarden in het geheugen. De processor kent ook speciale IN- en OUT-instructies voor het lezen van en schrijven naar communicatiepoorten, terwijl bij gebruik van andere bronnen of bestemmingen men de LD-instructie gebruikt.

## DEC PDP-11 en VAX

Als schoolvoorbeeld van een orthogonale instructieset noemt men veelal die van de DEC PDP-11. De instructieset is inderdaad orthogonaal, op de vlottende-kommabewerkingen na.
Elke operand kan men gebruiken met 8 adresseermodi op gelijke wijze met alle 8 registers. Er zijn geen aparte adres- en gegevensregisters. De processor kent de move-instructie in plaats van aparte load- en store-instructies. Met deze move instructie kan men gegevens van elk type bronoperand naar elk type van beschrijfbare doeloperand overbrengen, zowel registers als geheugen. Ook voor het lezen van en schrijven naar communicatiepoorten kan men dezelfde move-instructie gebruiken, waarbij eventueel zelfs beide operanden naar communicatiepoorten kunnen verwijzen. Ook complexere instructies kunnen zowel geheugen, registers, als communicatiepoorten als bron- en doeloperanden hebben.
De 32-bits opvolgers van de PDP-lijn, de VAX-computers, kennen een volledig orthogonale instructieset, daar hier ook de vlottende-kommabewerkingen meegenomen zijn. Het algemene formaat van een VAX-11 instructie is: opcode [ operand ] [ operand ] ... Ieder element heeft de grootte van één byte. De opcode is een waarde tussen 0-255. Iedere operand bestaat uit twee nibbles, waarbij de bovenste nibble een adresseermodus weergeeft en de onderste nibble meestal een van de 16 registers aanduidt.

## Motorola 68000

Aangezien orthogonaliteit een aantal voordelen heeft, maar ook nadelen naar efficiëntie, hetgeen blijkt uit statistieken van gebruik van instructies, heeft men veelal gezocht naar een bruikbaar compromis. Een voorbeeld hiervan vindt men bij de door de PDP-11 geïnspireerde Motorola 68000-reeks van microprocessoren en -controllers. De instructieset is grotendeels orthogonaal, maar kent een aantal bijstellingen. Omwille van de efficiëntie is er bij de 68000-reeks namelijk wel een onderscheid gemaakt tussen adres- en gegevensregisters: de processor kent 8 dataregisters: D0-D7 en 8 adresregisters: A0-A7.

## RISC

Bij RISC-architecturen doet men typisch doelbewuste concessies aan de orthogonaliteit teneinde de efficiëntie te verbeteren. Men categoriseert instructies en koppelt aan elke instructiecategorie adresseringsmogelijkheden in functie van de behoeften voor die categorie. Een eerste categorie wordt gevormd door de instructies die gegevens tussen registers en het hoofdgeheugen verplaatsen. Deze instructies behoeven de meest uitgebreide adresseermodi. De andere instructies hebben meer beperkte adresseermodi. Aparte categorieën zijn de categorie van instructies voor gegevensverwerking, zoals optelinstructies en de categorie van instructies voor programmabesturing, zoals sprong-instructies. Binnen de categorieën past men dan juist wel weer orthogonaliteit toe, in combinatie met een typisch grote hoeveelheid registers met gelijke mogelijkheden.