Se você der uma olhada no conjunto de instruções de um processador, existem várias maneiras de agrupá-los. Por exemplo, todas as ADDinstruções podem ser agrupadas e todas as XORinstruçõ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 $Axinstruções possam ser as ADDinstruções e $Cxpossam ser as XORinstruçõ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 (
$x0pode 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, CMPetc. 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 Rxe 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, Rxpoderia se tornar NOT Rx- uma instrução de um único operando.
MOV Rx, Rxpode se tornar uma MOVinstruçã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.