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

Загрузить в сопроцессор из памяти (Load Coprocessor)

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

LDC2{L} <coproc>, <CRd>, <addressing_mode>

Описание

<L> - устанавливает бит N в 1 и определяет длинную нагрузку.

<coproc> - определяет имя сопроцессора и помещает номер сопроцессора в поле cp_num (см. таблицу 1).

<CRd> - определяет, что предназначение сопроцессора совмещает инструкции.

<addressing_mode> - определяет P, U, Rn, Вт и 8_bit_word_offset биты инструкции.

Действие

Если условие ConditionPassed(cond) выполнено, то address = начальному адресу, load Memory[address,4] для сопроцессора[cp_num], в то время как (NotFinished(Coprocessor[cp_num])), address = address + 4, load Memory[address,4] для сопроцессора[cp_num], assert address == конечному адресу.

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

Команда LDC2 используется для чтения регистров сопроцессоров непосредственно из/в память. Ядро ARM7TDMI передает сопроцессору адрес ячейки памяти, а сопроцессор в свою очередь возвращает ядру данные и их количество в словах.

Примеры

LDC2 p1,c2,table ; Загрузить регистр с2 сопроцессора #1 из ячейки

; памяти по адресу "table",

; используя адрес, относительно содержимого PC.

LDM(1) – ARM

Загрузить сразу несколько регистров (Load Multiple)

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

LDM{<cond>}<addressing_mode> <Rn>{!}, <registers>

Описание

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

<addressing_mode> - определяет P, U, Rn, Вт и 8_bit_word_offset биты инструкции.

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

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

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

Действие

if ConditionPassed(cond) then

address = start_address

for i = 0 to 14

if register_list[i] == 1 then

Ri = Memory[address,4]

address = address + 4

if register_list[15] == 1 then

value = Memory[address,4]

if (architecture version 5 or above) then

pc = value AND 0xFFFFFFFE

T Bit = value[0]

else

pc = value AND 0xFFFFFFFC

address = address + 4

assert end_address = address - 4

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

Команда LDM(1) используется для загрузки блоков, операций над стеком и процесса выхода.

Примеры

LDMFD SP!,{R0,R1,R2} ; Извлечь из стека 3 регистра

LDMFD SP!,{R15} ; R15 <- (SP),CPSR не изменяется

LDM(2) – ARM

Загрузить сразу несколько регистров (Load Multiple)

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

LDM{<cond>}<addressing_mode> <Rn>, <registers_without_pc>^

Описание

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

<addressing_mode> - определяет P, U, Rn, Вт и 8_bit_word_offset биты инструкции.

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

<registers_without_pc > – Список регистров, отделенных запятыми и окруженный {и}. Этот список не должен входить в PC, и определяет набор регистров, которые будут загружены командой LDM.

^ - Для команды LDM, которая не загружает PC, это указывает, что регистры в режиме пользователя могут быть загружены.

Действие

if ConditionPassed(cond) then

address = start_address

for i = 0 to 14

if register_list[i] == 1

Ri_usr = Memory[address,4]

address = address + 4

assert end_address == address - 4

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

Команда LDM(2) используется для загрузки регистров в режиме пользователя, когда процессор находится в привилегированном режиме Данная команда загружает непустое подмножество регистров общего назначения в режиме пользователя от последовательных местоположений памяти.

Примеры

LDMFD SP!,{R15}^ ; R15 <- (SP), CPSR <- SPSR_режим

; (только в привилегированном режиме).

LDM(3) – ARM