Процессор имеет архитектуру “load-and-store” (загрузка – сохранение), поэтому для выполнения любой обработки данных необходимо сначала перенести эти данные из памяти в определенные регистры, выполнить команду обработки данных и затем записать полученные значения обратно в память.
Основной регистровый файл состоит из 16 пользовательских регистров R0 – R15. Каждый из этих регистров является 32-битными. Регистры R0 – R12 имеют общее назначения и не выполняют ни каких других специальных функций. Регистры R13 – R15 имеют дополнительные функции.
Регистр R13 используется в качестве указателя стека (Stack Pointer – SP).
Регистр R14 является регистром связи (Link Register – LR). При вызове подпрограммы адрес возврата автоматически запоминается в регистре связи, откуда затем считывается при возврате. Такое решение позволяет быстро переходить к «концевым» функциям (функции, которые не вызывают других функций) и возвращаться из них. Если же функция входит в состав «ветви», т.е. вызывает другие функции, содержимое регистра связи необходимо сохранять в стеке.
Регистр R15 выполняет функции счетчика команд (PC).
Многие команды могут работать с регистрами R13 – R15 как с обычными пользовательскими регистрами.
Регистр текущего состояния программы
Наряду с банком регистров в процессоре имеется дополнительный 32-битный регистр, называемый регистром текущего состояния программы (Current Program Status Register – CPSR). Регистр CPSR содержит набор флагов, которые управляют функционированием ЦПУ ARM7 и отображают его состояние.
Как уже было замечено, в состоянии ARM процессор ARM7 поддерживает 7 режимов работы. Каждому режиму соответствует определенная регистровая модель, содержащая набор регистров, доступных процессору в этом режиме. Все возможные регистровые модели для состояния ARM показаны в таблице 5.1. Все регистры общего назначения имеют дополнительные имена, определенные стандартом фирмы ARM. Регистры, имена которых в таблице выделены фоновой заливкой, банкированны, их переключение осуществляется при переключении режимов работы процессора. При переходе из одного рабочего режима в другой, текущее состояние регистров, указанных в таблице без суффиксов, автоматически переписывается в соответствующие банкирующие регистры, а при возврате в прежний режим вновь используется содержимое регистров без суффиксов.
Таблица 5.1 Регистровая модель процессора ARM7TDMI в различных режимах состоянии ARM
user, system
supervisor
abort
undefined
IRQ
FIQ
R0 (a1)
R0
R0
R0
R0
R0
R1 (a2)
R1
R1
R1
R1
R1
R2 (a3)
R2
R2
R2
R2
R2
R3 (a4)
R3
R3
R3
R3
R3
R4 (v1)
R4
R4
R4
R4
R4
R5 (v2)
R5
R5
R5
R5
R5
R6 (v3)
R6
R6
R6
R6
R6
R7 (v4)
R7
R7
R7
R7
R7
R8 (v5)
R8
R8
R8
R8
R8_FIQ
R9 (v6)
R9
R9
R9
R9
R9_FIQ
R10 (v7)
R10
R10
R10
R10
R10_FIQ
R11 (v8)
R11
R11
R11
R11
R11_FIQ
R12 (IP)
R12
R12
R12
R12
R12_FIQ
R13 (SP)
R13_SVC
R13_ABORT
R13_UNDEF
R13_IRQ
R13_FIQ
R14 (LR)
R14_SVC
R14_ABORT
R14_UNDEF
R14_IRQ
R14_FIQ
R15 (PC)
PC
PC
PC
PC
PC
CPSR
CPSR
CPSR
CPSR
CPSR
CPSR
-
SPSR_SVC
SPSR_ABORT
SPSR_UNDEF
SPSR_IRQ
SPSR_FIQ
Получается, что суммарное количество физических 32-битных регистров общего назначения, доступных процессору во всех режимах состояния ARM, равно 31.
Переход процессора из состояния ARM в состояние Thumb производится с помощью команды BX. Набор регистров в состоянии Thumb сокращен по сравнению с набором регистров, доступных в состоянии ARM. Все возможные регистровые модели для состояния Thumb показаны в таблице 5.2.
В кодах операций большинства команд Thumb под номер регистра отведено только 3 бита, поэтому прямое обращение возможно только к восьми регистрам: R0 – R7. Регистры R8 – R12 доступны только через специальные команды загрузки. Регистры SP и LR выполняют фиксированные функции указателя вершины стека и регистра связи соответственно. Для работы с этими регистрами в состоянии Thumb имеются специальные команды.
Таблица 5.2 Регистровая модель процессора ARM7TDMI в состоянии Thumb