Если вы посмотрите на набор инструкций процессора, существует несколько способов их группировки. Например, все ADD
инструкции могут быть сгруппированы вместе, и все XOR
инструкции.
В каждой группе одной и той же инструкции могут быть версии, которые работают с памятью или с регистрами. Именно эта подгруппа эффективно определяет количество регистров, которые имеет процессор.
В качестве 8-разрядного гипотетического примера, скажем, $Ax
инструкции могут быть ADD
инструкциями, а $Cx
могут быть XOR
инструкциями. При таком дизайне осталось всего четыре бита для определения операндов!
- Можно иметь только четыре регистра общего назначения и использовать два бита для определения одного и два бита для определения другого.
- Или можно использовать первый бит, чтобы различать «особые» варианты, а остальные 3 бита, чтобы определить, какой из восьми регистров будет работать с аккумулятором (это
$x0
может быть сам аккумулятор).
- Или можно иметь больше, чем это количество регистров, но затем ограничить, какие регистры доступны для каких инструкций.
Конечно, мы прошли 8-битные наборы инструкций. Но, тем не менее, эта логика помогла определить наборы регистров в прошлом - это будет продолжаться и в будущем.
РЕДАКТИРОВАТЬ (по запросу)
Скажем , в верхней четыре бита для команды: ADD
, SUB
, XOR
, MOV
, и CMP
т.д. Есть 16 возможностей здесь. Затем, для тех инструкций, где регистрация в регистр имеет смысл (например ADD Rx,Ry
), вам нужно указать Rx
и Ry
. Скажем, следующие два бита предназначены для x
, а последние два - для y
. Таким образом:
ADD R1, R2 => 'ADD' + 'R1' + 'R2' => $A0 + $04 + $02
Имея всего два бита для определения такого регистра, у вас есть место только для четырех регистров!
Кроме того, вы заметите, что некоторые комбинации регистров не имеют смысла. Например, MOV Rx, Rx
(ничего не делает) и SUB Rx, Rx
(всегда производит 0
). Они могут стать специальными инструкциями:
SUB Rx, Rx
может стать NOT Rx
- инструкция с одним операндом.
MOV Rx, Rx
может стать MOV
инструкцией, которая принимает второй байт как непосредственное значение, интерпретируемое как MOV Rx, #$yy
.
Таким образом, вы можете «играть» с картой инструкций, заполняя отверстия для бесполезных или бессмысленных инструкций, чтобы обеспечить больший набор инструкций для программиста. Но в конечном итоге набор команд определяет набор регистров.