Se dai un'occhiata al set di istruzioni di un processore, ci sono diversi modi per raggrupparli. Ad esempio, tutte le ADD
istruzioni potrebbero essere raggruppate insieme e tutte le XOR
istruzioni.
All'interno di ciascun gruppo della stessa istruzione, potrebbero esserci versioni che funzionano in memoria o sui registri. È questo sottogruppo che definisce efficacemente il numero di registri che ha il processore.
Come esempio ipotetico a 8 bit, supponiamo che le $Ax
istruzioni possano essere le ADD
istruzioni e $Cx
potrebbero essere le XOR
istruzioni. Con questo design, sono rimasti solo quattro bit per definire gli operandi!
- Uno potrebbe avere solo quattro registri di uso generale e utilizzare due bit per definirne uno e due bit per definire l'altro.
- Oppure, si potrebbe usare il primo bit per distinguere varianti "speciali" e gli altri 3 bit per definire quale degli otto registri operare con l'accumulatore (
$x0
potrebbe essere l'accumulatore stesso).
- Oppure, si potrebbe avere più di questo numero di registri - ma quindi limitare quali registri sono accessibili a quali istruzioni.
Ovviamente, abbiamo superato i set di istruzioni a 8 bit. Tuttavia, questa logica ha contribuito a definire i set di registri in passato: continuerà a farlo in futuro.
MODIFICA (come richiesto)
Dire all'inizio quattro bit sono per l'istruzione: ADD
, SUB
, XOR
, MOV
, CMP
ecc Ci sono 16 possibilità qui. Quindi, per quelle istruzioni in cui il registro-registro ha senso (ad es. ADD Rx,Ry
), È necessario specificare Rx
e Ry
. Supponiamo che i prossimi due bit siano per x
, e gli ultimi due siano per y
. Così:
ADD R1, R2 => 'ADD' + 'R1' + 'R2' => $A0 + $04 + $02
Con solo due bit per definire un registro come questo, hai solo spazio per un totale di quattro registri!
Per inciso, noterai che alcune combinazioni di registri non hanno senso. Ad esempio, MOV Rx, Rx
(non fa nulla) e SUB Rx, Rx
(produce sempre 0
). Queste potrebbero diventare istruzioni per casi speciali:
SUB Rx, Rx
potrebbe diventare NOT Rx
- un'istruzione per singolo operando.
MOV Rx, Rx
potrebbe diventare MOV
un'istruzione che accetta un secondo byte come valore immediato, interpretato come MOV Rx, #$yy
.
In questo modo puoi "giocare" con la mappa delle istruzioni, riempiendo i fori per istruzioni altrimenti inutili o prive di senso per fornire un set di istruzioni più ampio per il programmatore. Ma alla fine, il set di istruzioni definisce il set di registri.