Нужны ли двухбайтовые инструкции для 8-битной архитектуры набора команд? - PullRequest
1 голос
/ 15 октября 2019

Я работаю над проектированием и реализацией простого 8-битного компьютера. Я намерен иметь 8-битную шину данных, 8-битную адресную шину и 8-битные инструкции. Я намереваюсь иметь архитектуру загрузки в стиле RISC. Я работаю над созданием набора инструкций и пытаюсь определить, возможно ли иметь исключительно 8-битные инструкции (то есть, нет многобайтовых инструкций).

Если инструкция 8-битная, некоторые изэти битовые поля будут заняты кодом операции, а остальные могут быть заняты представлением данных для работы. Например, рассмотрим инструкцию load immediate, которая берет адрес и загружает содержимое памяти по этому адресу в определенный регистр в CPU. Поскольку код операции для инструкции немедленной загрузки будет занимать пару битов, в инструкции нет места для полного 8-битного адреса. Например, если код операции для этой инструкции равен «11» в двоичном виде, для загрузки адреса остается только 6 битов.

Мне кажется, что единственная возможность - это расширить инструкции типа immediate до двухбайты, где первый содержит код операции, а второй содержит непосредственное значение. Есть ли другой способ сделать это? Возможно, есть другие методы?

1 Ответ

2 голосов
/ 15 октября 2019

Необходимы ли двухбайтовые инструкции для 8-битной архитектуры набора команд?

Нет, двухбайтовые инструкции не являются строго необходимыми. Однако без 2-байтовых инструкций вам потребуется гораздо больше инструкций для выполнения той же работы.

Например, если вы не можете выполнить "mov r1,0x9F" (загрузить 8-битное значение в r1) поскольку для этого требуется код операции плюс 8-битное непосредственное значение, вы можете обойти его, объединив несколько меньших непосредственных значений вместе с такой последовательностью, как:

mov r1,0x9     ;4-bit opcode, 4-bit immediate, r1 = 0x09
shl r1,4       ;4-bit opcode, 4-bit immediate, r1 = 0x90
or r1,0x0F     ;4-bit opcode, 4-bit immediate; r1 = 0x9F

Конечно, это ужасно (в 3 разамного инструкций и увеличение размера кода на 50% по сравнению с 2-байтовыми инструкциями).

Есть и другой способ обойти эту проблему.

Один из вариантов - это «немедленная загрузка исдвиньте влево на 4 "в одну инструкцию или используйте команды" загрузить старшие биты с немедленными "и" загрузить младшие биты с немедленными ", поэтому приведенный выше пример может выглядеть следующим образом:

load_high_bits r1,0x9     ;4-bit opcode, 4-bit immediate, r1 = 0x09
load_low_bits r1,0x0F     ;4-bit opcode, 4-bit immediate; r1 = 0x9F

Другой альтернативой являетсяиметь постоянный пул, который может быть доступен с меньшими адресами. Например, если у вас есть инструкция «загрузить константу», которая принимает 4-битное непосредственное значение, то вы можете сохранить 16 (8-битные) константы в памяти и загрузить их с чем-то вроде load r1, [4_bit_offset]. Вы также можете использовать (подразумеваемый?) Базовый регистр, чтобы пул констант находился по любому адресу (чтобы вы могли загружать константы из адреса «8-битный базовый регистр + 4-битное смещение»), например «load r1,[r2 + 4_bit_offset]».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...