Si vous regardez le jeu d'instructions d'un processeur, il existe plusieurs façons de les regrouper. Par exemple, toutes les ADD
instructions peuvent être regroupées et toutes les XOR
instructions.
Dans chaque groupe de la même instruction, il peut y avoir des versions qui fonctionnent sur la mémoire ou sur les registres. C'est ce sous-groupe qui définit efficacement le nombre de registres du processeur.
À titre d'exemple hypothétique sur 8 bits, disons que les $Ax
instructions peuvent être des ADD
instructions et $Cx
peuvent être des XOR
instructions. Avec cette conception, il ne reste que quatre bits pour définir les opérandes!
- On peut n'avoir que quatre registres à usage général et utiliser deux bits pour définir l'un et deux bits pour définir l'autre.
- Ou bien, on pourrait utiliser le premier bit pour distinguer les variantes "spéciales", et les 3 autres bits pour définir lequel des huit registres fonctionner avec l'accumulateur (
$x0
pourrait être l'accumulateur lui-même).
- Ou, on pourrait avoir plus que ce nombre de registres - mais alors limiter quels registres sont accessibles à quelles instructions.
Bien sûr, nous avons dépassé les jeux d'instructions 8 bits. Mais encore, cette logique a aidé à définir des ensembles de registres dans le passé - elle continuera de le faire à l'avenir.
MODIFIER (comme demandé)
Dites le haut quatre bits sont pour l'instruction: ADD
, SUB
, XOR
, MOV
, CMP
etc. Il y a 16 possibilités ici. Ensuite, pour les instructions où le registre à registre est logique (par exemple ADD Rx,Ry
), vous devez spécifier Rx
et Ry
. Disons que les deux bits suivants sont pour x
et que les deux derniers sont pour y
. Donc:
ADD R1, R2 => 'ADD' + 'R1' + 'R2' => $A0 + $04 + $02
Avec seulement deux bits pour définir un registre comme celui-ci, vous n'avez que de la place pour un total de quatre registres!
En passant, vous remarquerez que certaines combinaisons de registres n'ont pas de sens. Par exemple, MOV Rx, Rx
(ne fait rien) et SUB Rx, Rx
(produit toujours 0
). Celles-ci pourraient devenir des instructions spéciales:
SUB Rx, Rx
pourrait devenir NOT Rx
- une instruction à un seul opérande.
MOV Rx, Rx
pourrait devenir une MOV
instruction qui prend un deuxième octet comme valeur immédiate, interprétée comme MOV Rx, #$yy
.
De cette façon, vous pouvez "jouer" avec la carte d'instructions, en remplissant les trous pour des instructions autrement inutiles ou absurdes pour fournir un ensemble d'instructions plus large au programmeur. Mais finalement, l'ensemble d'instructions définit l'ensemble de registres.