Se você der uma olhada no conjunto de instruções de um processador, existem várias maneiras de agrupá-los. Por exemplo, todas as ADD
instruções podem ser agrupadas e todas as XOR
instruções.
Dentro de cada grupo da mesma instrução, pode haver versões que operam na memória ou nos registradores. É esse subgrupo que define efetivamente o número de registros que o processador possui.
Como um exemplo hipotético de 8 bits, digamos que as $Ax
instruções possam ser as ADD
instruções e $Cx
possam ser as XOR
instruções. Com esse design, restam apenas quatro bits para definir os operandos!
- Um pode ter apenas quatro registradores de uso geral e usar dois bits para definir um e dois bits para definir o outro.
- Ou, pode-se usar o primeiro bit para distinguir variantes "especiais" e os outros 3 bits para definir qual dos oito registradores deve operar com o acumulador (
$x0
pode ser o próprio acumulador).
- Ou, pode-se ter mais do que esse número de registros - mas depois limitar quais registros são acessíveis a quais instruções.
Obviamente, passamos pelos conjuntos de instruções de 8 bits. Mas, ainda assim, essa lógica ajudou a definir conjuntos de registros no passado - continuará a fazê-lo no futuro.
EDITAR (conforme solicitado)
Dizem os quatro primeiros bits são para a instrução: ADD
, SUB
, XOR
, MOV
, CMP
etc. Há 16 possibilidades aqui. Então, para as instruções em que o registro para registro faz sentido (por exemplo ADD Rx,Ry
), você precisa especificar Rx
e Ry
. Digamos que os próximos dois bits sejam para x
, e os dois últimos sejam para y
. Portanto:
ADD R1, R2 => 'ADD' + 'R1' + 'R2' => $A0 + $04 + $02
Com apenas dois bits para definir um registro como este, você só tem espaço para um total de quatro registros!
Como um aparte, você notará que algumas combinações de registradores não fazem sentido. Por exemplo, MOV Rx, Rx
(não faz nada) e SUB Rx, Rx
(sempre produz 0
). Estas podem se tornar instruções de casos especiais:
SUB Rx, Rx
poderia se tornar NOT Rx
- uma instrução de um único operando.
MOV Rx, Rx
pode se tornar uma MOV
instrução que leva um segundo byte como um valor imediato, interpretado como MOV Rx, #$yy
.
Dessa forma, você pode "brincar" com o mapa de instruções, preenchendo os buracos para obter instruções inúteis ou sem sentido para fornecer um conjunto maior de instruções para o programador. Mas, finalmente, o conjunto de instruções define o conjunto de registradores.