Простой ответ заключается в том, что LDI
поддерживается только для верхних 16 регистров.
Когда вы посмотрите на ISA (архитектура набора команд), вы заметите, что то же самое относится к SUBI
, SBCI
, ANDI
, ORI
и CPI
, для каждого из которых требуется 12 бит в таблице кодов операций: 8 бит для 8-битного непосредственного и 4 бита для кодирования, какой из R16 ... R31 является пункт назначения. Это означает, что для немедленного предоставления этих 6 инструкций вы уже занимаете 37,5% кодов операций.
Для поддержки R0 ... R31 потребуется 75% кода операции только для 6 инструкций: все коды операций AVR имеют 16- битовые коды операций (кроме LDS
, STS
, CALL
, JMP
, которые являются 32-битными), и вы можете кодировать только столько инструкций с помощью 16 битов
. Возьмем, к примеру, следующий 2-регистр инструкции: ADD
, ADC
, SUB
, SBC
, CP
, CPC
, AND
, OR
, EOR
, LSR
, ASR
, ROR
, MOV
. Каждая из этих 13 инструкций занимает 2 ^ (5 + 5) кодов операций, потому что каждая из них должна кодировать один из 2 ^ 5 возможных регистров источника или назначения, суммируя до 20% пространства кода операции. И мы еще не рассматривали скачки (RJMP
, RCALL
, ветви) или обращения к памяти, такие как LDD
, STD
, IN
, OUT
.
Терминология: приведенный выше «код операции» означает все биты, необходимые для кодирования одной указанной c машинной инструкции.