Микропроцессоры на ядре ARM
Процессор на базе ядра ARM содержит двадцать семь регистров, из которых обычно программистом используется только 16.
Регистры от 0 до 7 - регистры общего назначения (РОНы). В отличие от 80х86, в котором некоторые регистры используются для организации стека, или 6502, в котором результат операции всегда помещается в аккумулятор, ARM очень гибок в отношении использования регистров.
Регистры от 8 до 12 также РОНы, но у них есть теневые регистры-двойники, которые используются только в режиме быстрого ответа на прерывания.
Регистр 13 обычно указатель стека операционной системы, но м.б. использован как РОН. Это опция ОС, а не процессора, если вы не используете стек ОС, этот регистр может использоваться как угодно. Этот регистр также имеет теневого двойника.
Регистр 14 хранит адрес возврата для более быстрых операций с подпрограммами. Команда " branch with link (BL)" используется адрес возврата, хранимый в этом регистре (R14).
Естественно, при вложенных вызовах процедур регистр 14 д.б. сохранён, возможно в других регистрах, а возможно и в стеке. После сохранения адреса возврата регистр м.б. использован как РОН. Он также имеет теневого двойника.
Регистр 15 является счётчиком программ. Наряду с 26 битами адреса он хранит статусные биты процессора.
Таким образом, по сравнению с 80х86 у программиста есть 14 РОНов, что позволяет более эффективно использовать регистровую память. К тому же схемы адресации позволяют использовать любые регистры, а не чётко обозначенные.
Таблица использования регистров:
User Mode |
SVC Mode |
IRQ Mode |
FIQ Mode |
R0 ------- |
R0 ------- |
R0 ------- |
R0 |
R1 ------- |
R1 ------- |
R1 ------- |
R1 |
R2 ------- |
R2 ------- |
R2 ------- |
R2 |
R3 ------- |
R3 ------- |
R3 ------- |
R3 |
R4 ------- |
R4 ------- |
R4 ------- |
R4 |
R5 ------- |
R5 ------- |
R5 ------- |
R5 |
R6 ------- |
R6 ------- |
R6 ------- |
R6 |
R7 ------- |
R7 ------- |
R7 ------- |
R7 |
R8 ------- |
R8 ------- |
R8 |
R8_fiq |
R9 ------- |
R9 ------- |
R9 |
R9_fiq |
R10 ------ |
R10 ------ |
R10 |
R10_fiq |
R11 ------ |
R11 ------ |
R11 |
R11_fiq |
R12 ------ |
R12 ------ |
R12 |
R12_fiq |
R13 |
R13_svc |
R13_irq |
R13_fiq |
R14 |
R14_svc |
R14_irq |
R14_fiq |
------------- R15 / PC ------------- |
Счётчик программ имеет следующий формат:
Bit |
31 |
30 |
29 |
28 |
27 |
26 |
25------------2 |
1 |
0 |
N |
Z |
C |
V |
I |
F |
Program Counter |
S1 |
S0 |
N |
флаг отрицательного числа |
Z |
флаг нуля |
C |
флаг переноса |
V |
флаг переполнения |
I |
флаг разрешения прерывания |
F |
флаг разрешения быстрого прерывания |
PC |
счётчик команд |
S1 |
режим: 00 - пользователь, 01 - быстрое прерывание, 10 - прерывание, 11-супервизор |
S0 |
В новых процессорах ARM указатель команд 32-битный, потому регистр имеет несколько другой формат. (Новейшие процессоры, например XScale, не поддерживают 26-битовый режим.
Коротко, основные отличия 32-битового формата таковы:
Отметим, что предшественник RISC-процессоров 6502 имел минимальный набор регистров:
Аккумулятор - для результатов арифметических инструкций
X-регистр - Первый РОН
Y-регистр - Второй РОН
PC - Счётчик команд
SP - Указатель стека, смещение от страницы 1.(адрес &01xx).
PSR - Регистр статуса процессора (флаговый).
Режимы выполнения программ:
Отличия между IRQ и FIQ состоят в том, что в FIQ режиме необходима быстрая обработка прерываний и выход..., так как IRQ может быть прервано FIQ но IRQ не может прервать FIQ. Для быстрейшего прохождения FIQ в них используется большее количество теневых регистров, прерывания запрещены, нельзя вызывать некоторые команды - например команды программного прерывания. В общем, FIQ рекомендуется для частой обработки несложных обменов данными.
Систему команд микропроцессора детально описывать не будем. Отметим лишь, что она является типичной RISC, команды за редким исключением выполняются за 1 такт. Каждая инструкция имеет длину 32 бита, кроме случая с режимом Thumb, когда формат команд становится двуоперандным и две 16-битовые команды размещаются в 32-разрядном слове. Реально процессор поддерживает 2 набора команд, переключение между которыми производится специальными инструкциями.
Рассмотрим лишь особенности команд ARM.
Например, 3 команды сложения:
ADD R0, R0, R1
ADDS R0, R0, R1
ADDEQS R0, R0, R1
Первая команда - базовое сложение R1 к R0, без изменения регистра флагов.
Вторая команда - то же сложение, но с изменением регистра флагов.
Третья команда - то же сложение, с изменением регистра флагов. Отличие в том, что это условная инструкция, которая будет исполнена только если результатом предыдущей операции было условие "равно" - если установлен флаг Z.
Так же условными являются команды перемещения данных.
Поддерживается инструкция умножения и инструкция умножения с накоплением.
Отдельного внимания заслуживают пакетные инструкции сохранения, например
STMFD R13!, {R0-R12, R14}
...
LDMFD R13!, {R0-R12, PC}
Первая инструкция сохраняет по адресу, записанному в регистре 13 (с постинкрементом адреса - на это указывает мнемоника) с обновлением регистра 13 после операции, содержимое регистров с 0 по 12 и 14 (адрес возврата). Вторая инструкция загружает эти регистры обратно с 0 по 12 и в счётчик команд, фактически делая возврат из процедуры.
Система команд ARМ, хотя он позиционируется как RISC, достаточно сложна. Например команда:
LDREQ R0,[R1,R2,LSR #16]!
загружает регистр 0 при условии, что флаг нуля установлен, а адрес считается как сумма регистра 1 и регистра 2, сдвинутого на 16 бит влево, при этом результирующий адрес будет записан в регистр 1 по окончании загрузки.
Условное исполнение многих команд позволяет лучше загрузить конвейер и тратить меньше ресурсов на предсказание переходов.
Во время исполнения инструкции дополнительно может быть задействован сдвигатель, что позволяет сэкономить 1 такт на операции сдвига.
Необязательная установка флагов позволяет снять ряд ограничений на составления расписаний команд.
Большое количество методов адресации:
LDR R0,[R1,#16]
LDR R0,[R1,#16]!
LDR R0,[R1],#16
LDR R0,[R1,R2]
LDR R0,[R1,R2]!
LDR R0,[R1],R2
...
Свободное использование регистров в различных командах, например:
ADD PC,PC,R0,LSL #2
MOV R0,R0
B R0is0
B R0is1
B R0is2
B R0is3
или например:
ADD PC,PC,R0,LSL #3
MOV R0,R0
MOV R1,#1
B Continue
MOV R2,#2
B Comtinue
MOV R2,#4
B Continue
MOV R2,#8
B Continue
Отметим, что версии ARM являются отличным примером архитектуры ОКОД - благодаря применению практически всех технологий, позволяющих оптимизировать конвейер ОКОД-процессора, тактовая частота новейших XScale достигает 600 Мгц, что говорит об очень хороших характеристиках архитектуры в целом.