Скачиваний:
75
Добавлен:
01.05.2014
Размер:
1.22 Mб
Скачать

Команда обмена данными с сопроцессором

Примеры

STCEQL p2,c3,[R5,#24]! ; Условно записать содержимое c3 ; сопроцессора #2

; в ячейку памяти по адресу R5+24.

; После чего записать в R5 значение ; R5+24

; и применить длинную передачу

; (возможно, блочную запись данных).

STMARM

Команда группового хранения (Store Multiple )

Синтаксис в ассемблере

STM {cond}<FD|ED|FA|EA|IA|IB|DA|DB>Rn{!},<registers>{^}

Описание

<cond> – поле условия (см. таблицу 1).

<Rn> – выражение, которое определяет номер регистра общего назначения (см. таблицу 1).

<registers> – список регистров (см. таблицу 1).

{!} – разрешить запись вычисленного адреса обратно в базовый регистр (устанавливает в команде в единицу бит W).

{^} – установить бит S (обновление CPSR), наряду с загрузкой регистра PC, или же требуется передача банка пользователя с переключением в привилегированный режим.

Команда выполняет пересылку данных из базовых регистров в память. Действие

Команда будет выполнена, если условие (<cond>) истинно. Адрес передачи определяется содержимым базового регистра (Rn), битом пред/постиндексации (P) и битом направления (U). Регистры передаются в направлении от младшего к старшему. Использование регистра R15 в качестве базового регистра (Rn) недопустимо.

Для каждого режима адресации существует своя мнемоника в ассемблере, в зависимости от необходимости использования стеков:

Имя

Со стеками

Без стеков

Бит L

Бит P

Бит U

Запись с пре-инкрементом

STMFA

STMIB

0

1

1

Запись с пост-инкрементом

STMEA

STMIA

0

0

1

Запись с пре-декрементом

STMFD

STMDB

0

1

0

Запись с пост-декрементом

STMED

STMDA

0

0

0

Соответствия между мнемониками и состояниями битов команд

Cуффиксы FD, ED, FA, EA определяют пред/пост-индексацию, при этом бит U определяет направление индексации. Суффиксы F и E определяют "полный" или "пустой" стек. Суффиксы A и D определяют направление роста стека.

Cуффиксы IA, IB, DA, DB формируют передачи, в которых не требуется работа со стеками, т.е. требуется просто постинкремент, преинкремент, постдекремент и предекремент.

Использование

Команда STMиспользуется, когда необходимо сохранить регистры в памяти.

Примеры

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            // Этот вложенный вызов перезапишет R14LDMED SP!,{R0-R3,R15} // и восстановит R0…R3 и PC

STMIATHUMB