Инструкции микроконтроллера (МК)

Tucoso
Offline
Зарегистрирован: 23.08.2018
Добрый день.
 
Наткнулся на следующий листинг инструкций AVR платформы:
 
Правильно ли я делаю вывод что в действительности на МК платформы AVR реализовано по сути несколько десятков тысяч инструкций ?
 
Если предыдущий пункт верен, то получается что компилятор (в частности ассемблер) подбирает под каждую ситуацию свою инструкцию, в частности комманды: 
 
add r0, r0 и add r0, r1 написанные на ассемблере будут преобразованным в разные инструкции МК ?
 
И еще отдельный вопрос про rjmp\rcall судя по листингу есть все вариации инструкций со смещениям от -4094 до +4094. Почему бы не принимать значение смещения для jamp-а из регистра ? Это сложнее при реализации ?
 
Как теперь с этим жить ?
negavoid
Offline
Зарегистрирован: 09.07.2016

Tucoso пишет:

Правильно ли я делаю вывод что в действительности на МК платформы AVR реализовано по сути несколько десятков тысяч инструкций ?
Не совсем. Инструкций по-прежнему ограниченное количество, просто они задаются старшими битами, а регистры младшими. На х86 (насколько помню, могу ошибаться) некоторые mov и ещё что-то были устроены примерно так же.

Tucoso пишет:

add r0, r0 и add r0, r1 написанные на ассемблере будут преобразованным в разные инструкции МК ?
 

Инструкция будет та же, add, но младший байт в коде программы, записанном во флешку, будет другим.

Tucoso пишет:

И еще отдельный вопрос про rjmp\rcall судя по листингу есть все вариации инструкций со смещениям от -4094 до +4094. Почему бы не принимать значение смещения для jamp-а из регистра ? Это сложнее при реализации ?
 
rjmp, recall - примерно аналоги js (jump short) - раз rjmp в пределах 2к слов (а на х86 в пределах 127 байт, что ли), им хватает оставшихся бит для указания оффсета - так тупо быстрее, чем далее считать ещё адрес, перейти... Впрочем, я не знаток архитектуры, сейчас налетят знатоки, в ближайших 20 сообщениях обосрут меня, как фанеру в Парижском клошарнике :)

Tucoso пишет:
Как теперь с этим жить ?

На риторический вопрос - риторический ответ - погуглить ещё, как физически устроены регистры и их линии адресации, не обязательно в avr, у всех одинаково, осознать, понять, принять, смириться.

Tucoso
Offline
Зарегистрирован: 23.08.2018

[quote=negavoid]

 

Инструкция будет та же, add, но младший байт в коде программы, записанном во флешку, будет другим.

 

[quote=Tucoso]

 

Да согласен структура инструкции я видел (https://www.microchip.com/webdoc/avrassembler/avrassembler.wb_ADD.html), но тут возникает два вопросы:

 

т.е. в АЛУ есть некое ветление ("алгоритм") который в зависимости от битов opcode берет данные об используемых регистров выбирает значение этих регистров в какие-то свои _внутренние регистры_ проделывает типовую операцию сложение _внутренних регистров_ и укладывает в регистр указанный в opcode ИЛИ в АЛУ есть ВСЕ различные ветки алгоритма для ВСЕХ комбинаций параметров оператора ADD ?

 

И что за странный формат записи (по ссылки) например для инструкции ADD:

 

0000 11rd dddd rrrr

 

Часть номера регистра Rd в начале часть в конце, по середине номер регистра Rd. В этом есть какая-то необходимость ?

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

дак все процессоры так устроены.  В АЛУ происходит выборка инструкции с конвейера, потом к ней применяется маска, выбирается код операции, код операнда 1 и код операнда 2.  Так как в АВР 31 регистр то маска операндов пятибитовая, + есть модификатор регистр/память/непосредственное значение. Почему RISC процессоры так шустро молотят, потому что люди, создавшие эту архитектуру договорились, что длина кода команды всегда одинакова, а не как в Intel от 1 до 8 байт со всеми модификаторами.  Пока через них все продерешься, столько тактов пройдёть. 

Инструкция косвенного перехода в АВР тоже есть, называется IJMP (Indirect jump) , переходит по адресу, который лежит в регистре Z. 

jdigreze
Offline
Зарегистрирован: 14.01.2018

Tucoso пишет:

т.е. в АЛУ есть некое ветление ("алгоритм") который в зависимости от битов opcode берет данные об используемых регистров выбирает значение этих регистров в какие-то свои _внутренние регистры_ проделывает типовую операцию сложение _внутренних регистров_ и укладывает в регистр указанный в opcode ИЛИ в АЛУ есть ВСЕ различные ветки алгоритма для ВСЕХ комбинаций параметров оператора ADD ?

Если коротко: после выборки кода из памяти программ разрешается выход (условно сигнал /OE, aka output enable) одного регистра на первый вход АЛУ, другого регистра на второй вход АЛУ, а на вход типа(номера) операции АЛУ подается опкод, после отработки операции АЛУ выставляет результат на внутреннюю шину, изменяет регистр флагов, после чего результат переписывается в регистр приёмник.

Tucoso пишет:

И что за странный формат записи (по ссылки) например для инструкции ADD:

0000 11rd dddd rrrr

Часть номера регистра Rd в начале часть в конце, по середине номер регистра Rd. В этом есть какая-то необходимость ?

Обусловлено внутренней организацией архитектуры, грубо говоря выделение адреса регистра занимает меньшее количество вентилей на кристалле.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Совершенно верно. АЛУ - это в общем-то комбинационная схема (без триггеров хранения). На её выходе всегда присутствует некий результат как функция от входных параметров. АЛУ относительно одинаково устроено для операций сложения/вычитания и логических И, ИЛИ .. Вот для операций умножения и тем более деления .. там используются совсем иные схемы и больше размерами примерно на порядок-два-три. Поэтому далеко не во всех камнях такие возможности есть.

Инструкция из памяти фиксируется тактом во внутреннем регистре ЦП (регистр(ы) команды - м.б. конвеер) где его битики тут же попадают в комбинационную схему (Блок микропрограммного управления), из которой сразу же вылетают сигнальчики на АЛУ, код операции - что делать: складывать, вычитать, лог.И и т.д. как правило 3-4 бита. Каждый вход АЛУ имеет "мультиплексор" и тоже как правило без памяти на 3-4-8 входов: константа ноль, константа раз, вход регистра, выход самого АЛУ, регистр внешних данных, регистр данных/констант из регистра команды, инверсия входа (операция НЕ) и т.д. Какие-то входы подключаются только к первому/второму входу АЛУ (только первый, только второй операнд команды), какие-то к обоим. Всё это (структура БМУ и АЛУ) хорошо прослеживается из набора команд процессора.

RISC архитектура отличается фиксированной длиной команды (но не это главное!) и большим регистровым полем. На самом деле она отличается ЗНАЧИТЕЛЬНО упрощенным блоком БМУ, который зачастую вырожден в очень простой кусок И-ИЛИ-НЕ схем, что назвать его "блоком" и тем более "микропрограмным" .. ни у кого не поднимается рука. Поэтому часто говорят об отсутствии БМУ в RISCархитектуре, что и определяет все её (говенные) свойства: 1 (примитивная) команда за такт, отсутствие команд упрощающих программирование, отсутствие полноценных префиксов к командам (тут АРМ слегка извратился все же), отсутствие полноценных способов адресации операндов (согласно теории вычислений), что приводит к росту размера программ в 3-6 раз по отношению к CISC архитектурам "классического типа" и 10-20 раз (и соотв. снижение производительности!) по отношению к "оптимальным архитектурам".. зато де-ше-во .. :)

В общем, глядя на систему команд можно достаточно уверенно рассказать про внутреннюю архитектуру кристалла. А взяв какой-нить ПЛИСС можно легко повторить или сваять нечто "свое" .. :)

P.S. Повторение другими, развитие далее своего в общем-то на сегодня сдерживается не столько "технологиями", сколько "американским патентным правом и флотами с боеголовками, его поддерживающими по всему миру". :)

Tucoso
Offline
Зарегистрирован: 23.08.2018

Ну +/- все стало прояснятся.

Большое спасибо.

Думаю ветку можно закрывать.