Необходимы ли двухбайтовые инструкции для 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]
».