Передача блоков данных (LDM, STM)
Эти команды будут выполнены, если условие истинно. Все различные условия их выполнения перечислены в таблице 6. Машинный код обеих команд приведен на рис.27.
Рис. 27. Команды блочной передачи данных
Команды передачи блоков данных применяются для чтения (LDM) или записи (STM) любого числа из доступных регистров общего назначения. Обе команды позволяют работать с любыми стековыми моделями памяти: опустошенные или заполненные стеки; "растущие" вверх или вниз стеки. Гибкость этих команд при их применении позволяет быстро и эффективно сохранять или восстанавливать контекст в прерываниях или переключениях задачах (с использованием операционных систем), а также перемещать в памяти большие массивы данных.
Перечень доступных регистров
Эти команды могут перемещать любой из регистров активного банка, а в непривилегированном режиме программы имеют возможность перемещать регистры из банка или в банк пользователя (см. ниже).
Перечень регистров - это 16-битное поле в машинном коде команды, каждый бит которого соотносится с соответствующим регистром общего назначения. Например, если бит 3 этого поля установлен в единицу, то будет перемещено содержимое регистра R3, если сброшен в ноль, то содержимое регистра R3 никуда не будет перемещено. Таким способом можно сформировать любой набор из 16-ти регистров. Но существует единственное ограничение - список не должен быть пустым, т.е. это поле не должно быть заполнено 16-ю нулями.
Примечание: в действительности вместо регистра R15 (для команды STM) сохраняется R15+12, т.е. адрес самой команды STM плюс 12.
Режимы адресации
Адрес передачи определяется содержимым базового регистра (Rn), битом пред/постиндексации (P) и битом направления (U). Регистры передаются в направлении от младшего к старшему, поэтому R15 (если он есть в списке) будет всегда передан в последнюю очередь. Кроме того, порядок размещения регистров таков, что младший регистр будет сохранен (загружен) по младшему адресу в памяти.
На рис. 28…31 изображен порядок передачи регистров, используемых адресов и содержимого этих регистров до и после выполнения команд. Согласно рисункам, R1, R5 и R7, при Rn=0x1000 и требуется пост-модификация базового адреса (W=1).
Во всех случаях, где не требуется модификация базового адреса (W=0), в Rn сохраниться начальное значение 0x1000, кроме случая, когда этот регистр есть в списке передаваемых в команде множественной загрузки, то тогда содержимое Rn будет перезаписано новым прочитанным значением.
Выравнивание адресов
Адрес, указанный в команде, должен быть обязательно выровнен по границе слова (32 бита), иначе команда не будет выполнена. Однако младшие 2 бита этого адреса могут быть использованы системой управления памятью.
Рис. 28. Постинкрементная адресация
Рис. 29. Преинкрементная адресация
Рис. 30. Постдекрементная адресация
Рис. 31. Предекрементная адресация
Применение бита S
Если в командах LDM/STM установлен бит S, то его значение еще зависит от наличия R15 в списке передаваемых регистров и от типа самой команды. Бит S может быть установлен только в тех командах, которые будут выполняться в привилегированном режиме.
- Команда LDM, регистр R15 присутствует в списке передаваемых регистров, установлен бит S (смена режима ядра).
Для команды LDM содержимое регистра SPSR_<режим> передается в CPSR в тот же самый момент, когда загружается R15.
- Команда STM, регистр R15 присутствует в списке передаваемых регистров, установлен бит S (передача в банк пользователя).
Передаваемые регистры извлекаются из пользовательского банка вместо банка, соответствующего текущему режиму работы ядра. Это возможность очень удобна для быстрого сохранения контекста задач (процессов, потоков и т.п.). Бит перезаписи базового адреса не должен использоваться при подобном использовании команды STM.
- Регистра R15 нет в списке передаваемых регистров, установлен бит S (передача в/из банк пользователя).
Для обеих команд LDM и STM происходит передача регистры банка пользователя вместо банка, соответствующего текущему режиму работы ядра. Это возможность очень удобна для быстрого сохранения контекста задач. Бит перезаписи базового адреса не должен использоваться при подобном использовании команды STM. Если используется команда LDM, то необходимо исключить возможность чтения банковых регистров в течение следующего машинного такта (например, можно после команды LDM включить фиктивную команду MOV R0,R0).
Использование R15 в качестве базового регистра
Использование регистра R15 в качестве базового регистра (Rn) недопустимо для обеих команд LDM и STM.
Включение базового регистра в список регистров
Если в команде используется бит перезаписи базового регистра (Rn), то само содержимое этого регистра будете перезаписано в конце второго машинного такта при выполнении самой команды. Во время выполнения команды STM первый регистр из списка записывается в начале второго такта.
Поэтому (для команды STM), если в список передаваемых регистров включен базовый регистр Rn, который помимо того еще и является первым передаваемым в списке регистров, то в реальности будет передано предыдущее неизмененное значение Rn, т.к. этот регистр будет модифицирован после того, как будет передан. Для команды LDM, если Rn есть в списке регистров, прежнее содержимое базового регистра будет всегда перезаписано новым прочитанным значением.
Прерывания во время передачи данных (data aborts)
Чтение или запись по существующему адресу может вызвать проблемы для систем управления памятью. Например, в системах с применением виртуальной памяти запрашиваемые данные могут отсутствовать в физической памяти. Диспетчер памяти может сообщить об этом процессору, вызвав исключительную ситуацию ABORT. В результате чего системное приложение должно решить эту проблему и перезапустить ту команду, выполнение которой вызвало исключительную ситуацию.
Прерывания во время выполнения команды STM
Если во время выполнения команды произошло критическое прерывание (abort exception), то ядро ARM7TDMI не сразу передаст управление обработчику прерывания, а только после того, как полностью завершит команду. При этом диспетчер управления памятью должен самостоятельно позаботиться о безошибочной записи данных в память. Только после смены внутреннего состояния процессора произойдет модификация базового регистра (если в команде разрешена его перезапись), при этом состояние этого регистра может быть восстановлено только программным путем (после того, как будет решена причина прерывания) перед тем, как эту команду можно будет вновь выполнить.
Прерывания во время выполнения команды LDM
Когда во время выполнения команды чтения блока данных произойдет критическое прерывание, то ядро ARM7TDMI модифицирует эту команду таким образом, чтобы было возможно восстановить прежнее состояние регистров.
- Прекращается перезапись регистров в момент возникновения критического прерывания. Однако те регистры из списка, которые были перезаписаны до этого момента, восстановить уже не удастся. Но так как регистр PC всегда размещен в конце списка, то его содержимое всегда можно восстановить.
- Базовый регистр восстановлен уже модифицированным значением, если требуется его перезапись (write-back). Это позволяет быть уверенным в том, что базовый регистр (если он включен в список передаваемых регистров) будет перезаписан до того, как возникнет критическое прерывание.
После того, как управление будет передано обработчику критической ситуации (abort), необходимо программным путем восстановить прежнее значение базового регистра (и решить причину прерывания) перед тем, как повторно выполнить эту команду.
Число машинных тактов при выполнения
Обычная команда LDM выполняется за nS + 1N + 1I, а команда LDM PC - за (n+1)S + 2N + 1I машинных тактов, где S, N и I зависят от типа машинных тактов. STM выполняется за (n+1)S + 2N машинных тактов, где n - число перемещаемых слов.
Синтаксис в ассемблере
<LDM|STM>{cond}<FD|ED|FA|EA|IA|IB|DA|DB>Rn{!},<Rlist>{^}
где:
{cond}: |
двухсимвольная мнемоника условия выполнения команды (см. табл. 6); |
Rn: |
выражение, которое определяет номер регистра общего назначения; |
Rlist: |
список регистров, например: {R0,R2-R7,R10}; |
{!}: |
разрешить запись вычисленного адреса обратно в базовый регистр (устанавливает в команде в единицу бит W). |
{^}: |
установить бит S (обновление CPSR), наряду с загрузкой регистра PC, или же требуется передача банка пользователя с переключением в привилегированный режим. |
Названия режимов адресации
Для каждого режима адресации существует своя мнемоника в ассемблере, в зависимости от необходимости использования стеков. Соответствия между мнемониками и состояниями битов команд приведены в табл. 10.
Таблица 10. Названия режимов адресации
Имя |
Со стеками |
Без стеков |
Бит L |
Бит P |
Бит U |
Чтение с пре-инкрементом |
LDMED |
LDMIB |
1 |
1 |
1 |
Чтение с пост-инкрементом |
LDMFD |
LDMIA |
1 |
0 |
1 |
Чтение с пре-декрементом |
LDMEA |
LDMDB |
1 |
1 |
0 |
Чтение с пост-декрементом |
LDMFA |
LDMDA |
1 |
0 |
0 |
Запись с пре-инкрементом |
STMFA |
STMIB |
0 |
1 |
1 |
Запись с пост-инкрементом |
STMEA |
STMIA |
0 |
0 |
1 |
Запись с пре-декрементом |
STMFD |
STMDB |
0 |
1 |
0 |
Запись с пост-декрементом |
STMED |
STMDA |
0 |
0 |
0 |
Суффиксы FD, ED, FA, EA определяют пред/пост-индексацию, при этом бит U определяет направление индексации. Суффиксы F и E определяют "полный" или "пустой" стек, например, будет ли произведена индексация до или после записи в стек. Суффиксы A и D определяют направление роста стека. Если стек растет вверх (возрастающий), то команда STM вызовет рост стека вверх, а команда LDM - вниз. Если стек растет вниз (убывающий), то - наоборот.
Суффиксы IA, IB, DA, DB формируют передачи, в которых не требуется работа со стеками, т.е. требуется просто Постинкремент, Преинкремент, Постдекремент и Предекремент.
Примеры
LDMFD SP!,{R0,R1,R2} ; Извлечь из стека 3 регистра
STMIA R0,{R0-R15} ; Сохранить все регистры
LDMFD SP!,{R15} ; R15 <- (SP),CPSR не изменяется
LDMFD SP!,{R15}^ ; R15 <- (SP), CPSR <- SPSR_режим
; (только в привилегированном режиме).
STMFD R13,{R0-R14}^ ; Сохранить в стеке регистры
; (только в привилегированном режиме).
|
Нижеследующая последовательность команд может быть использована для сохранения состояния регистров перед вызовом подпрограммы, и восстановления их состояния после выхода из подпрограммы:
STMED SP!,{R0-R3,R14} ; Сохранить R0…R3 для их использования
; и R14 для возврата.
BL somewhere ; Этот вложенный вызов перезапишет R14
LDMED SP!,{R0-R3,R15} ; и восстановит R0…R3 и PC.
|
<---- Вернуться к Системе команд --->
|