Сборка AVR, почему в инструкции LDI могут использоваться только регистры R16 - R31 - PullRequest
0 голосов
/ 21 апреля 2020

Здравствуйте, я сталкивался с этим экзаменационным вопросом в прошлой статье, и я сбит с толку, так что ни одно исследование не дало мне окончательного ответа, так как большинство людей просто говорят, что это ограничение процессора. Я очень уверен, что мы не освещали это в классе.

Кто-нибудь знает почему?

1 Ответ

1 голос
/ 04 мая 2020

Простой ответ заключается в том, что 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 машинной инструкции.

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