Ответ 1
О, ARM и их глупые имена...
Это распространенное заблуждение, но официально там нет такой вещи, как "Набор команд Thumb-2".
Игнорирование ARMv8 (там, где все переименовано, и AArch64 усложняет ситуацию), от ARMv4T до ARMv7-A есть два набора команд: ARM и Thumb. Они оба "32-битные" в том смысле, что они работают с 32-разрядными данными в 32-разрядных регистрах с 32-разрядными адресами. Фактически, там, где они перекрываются, они представляют собой одни и те же инструкции - это только команда кодировка, которая отличается, и у CPU фактически есть только два разных передних конца декодирования для своего конвейера, который он может переключаться между ними. Для ясности я теперь намеренно избегаю терминов "32-бит" и "16-бит"...
Инструкции ARM имеют 4-байтовые кодировки с фиксированной шириной, которые требуют 4-байтового выравнивания. Инструкции Thumb имеют переменные длины (2 или 4 байта, теперь известные как "узкие" и "широкие" ) кодировки, требующие двухбайтового выравнивания - большинство инструкций имеют 2-байтовые кодировки, но bl
и blx
всегда имели 4-байтовые кодировки *. Действительно запутанный бит появился в ARMv6T2, который представил "Thumb-2 Technology". Thumb-2 охватывал не просто добавление нагрузки больше инструкций для Thumb (в основном с 4-байтовыми кодировками), чтобы довести его до уровня четности с ARM, но также расширить состояние выполнения, чтобы обеспечить условное выполнение большинства команд Thumb и, наконец, ввести весь новый синтаксис сборки (UAL, "Unified Assembly Language" ), который заменил предыдущие отдельные синтаксисы ARM и Thumb и позволил написать код один раз и собрать его в любой набор команд без изменений.
Архитектуры Cortex-M реализуют только набор команд Thumb - ARMv7-M (Cortex-M3/M4/M7) поддерживает большинство технологий Thumb-2, включая условное исполнение и кодировки для инструкций VFP, тогда как ARMv6-M (Cortex-M0/M0 +) использует только Thumb-2 в виде нескольких 4-байтных системных инструкций.
Таким образом, новые 4-байтные кодировки (и те, которые добавлены позже в версиях ARMv7) по-прежнему Thumb instructions - аспект Thumb-2 состоит в том, что они могут иметь 4-байтные кодировки, и что они могут (в основном) быть условно выполнены через it
(и, я полагаю, их menmonics определены только в UAL).
* До ARMv6T2 на самом деле это была сложная деталь реализации в отношении того, выполнялся ли bl
(или blx
) как 4-байтная инструкция или как пара двухбайтовых инструкций. Архитектурное определение было последним, но поскольку их можно было только исполнить как пару последовательно, было мало чего потерять (кроме возможности совершить прерывание на полпути), объединив их в одну инструкцию по соображениям производительности. ARMv6T2 просто переопределил ситуацию с точки зрения плавного запуска одной команды