PSR пересылки (MRS, MSR)
Эти команды будут выполнены, если условие истинно. Все различные условия их выполнения перечислены в табл. 6. Команды MRS и MSR являются одной из форм команд обработки данных и реализуются с помощью команд TEQ, TST, CNM и CMP, но без установленного флага S. Машинный код обеих команд приведен на рис.20.
Эти команды позволяют работать напрямую с регистрами CPSR и SPSR. Команда MRS позволяет скопировать содержимое регистров CPSR или SPSR_<режим> в любой из регистров общего назначения. В свою очередь, команда MSR выполняет обратные действия: копирование содержимого любого их регистров общего назначения в регистры CPSR или SPSR_<режим>.
Кроме того, команда MSR позволяет записать константу в поля только флагов условий (N, Z, C и V) регистров CPSR и SPSR_<режим> без воздействия на их остальные биты (управляющие биты). В этом случае старшие четыре бита 32-битной константы записываются в соответствующие четыре старших бита необходимого PSR регистра.
Операнды команд
В непривилегированном режиме управляющие биты регистра CPSR защищены от всяких изменений, поэтому могут быть изменены только флаги условий этого регистра. В свою очередь, в привилегированном режиме указанные биты полностью доступны для изменений.
Следует отметить тот факт, что в программе пользователя недопустимо изменение состояния бита T регистра CPSR, в противном случае процессор окажется в непредсказуемом состоянии.
Доступ к регистру SPSR зависит от режима процессора. Например, регистр SPSR_FIQ доступен только тогда, когда процессор находится в режиме FIQ.
Недопустимо использование регистра R15 (PC) в качестве регистра-источника или регистра-приемника в полях этих команд.
Также бесполезно пытаться получить доступ к регистру SPSR в непривилегированном режиме - в этом режиме указанный регистр не существует.
Рис. 20. PSR пересылки
Зарезервированные биты
В ядре ARM7TDMI определены только 12 бит регистра PSR: N, Z, C, V, I, F, T и M[4:0]. Остальные биты - зарезервированы для новых версий процессоров. На рис. 9 приведено полное описание всех битов PSR.
С целью максимальной совместимости между программами для ARM7TDMI и новых версий процессоров на основе ядра ARM, должны соблюдаться следующие правила:
- зарезервированные биты должны сохраняться в неизменном состоянии при изменении содержимого PSR;
- программа не должна учитывать зарезервированные биты PSR при проверке его состояния (или его флагов), так как в новых версиях процессоров эти биты уже могут быть реализованы;
Когда изменяются управляющие биты регистра PSR, должны использоваться операции типа чтение-модификация-запись. Это реализуется в следующем порядке:
- соответствующие биты регистра PSR копируются в один из регистров общего назначения Rd с помощью команды MRS;
- выполняется модификация необходимых битов в выбранном регистре Rd;
- производится запись этого модифицированного значения из Rd обратно в регистр PSR, используя команду MSR.
Примеры
Следующая ниже последовательность команд вызывает смену режима работы ядра:
MRS R0,CPSR ; Сохранить копию CPSR в R0
BIC R0,R0,#0x1F ; Очистка битов режима ядра
ORR R0,R0,#new_mode ; Выбор нового режима ядра (new_mode)
MSR CPSR,R0 ; Записать в CPSR модифицированное значение
|
В случае, когда необходимо всего лишь изменить флаги условия выполнения в PSR, то необходимое значение может быть записано непосредственно в это поле флагов без воздействия на остальные управляющие биты PSR. Следующая ниже команда устанавливает флаги N, Z, C и V:
MSR CPSR_flg,#0xF0000000 ; Установить все флаги
; не меняя значения зарезервированных флагов
; и битов управления состоянием ядра.
|
Недопустима запись всей 8-битной константы в регистр PSR, так как в этом случае невозможно сохранить состояние зарезервированных битов.
Число машинных тактов выполнения
Команды PSR пересылок выполняются за 1S тактов, где S зависит от типа машинных тактов.
Синтаксис в ассемблере
- MRS - пересылка содержимого PSR в регистр общего назначения
MRS{cond} Rd,<psr>
- MSR - пересылка содержимого регистра в PSR.
MRS{cond} <psr>,Rm
- MSR - пересылка содержимого регистра только в поле флагов PSR.
MRS{cond} <psrf>,Rm
В регистре Rm только старшие четыре бита определяют воздействие на флаги PS.
- MSR - пересылка константы только в поле флагов PSR.
MRS{cond} <psrf>,<#выражение>
Выражение должно быть вычисляем 32-битным числом, у которого старшие четыре бита определяют то, какие флаги PSR будут установлены/сброшены.
{cond}: |
двухсимвольная мнемоника условия выполнения команды (см. табл. 6). |
Rd и Rm: |
выражения, которые определяют номер регистра общего назначения (кроме регистра R15). |
<psr>: |
один из регистров CPSR, CPSR_all, SPSR, SPSR_all (CPSR и CPSR_all, SPSR и SPSR_all - синонимы). |
<psrf>: |
регистр CPSR_all или регистр SPSR_all. |
<#выражение>: |
если это поле используется, то ассемблер попытается сгенерировать команду сдвига 8-битной константы в соответствии с указанным выражением. Если это невозможно, то возникнет ошибка. |
Примеры
В непривилегированном режиме эти команды выполняются следующим образом:
MSR CPSR_all,Rm ; CPSR[31:28] <- Rm[31:28]
MSR CPSR_flg,Rm ; CPSR[31:28] <- Rm[31:28]
MSR CPSR_flg,#0xA0000000 ; CPSR[31:28] <- 0xA
;(установить N,C; сбросить Z,V)
MRS Rd,CPSR ; Rd[31:0] <- CPSR[31:0]
|
В привилегированном режиме эти команды выполняются следующим образом:
MSR CPSR_all,Rm ; CPSR[31:0] <- Rm[31:0]
MSR CPSR_flg,Rm ; CPSR[31:28] <- Rm[31:28]
MSR CPSR_flg,#0x50000000 ; CPSR[31:28] <- 0x5
;( установить Z,V; сбросить N,C)
MRS Rd,CPSR ; Rd[31:0] <- CPSR[31:0]
MSR SPSR_all,Rm ; SPSR_<режим>[31:0] <- Rm[31:0]
MSR SPSR_flg,Rm ; SPSR_<режим>[31:28] <- Rm[31:28]
MSR SPSR_flg,#0xC0000000 ; SPSR_<режим>[31:28] <- 0xC
;( установить N,Z; сбросить C,V)
MRS Rd,SPSR ; Rd[31:0] <- SPSR_<режим>[31:0]
|
<---- Вернуться к Системе команд --->
|