Se dai un'occhiata al set di istruzioni di un processore, ci sono diversi modi per raggrupparli. Ad esempio, tutte le ADDistruzioni potrebbero essere raggruppate insieme e tutte le XORistruzioni.
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 $Axistruzioni possano essere le ADDistruzioni e $Cxpotrebbero essere le XORistruzioni. 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 (
$x0potrebbe 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, CMPecc Ci sono 16 possibilità qui. Quindi, per quelle istruzioni in cui il registro-registro ha senso (ad es. ADD Rx,Ry), È necessario specificare Rxe 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, Rxpotrebbe diventare NOT Rx- un'istruzione per singolo operando.
MOV Rx, Rxpotrebbe diventare MOVun'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.