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

Сохранение не пустого подмножества рон (Store Multiple Increment After)

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

STMIA <Rn>!, <registers>

Формат команды представлен на рис. 2.

Описание

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

! – вызывает обратную запись в базовый регистр. Является обязательным

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

Как минимум один из регистров должен быть включен в данный список. Если все биты bits[0:7] установлены в 0, то результат непредсказуем.

Регистры хранятся в следующей последовательности: регистр с младшим номером записывается в память по начальному адресу (start_adress), в то время как регистр с наибольшим номером записывается в ячейки памяти с наибольшим адресом (end_address).

Start_address – это значение, хранящееся в базовом регистре <Rn>. Последующие адреса формируются посредством прибавления к предыдущему адресу значения 4. Каждому регистру описанному в <registers> соответствует 1 адрес.

Значение end_address на 4 меньше суммы значения базового регистра и количества регистров, описанных в <registers>, умноженного на 4.

По завершению выполнения инструкции начение базового регистра <Rn> увеличивается на 4 столько раз, сколько регистров описано в <registerrs>.

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

Инструкция STMIA полезна при сохранении блоков информации. В комбинации с инструкцией LDMIA (Load Myltiple) она предоставляет эффективный механизм блочного копирования.

Примечания

Если регистр <Rn> занесен в <registers> и определена обратная запись, то:

- если <Rn> имеет самый младший номер в списке, то будет сохранено оригинальное значение <Rn>

- в противном случае, сохраненное значение <Rn> - непредсказуемо

Выравнивание

Инструкции STMIA игнорируют два младших значащих бита адреса

Примеры

STMIA R0!,{R6,R7}

// Сохранение значений регистров R6, R7 по адресу, записанному в регистре R0, увеличение значения R0 на 8

STMIA R3!,{R3,R5,R7}

// Сохранение значений регистров R3, R5 и R7 по адресу, записанному в регистре R3, увеличение значения R3 на 12

STRARM

Команда сохранения регистра в памяти(Store Register )

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

STR {cond} <Rd> , <addressing_mode>

Описание

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

<Rd> – регистр-источник(см. таблицу 1).

<addressing mode> – способ адресации, определяет I, P, U, W, Rn.

Команда STR сохраняет слово из регистра Rd в память по адресу, указанному в <addressing_mode>.

Действие

Команда будет выполнена, если условие (<cond>) истинно. Адрес ячейки памяти, используемой в этой команде, вычисляется посредством сложения/вычитания с некоторым смещением относительно указанного базового регистра. Смещение относительно базового регистра может быть задано либо в виде 12-битной ෣онстанты, указанной в коде команды, или в виде второго регистра-операнда, а само смещение может быть либо добавлено (U=1), либо вычтено (U=0) из базового регистра Rn. Такие модификации смещения могут быть выполнены либо до выполнения пересылки (пред-индексация, P=1) или после нее (постиндексация, P=0).

Бит W позволяет выбрать режим адресации: инкремент или декремент. Модифицированное значение базового адреса либо записывается обратно в него же (W=1), либо остается без изменений (W=0). В случае постиндексной адресации бит W теряет смысл и поэтому обнуляется.

Недопустимо использование регистра R15 в качестве базового регистра (Rn), если в команде передаче данных бит перезаписи W=1 (write-back). Если W=0 и R15 используется в качестве базового регистра, то необходимо помнить, что этот регистр хранит адрес текущей команды.

Недопустимо использование R15 в качестве регистра, определяющего смещение. Если в команде записи регистра в память (STR) регистр R15 используется вместо регистра-источника (Rd), то сохраненное этой командой значение будет равно адресу команды плюс 12 байт.

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

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

Примеры

STR R1,[R2,R4]! // Сохранить косвенно R1 по адресу в R2+R4

              // (оба - регистры) и записать этот                                                                 //  адрес в R2

STR R2,[R1, #0x100] // Записать слово из регистра R2 в память по адресу,                                             полученному сложением содержимого регистра R1                                             и константы 0100.

STR R2,[R5], #8 // Записать слово из регистра R2 в память по                                            адресу R5, когда R5=R5+8.

STR(1) – THUMB