Jeśli spojrzysz na zestaw instrukcji procesora, istnieje wiele sposobów ich grupowania. Na przykład wszystkie ADD
instrukcje mogą być zgrupowane razem i wszystkie XOR
instrukcje.
W każdej grupie tej samej instrukcji mogą istnieć wersje działające na pamięci lub rejestrach. To ta podgrupa skutecznie określa liczbę rejestrów posiadanych przez procesor.
Jako 8-bitowy hipotetyczny przykład, powiedzmy, że $Ax
instrukcje mogą być ADD
instrukcjami i $Cx
mogą być XOR
instrukcjami. Dzięki takiemu projektowi pozostały tylko cztery bity do zdefiniowania argumentów!
- Jeden może mieć tylko cztery rejestry ogólnego przeznaczenia i użyć dwóch bitów do zdefiniowania jednego, a dwóch bitów do zdefiniowania drugiego.
- Lub można użyć pierwszego bitu do rozróżnienia wariantów „specjalnych”, a pozostałych 3 bitów do zdefiniowania, który z ośmiu rejestrów ma współpracować z akumulatorem (
$x0
może to być sam akumulator).
- Lub można mieć więcej niż tę liczbę rejestrów - ale wtedy ogranicz, które rejestry są dostępne dla których instrukcji.
Oczywiście minęliśmy 8-bitowe zestawy instrukcji. Mimo to ta logika pomogła zdefiniować zestawy rejestrów w przeszłości - będzie to nadal robić w przyszłości.
EDYCJA (zgodnie z żądaniem)
Powiedzieć szczyt cztery bity są do dyspozycji: ADD
, SUB
, XOR
, MOV
, CMP
itd. Istnieje 16 możliwości tutaj. Następnie, w przypadku instrukcji, w których rejestrowanie do rejestru ma sens (np. ADD Rx,Ry
), Musisz określić Rx
i Ry
. Powiedzmy, że następne dwa bity są za x
, a dwa ostatnie są za y
. A zatem:
ADD R1, R2 => 'ADD' + 'R1' + 'R2' => $A0 + $04 + $02
Mając tylko dwa bity do zdefiniowania takiego rejestru, masz miejsce tylko na cztery rejestry!
Nawiasem mówiąc, zauważysz, że niektóre kombinacje rejestrów nie mają sensu. Na przykład MOV Rx, Rx
(nic nie robi) i SUB Rx, Rx
(zawsze produkuje 0
). Mogą to być instrukcje specjalne:
SUB Rx, Rx
może stać NOT Rx
się instrukcją pojedynczego operandu.
MOV Rx, Rx
może stać się MOV
instrukcją, która przyjmuje drugi bajt jako wartość natychmiastową, interpretowaną jako MOV Rx, #$yy
.
W ten sposób możesz „bawić się” mapą instrukcji, wypełniając dziury dla instrukcji, które w innym przypadku byłyby bezużyteczne lub nienazwalne, aby zapewnić programistowi większy zestaw instrukcji. Ale ostatecznie zestaw instrukcji definiuje zestaw rejestrów.