О, ARM и их глупо именование ...
Это распространенное заблуждение, но официально не существует такого понятия, как «Thumb-2 набора команд».
Игнорирование ARMv8 (где все переименовывается и AArch64 усложняет вещи), от ARMv4T к ARMv7-A есть два наборы команд: ARM и Thumb. Они оба «32-битные» в том смысле, что они работают с 32-разрядными данными в 32-разрядных регистрах с 32-разрядными адресами. Фактически, там, где они перекрываются, они представляют собой точные инструкции - это только кодировка , которая отличается, и процессор фактически имеет только два разных конца декодирования для своего конвейера, который он может переключаться между ними. Для ясности я теперь намеренно избегаю терминов «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 Technology», включая условное исполнение и кодировки для инструкций VFP, тогда как ARMv6- M (Cortex-M0/M0 +) использует только Thumb-2 в виде нескольких 4-байтных системных инструкций.
Таким образом, новые 4-байтовые кодирования (и те, которые добавлены позже в ARMv7 версий) все еще инструкции Thumb - The «Thumb-2» аспект них является то, что они могут иметь 4-байтовые кодирования, и что они могут (в основном) быть условно выполнены через it
(и, я полагаю, их menmonics определены только в UAL).
* Перед ARMv6T2, он был на самом деле сложная деталь реализации, является ли bl
(или blx
) был выполнен в виде инструкции 4-байтового или в виде пары команд 2-байтовых. Архитектурное определение было последним, но поскольку их можно было только исполнить как пару последовательно, было мало чего потерять (кроме возможности совершить прерывание на полпути), сплавляя их в одну инструкцию по соображениям производительности.ARMv6T2 просто пересмотреть вещи с точки зрения выполнения слиты одной инструкции
* Могу ли я сказать, что Thumb (32-бит) совпадает с инструкциями ARM, которые также являются 32-битными? * Ответ на этот вопрос нет. Thumb2 представляет собой комбинацию 32/16 бит с различными кодировками, чем прямой ARM 32 бит. –