Перейти к содержимому

Arm thumb что это

  • автор:

Изящное решение

Как видно из рисунка, старший опкод команды 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).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *