Инструкции микроконтроллера (МК)
- Войдите на сайт для отправки комментариев
Пт, 24/08/2018 - 00:49
Добрый день.
Наткнулся на следующий листинг инструкций AVR платформы:
Правильно ли я делаю вывод что в действительности на МК платформы AVR реализовано по сути несколько десятков тысяч инструкций ?
Если предыдущий пункт верен, то получается что компилятор (в частности ассемблер) подбирает под каждую ситуацию свою инструкцию, в частности комманды:
add r0, r0 и add r0, r1 написанные на ассемблере будут преобразованным в разные инструкции МК ?
И еще отдельный вопрос про rjmp\rcall судя по листингу есть все вариации инструкций со смещениям от -4094 до +4094. Почему бы не принимать значение смещения для jamp-а из регистра ? Это сложнее при реализации ?
Как теперь с этим жить ?
Инструкция будет та же, add, но младший байт в коде программы, записанном во флешку, будет другим.
На риторический вопрос - риторический ответ - погуглить ещё, как физически устроены регистры и их линии адресации, не обязательно в avr, у всех одинаково, осознать, понять, принять, смириться.
[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. В этом есть какая-то необходимость ?
дак все процессоры так устроены. В АЛУ происходит выборка инструкции с конвейера, потом к ней применяется маска, выбирается код операции, код операнда 1 и код операнда 2. Так как в АВР 31 регистр то маска операндов пятибитовая, + есть модификатор регистр/память/непосредственное значение. Почему RISC процессоры так шустро молотят, потому что люди, создавшие эту архитектуру договорились, что длина кода команды всегда одинакова, а не как в Intel от 1 до 8 байт со всеми модификаторами. Пока через них все продерешься, столько тактов пройдёть.
Инструкция косвенного перехода в АВР тоже есть, называется IJMP (Indirect jump) , переходит по адресу, который лежит в регистре Z.
т.е. в АЛУ есть некое ветление ("алгоритм") который в зависимости от битов opcode берет данные об используемых регистров выбирает значение этих регистров в какие-то свои _внутренние регистры_ проделывает типовую операцию сложение _внутренних регистров_ и укладывает в регистр указанный в opcode ИЛИ в АЛУ есть ВСЕ различные ветки алгоритма для ВСЕХ комбинаций параметров оператора ADD ?
Если коротко: после выборки кода из памяти программ разрешается выход (условно сигнал /OE, aka output enable) одного регистра на первый вход АЛУ, другого регистра на второй вход АЛУ, а на вход типа(номера) операции АЛУ подается опкод, после отработки операции АЛУ выставляет результат на внутреннюю шину, изменяет регистр флагов, после чего результат переписывается в регистр приёмник.
И что за странный формат записи (по ссылки) например для инструкции ADD:
0000 11rd dddd rrrr
Часть номера регистра Rd в начале часть в конце, по середине номер регистра Rd. В этом есть какая-то необходимость ?
Обусловлено внутренней организацией архитектуры, грубо говоря выделение адреса регистра занимает меньшее количество вентилей на кристалле.
Совершенно верно. АЛУ - это в общем-то комбинационная схема (без триггеров хранения). На её выходе всегда присутствует некий результат как функция от входных параметров. АЛУ относительно одинаково устроено для операций сложения/вычитания и логических И, ИЛИ .. Вот для операций умножения и тем более деления .. там используются совсем иные схемы и больше размерами примерно на порядок-два-три. Поэтому далеко не во всех камнях такие возможности есть.
Инструкция из памяти фиксируется тактом во внутреннем регистре ЦП (регистр(ы) команды - м.б. конвеер) где его битики тут же попадают в комбинационную схему (Блок микропрограммного управления), из которой сразу же вылетают сигнальчики на АЛУ, код операции - что делать: складывать, вычитать, лог.И и т.д. как правило 3-4 бита. Каждый вход АЛУ имеет "мультиплексор" и тоже как правило без памяти на 3-4-8 входов: константа ноль, константа раз, вход регистра, выход самого АЛУ, регистр внешних данных, регистр данных/констант из регистра команды, инверсия входа (операция НЕ) и т.д. Какие-то входы подключаются только к первому/второму входу АЛУ (только первый, только второй операнд команды), какие-то к обоим. Всё это (структура БМУ и АЛУ) хорошо прослеживается из набора команд процессора.
RISC архитектура отличается фиксированной длиной команды (но не это главное!) и большим регистровым полем. На самом деле она отличается ЗНАЧИТЕЛЬНО упрощенным блоком БМУ, который зачастую вырожден в очень простой кусок И-ИЛИ-НЕ схем, что назвать его "блоком" и тем более "микропрограмным" .. ни у кого не поднимается рука. Поэтому часто говорят об отсутствии БМУ в RISCархитектуре, что и определяет все её (говенные) свойства: 1 (примитивная) команда за такт, отсутствие команд упрощающих программирование, отсутствие полноценных префиксов к командам (тут АРМ слегка извратился все же), отсутствие полноценных способов адресации операндов (согласно теории вычислений), что приводит к росту размера программ в 3-6 раз по отношению к CISC архитектурам "классического типа" и 10-20 раз (и соотв. снижение производительности!) по отношению к "оптимальным архитектурам".. зато де-ше-во .. :)
В общем, глядя на систему команд можно достаточно уверенно рассказать про внутреннюю архитектуру кристалла. А взяв какой-нить ПЛИСС можно легко повторить или сваять нечто "свое" .. :)
P.S. Повторение другими, развитие далее своего в общем-то на сегодня сдерживается не столько "технологиями", сколько "американским патентным правом и флотами с боеголовками, его поддерживающими по всему миру". :)
Ну +/- все стало прояснятся.
Большое спасибо.
Думаю ветку можно закрывать.