Wenn Sie sich den Befehlssatz eines Prozessors ansehen, gibt es verschiedene Möglichkeiten, diese zu gruppieren. Beispielsweise können alle ADD
Anweisungen und alle XOR
Anweisungen zu einer Gruppe zusammengefasst werden .
Innerhalb jeder Gruppe desselben Befehls kann es Versionen geben, die im Speicher oder in Registern arbeiten. Diese Untergruppierung definiert effektiv die Anzahl der Register, über die der Prozessor verfügt.
Nehmen wir als hypothetisches 8-Bit-Beispiel an, dass die $Ax
Anweisungen die ADD
Anweisungen und $Cx
möglicherweise die XOR
Anweisungen sind. Bei diesem Entwurf sind nur noch vier Bits zum Definieren der Operanden verfügbar!
- Man kann nur vier Allzweckregister haben und zwei Bits verwenden, um eines zu definieren, und zwei Bits, um das andere zu definieren.
- Oder man kann das erste Bit verwenden, um "spezielle" Varianten zu unterscheiden, und die anderen 3 Bits, um zu definieren, welche der acht Register mit dem Akkumulator arbeiten sollen (
$x0
könnte der Akkumulator selbst sein).
- Oder man könnte mehr als diese Anzahl von Registern haben - aber dann begrenzen, welche Register für welche Befehle zugänglich sind.
Natürlich sind wir hinter 8-Bit-Befehlssätzen. Diese Logik hat jedoch in der Vergangenheit bei der Definition von Registersätzen geholfen - und wird dies auch in Zukunft tun.
EDIT (wie gewünscht)
Sagen Sie den oberen vier Bits für den Befehl sind: ADD
, SUB
, XOR
, MOV
, CMP
etc. Es gibt 16 Möglichkeiten. Dann wird für diese Befehle in dem Register-zu-Register ist sinnvoll (zB ADD Rx,Ry
), müssen Sie angeben , Rx
und Ry
. Sagen wir, die nächsten beiden Bits sind für x
und die letzten beiden sind für y
. Somit:
ADD R1, R2 => 'ADD' + 'R1' + 'R2' => $A0 + $04 + $02
Mit nur zwei Bits, um ein solches Register zu definieren, haben Sie nur Platz für insgesamt vier Register!
Im Übrigen werden Sie feststellen, dass einige Registerkombinationen keinen Sinn ergeben. Zum Beispiel MOV Rx, Rx
(macht nichts) und SUB Rx, Rx
(produziert immer 0
). Dies können spezielle Anweisungen sein:
SUB Rx, Rx
werden könnte NOT Rx
- eine Einzeloperandenanweisung.
MOV Rx, Rx
könnte zu einer MOV
Anweisung werden, die ein zweites Byte als unmittelbaren Wert annimmt und als interpretiert wird MOV Rx, #$yy
.
Auf diese Weise können Sie mit der Anweisungsübersicht "spielen" und die Löcher für ansonsten nutzlose oder unsinnige Anweisungen ausfüllen, um einen größeren Anweisungssatz für den Programmierer bereitzustellen. Letztendlich definiert der Befehlssatz den Registersatz.