Изящное решение
Как видно из рисунка, старший опкод команды Thumb помещается в команду ARM, а младший транслируется через справочную таблицу.
В команде ARM всегда присутствует код условия, определяемый из старшим операционным кодом.
Старший опкод определяет маршрут операнда от операционного кода Thumb до операционного кода ARM. Определители регистров расширяются дополнительным нулем от опкода Thumb (3 бита) до 4 битов, поскольку эта команда Thumb обращается только к регистрам ARM R0-R7. Значение константы также расширяется нулями, определяя 8-разрядную константу в опкоде ARM.
Это изящное решение применимо на любом ядре ARM и будет использоваться в перспективных ARM архитектурах.
Аспекты программного обеспечения
36 Команд
Система команд Thumb содержит 16-разрядные эквиваленты 36 команд, находящихся в стандартной 32-разрядной системе команд ARM. Для системы команд Thumb выбраны те команды ARM, которые, в среднем, не обеспечивают преимуществ полноформатных стандартных 32-разрядных операционных кодов ARM, или те, в отношении которых опыт показал, что они используются наиболее часто и, следовательно, являются наиболее важными, или те которые необходимы компилятору, для того чтобы обеспечить наилучшую возможную плотность кода.
Компромисс производительность/плотность кода
Процесс формирования команд Thumb заключался в сокращении полей всех наиболее часто используемых команд ARM до тех пор, пока они не стали 16-разрядными. Полученная в результате система команд затем обрабатывалась последовательностью итераций, обеспечивавшей наибольшее количество битов опкодам наиболее употребительных команд (например, вызовам подпрограмм, которые составляют 1/16 системы команд) и удаление битов из менее критических команд до тех пор, пока не было получено наилучшее соотношение производительность/плотность кода. Система команд была ориентирована и на перспективу, в операционных кодах оставлено пространство для новых команд, которые будут вводиться разработчиками программного обеспечения и которые должны будут поддерживаться новыми версиями компилятора.
При создании 16-разрядных операционных кодов, в систему команд Thumb были введены некоторые ограничения . Наиболее очевидные: уменьшенное число регистров, доступных при выполнении кода Thumb. Вместо пятнадцати 32-разрядных регистров общего назначения (GPR) плюс PC процессора ARM, программист имеет доступ к восьми GPR регистрам, указателю стека, регистру связей (Link Register) и PC. В системе команд Thumb, восемь GPR регистров (R0-R7) называются Lo набором регистров. Другие регистры ARM (R8-R15) обозначаются как Hi регистры. Программист в Thumb режиме ограничен доступом к Hi регистрам через команды перемещения, сравнения и команду ADD , предоставляющие ему некоторую локальную быструю временную среду хранения. Переключения между ARM и Thumb кодами не влияют на содержимое GPR регистров.

Рисунок 13: Отображение Thumb регистров состояния на регистры состояния ARM
Бит состояния Thumb/arm
Переключения между системами команд выполняются командой BX, которая изменяет логическое состояние бита Thumb/ARM в регистре состояния программы (PSR) Thumb-ориентированного ядра. Этот бит и команда и обеспечивают то, что подпрограммы в Thumb и ARM кодах могут находиться вместе в одном и том же пространстве памяти:

Новая мнемоника включает команды ASR, LSL, LSR, ROR, LDRH, LDSB, LDSH, PUSH, POP и STRH. Это не новые команды, но они действительно соответствуют полным 32-разрядным командам ARM, поскольку виртуально каждой команде Thumb соответствует эквивалентная команда ARM.
Концепция Thumb
Технология Thumb — дополнительное расширение к архитектуре ARM. Система команд Thumb содержит 36 команд, производных от стандартной 32-разрядной системы команд ARM, перекодированных в 16-разрядные коды. Такой подход обеспечил очень высокую плотность кода, поскольку команды Thumb составляют половину ширины формата команд ARM. В процессе выполнения эти новые 16-разрядные Thumb коды декомпрессируются процессором в соответствующие эквивалентные команды ARM, которые затем и выполняются ядром ARM обычным способом.
Рисунок 1: Команды Thumb как кодированное подмножество системы команд ARM
Уникальное преимущество
Технология Thumb — это не только смешанная система команд. Thumb-ориентированные ядра имеют две отдельных системы команд — уникальное достоинство, позволяющее разработчику использовать всю мощность 32-разрядной системы команд ARM при использовании преимуществ малого размера кода системы команд Thumb. Тот факт, что две системы команд являются совершенно отдельными, говорит о том, что средства декодирующей логики также чрезвычайно просты, что в свою очередь, сохраняет малым размер кристалла и сохраняет лучшее в отрасли соотношение производительность/потребление.
Размер и критичные к производительности подпрограммы
Так как Thumb -ориентированные ядра способны выполнять и стандартную ARM систему команд и новые команды Thumb, разработчик, при переходе от подпрограммы к подпрограмме, может находить компромисс между размером кода и производительностью, подготавливая критичные к размеру подпрограммы в коде Thumb и критичные к производительности подпрограммы в кодах ARM.
32-разрядная RISC производительность
Thumb -ориентированные ядра типа ARM7TDMI имеют полную 32-разрядную архитектуру ARM, так что разработчик сохраняет 32-разрядную производительность RISC архитектуры. Комбинация двух систем команд, выполняющихся на 32-разрядном Thumb -ориентированном ядре, обеспечивает эффективное решение проблемы больших размеров кода и проблемы невысокой производительности 16-разрядных систем.
Улучшение плотности кода на 30 %
Полученные к настоящему времени результаты показали улучшение плотности кода на 30%, по сравнению с кодом ARM, что позволяет считать Thumb -ориентированные процессоры лучшими по плотности кода в сравнении и с традиционными CISC процессорами.
Рисунок 2: Ядро ARM7TDMI и расположение декомпрессора команд Thumb
Поддержка полуслов
Кроме введения новых Thumb команд, фирма ARM добавила к системам команд и ARM и Thumb поддержку формата полуслов (16-разрядных данных). Следовательно архитектура ARM теперь полностью поддерживает 8, 16 и 32-разрядные данные. Были добавлены и для Thumb и ARM ядер операции со знаками для поддержки ими 8 и 16-разрядных операций с данными со знаками.
Расширение возможностей комплекта средств разработки программного обеспечения ARM
омплект средств разработки программного обеспечения ARM также был расширен, чтобы обеспечить поддержку разработки кодов Thumb. Комплект позволяет программисту писать и размещать в памяти системы коды ARM, коды Thumb или оба вместе.
Рисунок 3: Последовательность этапов проектирования программного обеспечения для Thumb -ориентированного ядра
Концепция Thumb
Технология Thumb — дополнительное расширение к архитектуре ARM. Система команд Thumb содержит 36 команд, производных от стандартной 32-разрядной системы команд ARM, перекодированных в 16-разрядные коды. Такой подход обеспечил очень высокую плотность кода, поскольку команды Thumb составляют половину ширины формата команд ARM. В процессе выполнения эти новые 16-разрядные Thumb коды декомпрессируются процессором в соответствующие эквивалентные команды ARM, которые затем и выполняются ядром ARM обычным способом.
Рисунок 1: Команды Thumb как кодированное подмножество системы команд ARM
Уникальное преимущество
Технология Thumb — это не только смешанная система команд. Thumb-ориентированные ядра имеют две отдельных системы команд — уникальное достоинство, позволяющее разработчику использовать всю мощность 32-разрядной системы команд ARM при использовании преимуществ малого размера кода системы команд Thumb. Тот факт, что две системы команд являются совершенно отдельными, говорит о том, что средства декодирующей логики также чрезвычайно просты, что в свою очередь, сохраняет малым размер кристалла и сохраняет лучшее в отрасли соотношение производительность/потребление.
Размер и критичные к производительности подпрограммы
Так как Thumb -ориентированные ядра способны выполнять и стандартную ARM систему команд и новые команды Thumb, разработчик, при переходе от подпрограммы к подпрограмме, может находить компромисс между размером кода и производительностью, подготавливая критичные к размеру подпрограммы в коде Thumb и критичные к производительности подпрограммы в кодах ARM.
32-разрядная RISC производительность
Thumb -ориентированные ядра типа ARM7TDMI имеют полную 32-разрядную архитектуру ARM, так что разработчик сохраняет 32-разрядную производительность RISC архитектуры. Комбинация двух систем команд, выполняющихся на 32-разрядном Thumb -ориентированном ядре, обеспечивает эффективное решение проблемы больших размеров кода и проблемы невысокой производительности 16-разрядных систем.
Улучшение плотности кода на 30 %
Полученные к настоящему времени результаты показали улучшение плотности кода на 30%, по сравнению с кодом ARM, что позволяет считать Thumb -ориентированные процессоры лучшими по плотности кода в сравнении и с традиционными CISC процессорами.
Рисунок 2: Ядро ARM7TDMI и расположение декомпрессора команд Thumb
Поддержка полуслов
Кроме введения новых Thumb команд, фирма ARM добавила к системам команд и ARM и Thumb поддержку формата полуслов (16-разрядных данных). Следовательно архитектура ARM теперь полностью поддерживает 8, 16 и 32-разрядные данные. Были добавлены и для Thumb и ARM ядер операции со знаками для поддержки ими 8 и 16-разрядных операций с данными со знаками.
Расширение возможностей комплекта средств разработки программного обеспечения ARM
омплект средств разработки программного обеспечения ARM также был расширен, чтобы обеспечить поддержку разработки кодов Thumb. Комплект позволяет программисту писать и размещать в памяти системы коды ARM, коды Thumb или оба вместе.
Рисунок 3: Последовательность этапов проектирования программного обеспечения для Thumb -ориентированного ядра
Thumb код в действии
Сравнение, приведенное в таблице 1 показывает, что код Thumb — на 33 % плотнее кода ARM, реализующего точно такую же функцию. Обратите внимание на то, что для выполнения задачи в коде Thumb необходимо большее количество команд чем в эквиваленте ARM. Однако, поскольку формат команды Thumb — только половина длины команд ARM, то общий размер подпрограммы в коде Thumb все же меньше.
Пример кодирования вручную
Как пример кодирования вручную, рассмотрим пример преобразования двоичного значения в шестнадцатиричное :
MOV r1, r0 ; r0 хранит значение для преобразования ; загрузить r1 хранимым значением MOV r2, #8 ; Загрузить в r2 десятичное число 8 Loop: MOV r1, r1, ROR #28 ; Вращать r1 вправо на 28 и результат сохранить в r1 AND r0, r1, #15 ; Выполнить AND содержимого r1 с десятичным числом 15 CMP r0, #10 ; Сравнить r0 с десятичным числом 10 и ADDLT r0, r0, #'0' ; если оно меньше чем 10, то ; ADD ASCII значение 0 к r0 ADDGE r0, r0, #'A' ; в ином случае (больше или равно) ; ADD ASCII значение A к r0 SWI 0 ; подпрограмма вывода char на экран SUBS r2, r2, #1 ; Вычесть 1 из r2 BGT Loop ; и вернуться обратно к 1, если r2 все еще больше чем нуль MOV pc, lr ; Загрузить PC содержимым Link регистра (Возврат)
MOV r1, r0 ; Преобразуемое значение, хранящееся в r0 загрузить в r1 MOV r2, #8 ; Поместить 8 в r2 Loop1 LSR r0, r1, #28 ; Выполнить логический сдвиг r1 вправо ; на 28 мест и поместить в r0 LSL r1, r1, #4 ; Выполнить логический сдвиг r1 влево на 4 места CMP r0, #10 ; Сравнить r0 с 10 и BLT Loop2 ; если меньше чем 10, выполнить переход к Loop2 ADD r0, #'A'-'0'-10 ; Выполнить ADD ASCII значений A-0-10 (7) к r0 Loop2 ADD r0, #'0' ; Выполнить ADD ASCII значения 0 (48) к r0 SWI 0 ; Подпрограмма записи char на экран SUB r2, #1 ; Вычесть 1 из r2 и, BNE Loop1 ; если незакончено loop1, MOV pc, lr ; загрузить PC содержимым Link регистра ; (Возврат)
Cоответствующие размеры ARM и Thumb кодов показаны ниже.
Таблица 2: Размеры кодов подпрограмм преобразования двоичной величины в шестнадцатиричную
| Код | Количество команд | Размер (Байты) | Соотношение |
| ARM | 11 | 44 | 1,0 |
| Thumb | 12 | 24 | 0,55 |
В данном случае код Thumb оказывается на 45% более плотным чем эквивалентный код ARM, в точно таком же алгоритме.
Таблица 3: Система команд Thumb
| Мнемоника | Команда | Пример | Эквивалент кода ARM |
| ADC | Сложить с переносом | ADC Rd, Rs | ADCS Rd, Rd, Rs |
| ADD | Сложить | ADD Rd, Rs, Rn | ADD Rd, Rs, Rn |
| AND | Выполнить AND | AND Rd, Rs | ANDS Rd, Rd, Rs |
| ASR | Арифметически сдвинуть вправо | ASR Rd, Rs | MOVS Rd, Rd, ASR Rs |
| B | Перейти безусловно | B label | B label |
| BCC | BCC label | BCC label | |
| BIC | Очистить бит | BIC Rd, Rs | BICS Rd, Rd, Rs |
| BL | Перейти и связать | BL label | BL label |
| BX | Перейти и обменять | BX Hs | BX Hs |
| CMN | Отрицательно сравнить | CMN Rd, Rs | CMN Rd, Rs |
| CMP | Сравнить | CMP Rd, #Offset8 | CMP Rd, #Offset8 |
| EOR | EOR | EOR Rd, Rs | EORS Rd, Rd, Rs |
| LDMIA | Загрузить множество | LDMIA Rb!, | LDMIA Rb!, |
| LDR | Загрузить слово | LDR Rd, [PC, #lmm] | LDR Rd, [PC, #lmm] |
| LDRB | Загрузить байт | LDRB Rd, [Rb, Ro] | LDRB Rd, [Rb, Ro] |
| LDRH | Загрузить полуслово | LDRH Rd, [Rb, #lmm] | LDRH Rd, [Rb, #lmm] |
| LSL | Логически сдвинуть влево | LSL Rd, Rs, #Offset5 | MOVS Rd, Rs, LSL #Offset5 |
| LDRSB | Загрузить байт со знаком | LDRSB Rd, [Rb, Ro] | LDRSB Rd, [Rb, Ro] |
| LDRSH | Загрузить полуслово со знаком | LDRSH Rd, [Rb, Ro] | LDRSH Rd, [Rb, Ro] |
| LSR | Логически сдвинуть вправо | LSR Rd, Rs | MOVS Rd, Rd, LSR Rs |
| MOV | Переместить содержимое регистра | MOV Rd, #Offset8 | MOVS Rd, #Offset8 |
| MUL | Перемножить | MUL Rd, Rs | MULS Rd, Rs, Rd |
| MVN | Переместить NOT регистр | MVN Rd, Rs | MVNS Rd, Rs |
| NEG | Отрицать | NEG Rd, Rs | RSBS Rd, Rs, #0 |
| ORR | Выполнить OR | ORR Rd, Rs | ORRS Rd, Rd, Rs |
| POP | Поднять регистр | POP | LDMIA R13!, |
| PUSH | Опустить регистр | PUSH | STMDB R13!, |
| ROR | Вращать вправо | ROR Rd, Rs | MOVS Rd, Rd, ROR Rs |
| SBC | Вычесть с переносом | SBC Rd, Rs | SBCS Rd, Rd, Rs |
| STMIA | Сохранить множество | STMIA Rb!, | STMIA Rb!, |
| STR | Сохранить слово | STR Rd, [Rb, Ro] | STR Rd, [Rb, Ro] |
| STRB | Сохранить байт | STRB Rd, [Rb, Ro] | STRB Rd, [Rb, Ro] |
| STRH | Сохранить полуслово | STRH Rd, [Rb, Ro] | STRH Rd, [Rb, Ro] |
| SWI | Программное прерывание | SWI Value8 | SWI Value8 |
| SUB | Вычесть | SUB Rd, Rs, Rn | SUBS Rd, Rs, Rn |
| TST | Тестировать биты | TST Rd, Rs | TST Rd, Rs |
Mаршрут разработки программного обеспечения
Мы рекомендуем использовать комплекта инструментальных средств разработки программного обеспечения фирмы ARM (ARM Software Development Toolkit).