ARM, Thumb and Thumb 2 путают инструкции

Я немного запутался в наборах инструкций. Есть Thumb, ARM и Thumb 2. Из того, что я прочитал, инструкции Thumb все 16-бит, но внутри ARMv7M руководство пользователя (стр. Vi) есть 32-битные инструкции Thumb 16-bit and Thumb 32-bit упоминается.

Теперь я должен преодолеть эту путаницу. Говорят, что Thumb 2 поддерживает 16-битные и 32-битные инструкции. Так что ARMv7M фактически поддерживает инструкции Thumb 2, а не только Thumb?

Еще одна вещь. Могу ли я сказать, что Thumb (32-бит) совпадает с инструкциями ARM, которые также 32-битные?

Ответы

Ответ 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 просто переопределил ситуацию с точки зрения плавного запуска одной команды

Ответ 2

В дополнение к Notlikethat answer, и, как он намекает, ARMv8 представляет новую терминологию, чтобы попытаться уменьшить путаницу (конечно, добавив еще более новую терминологию):

Существует 32-разрядное состояние выполнения (AArch32) и 64-разрядное состояние выполнения (AArch64).

32-разрядное состояние выполнения поддерживает два разных набора команд: T32 ( "Thumb" ) и A32 ( "ARM" ). 64-битное состояние выполнения поддерживает только один набор команд - A64.

Все A64, как и все инструкции A32, имеют размер 32 бит (4 байта), требующий 4-байтового выравнивания.

Многие/большинство инструкций A64 могут работать как на 32-битных, так и на 64-битных регистрах (или, возможно, на 32-битных или 64-битных представлениях одного и того же базового 64-битного регистра).

Все процессоры ARMv8 (как и все процессоры ARMv7) поддерживают инструкции Thumb-2 в наборе инструкций T32.