2013-11-15 8 views
2

В настоящее время я немного разбираюсь в ассемблере на микроконтроллере Cortex-M3. Я не уверен, что это важно, но здесь вы идете.Запись данных в абсолютный адрес

Мне нужно записать значение в определенный адрес в памяти. Вот что я пробовал:

LDR  R4, =__cs3_interrupt_vector_cortex_m 
STR  R4, [=VTOR] 

Но мне кажется, что мне нужно ссылаться на адрес VTOR относительно регистра ПК. Вопрос в том, есть ли способ не ссылаться на релятивный адрес и позволить этому делать автоматически (чтобы он в основном выглядел как мой подход).

Я использую GNU Assembler.

ответ

4

Вам необходимо загрузить адрес получателя в регистр. Я предполагаю, что VTOR является адресом памяти или указателем 'C', а __cs3_interrupt_vector_cortex_m является константой. Т.е. вы хотите записать 32-битную константу в адрес. Если это так, то,

; Get value __cs3_interrupt_vector_cortex_m to r4 
ldr r4, =__cs3_interrupt_vector_cortex_m 
ldr r5, =VTOR ; address 'VTOR' to r5. 
str r4, [r5] ; write the constant to 'VTOR' address. 

Постановки/Thumb/Thumb2 является нагрузки магазин архитектуры. Вы не можете использовать операнды памяти в инструкциях по загрузке и хранению. Это упрощает дизайн ЦП, но отличается от ассемблера M68K и x86.

Синтаксис ldr rX, =val объясняется в Gnu assembler info pages. Как правило, он будет конвертировать в следующем,

ldr rX, [pc, #offset] 
... 
offset: .word val ; your constant is stored here. 

псевдо-оп .ltorg сообщает ассемблер сбросить буквальную таблицу; смещение часть вышеприведенного кода. Вы можете добавить .ltorg где-нибудь между подпрограммами и т.д.

Вы не можете использовать синтаксис str r4,[=VTOR] как равно синтаксис только укороченный для использования с ldr. Например,

ldr rX,=7   ; is really 'mov rx,#7' in all modes. 
ldr rX,=0xff  ; is 'mov rx,#0xff' for ARM and '[pc,#offset]' for thumb. 
ldr rx,=0x12345678 ; will use the [pc, #offset] for all modes. 

Вы можете использовать синтаксис ldr rX,=VTOR для получения адреса в регистр. Затем он принимает другую инструкцию, например, str rY, [rX], чтобы написать на этот адрес.

Константы кодируются внутри инструкции, поэтому постоянный диапазон очень ограничен, особенно в thumb режим. Я думаю, вы используете thumb2, который может иметь больший диапазон.