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

Команда множественной загрузки( Load Multiple Increment)

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

LDMIA <Rn>!, <registers>

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

Описание

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

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

Команда LDMIA(Load Multiple Increment After) загружает непустое подмножество, или возможно все, регистры общего назначения последовательно из памяти.

! –определяет будет ли производится запись в базовый регистр, и этот знак не опциональный. ( ! – разрешить запись вычисленного адреса обратно в базовый регистр). Во всех случаях, где не требуется модификация базового адреса (! – отсутствует), в Rn сохранится начальный адрес, кроме случая, когда этот регистр есть в списке передаваемых (<reglist>) в команде множественной загрузки, то тогда содержимое Rn будет перезаписано новым прочитанным значением.

Хотя бы один регистр должен быть загружен. Если биты от 7 до 0 все выставлены в 0, то результат НЕ ОПРЕДЕЛЕН.

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

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

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

Получается, что значение базового регистра <Rn> инкрементируется четырехкратным количеством регистров, содержащихся в <registers>.

Поддерживаются только с младшие слова регистров: (R0 - R7).

Действие

Рассмотрим общий случай: LDMIA Rn!,{Rb,Rc}. Действие будет следующим: (Rb)<-(Rn);(Rc)<-(Rn+4);Rn:=Ra+2*4.

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

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

Примеры

LDMIAR0!,{R2-R4,R7}

В регистры R2,R3,R4,R7 последовательно записываются значения из памяти, а именно: R2<-(R0);R3<-(R0+4);R4<-(R0+8);R7<- (R0+12) ;R0:=R0+16.

LDMIA R1,{R0-R2}

Происходит следующее: address:=R1;R0<-(address);R1<-(address+4);R2<-(address+8).

LDRARM

Команда записи слова в регистр (Load Register)

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

LDR {<cond>} <Rd>, <addressing mode>

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

Описание

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

<Rd> – регистр результата (см. таблицу 1).

<addressingmode> – способ адресации, определяетI,P,U,W,Rnиaddr_modeбиты команды.

Команда LDR загружает слово из памяти по адресу, вычисленному с помощью <addressing mode>, и записывает его в регистр Rd. Если адрес не равен длине слова, то:

Для системы памяти Little-Endian циклический сдвиг вправо на 8 значения битов [1:0] адреса , заставляет адресованный байт занять место последнего значащего байта регистра.

Для системы памяти Big-Endian сдвиг заставляет адресованный байт занять биты [31:24] или биты [15:8] регистра, в зависимости от того, какое значение 0 или 1 соответственно имеет бит [0] адреса.

Если PC определен как регистр <Rd>, команда загружает слово, которое обрабатывается как адрес, а затем обращается по этому адресу. В ARM архитектуре версий 5 и выше, после этого обращения, бит [0] загруженного значения, определяет в каком из двух режимов: ARM или THUMB продолжится выполнение команды, даже если команда BX (loaded_value) была выполнена. В ранних версиях архитектуры биты [1:0] загруженного значения игнорируются и выполнение команды продолжается в режиме ARM, даже если команда MOV PC, (loaded_value) была выполнена.

Примеры

LDRR1, [R0]

в регистр R1 записывается значение хранящееся по адресу R0.

LDRR8, [R3, #4]

в регистр R8 записывается значение хранящееся по адресу R3 + 4.

LDRR8, [R3, -#4]

в регистр R8 записывается значение хранящееся по адресу R3 - 4.

LDRR8, [R3,R5]

в регистр R8 записывается значение хранящееся по адресу R3 +R5.

LDRR8, [R3],R2

в регистр R8 записывается значение хранящееся по адресу R3, затемR3 =R3 +R2.

LDR(1) – THUMB