2015-02-23 8 views
19

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

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

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

+0

* Могу ли я сказать, что Thumb (32-бит) совпадает с инструкциями ARM, которые также являются 32-битными? * Ответ на этот вопрос нет. Thumb2 представляет собой комбинацию 32/16 бит с различными кодировками, чем прямой ARM 32 бит. –

ответ

38

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

+2

Кроме того, в пределах * Thumb2 * есть коды op, которые были добавлены с течением времени. Таким образом, не все * Thumb2 * одинаковы. С точки зрения основного процессора нет режима, известного как * Thumb2 * (я думаю, это то, что вы подразумеваете под «официальным»?); Конечно, у холдинга ARM есть идея * Thumb2 * как смешанного кодирования 16/32 бит, но кроме него он туман. –

+0

Спасибо! Это все для меня. Во всяком случае, я отправился на выставку Embedded World, которая проходила в Нюрнберге два дня назад, и это было потрясающе. У меня так много информации о ARM. Удивительное событие! – 71GA

9

В дополнение к Notlikethat's 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.

+0

У меня недостаточно репутации, чтобы прокомментировать ответ unixsmurf, но он нуждается в настройке. Ядро процессора ARMv8A имеет выбор, чтобы вообще не реализовывать состояние aarch32. Такое ядро ​​не будет поддерживать инструкции T32 или A32. Если конкретное ядро ​​процессора _does_ реализует состояние aarch32 (например, ARM ltds cortex-A53, A57 и A72), то он также поддерживает режим Thumb-2 в этом состоянии. – wmills

+0

@wmills: вы просто прокомментировали это напрямую :) Вы могли бы добавить свое собственное разъяснение в качестве ответа. – unixsmurf

+1

@wmills Действительно, поскольку этот ответ был написан, [некоторые из них также не поддерживают AArch64] (http://www.arm.com/products/processors/cortex-a/cortex-a32-processor.php);) – Notlikethat

Смежные вопросы