Запись данных по абсолютному адресу

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

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

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

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

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

1 ответ

Решение

Вам необходимо загрузить адрес получателя в реестр. Я предполагаю что 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.

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

Синтаксис ldr rX, =val объясняется на страницах с информацией об ассемблере Gnu. Как правило, он будет преобразован в следующее,

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

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

Вы не можете использовать синтаксис str r4,[=VTOR] так как синтаксис equals является только сокращенным для использования с 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] на самом деле писать по этому адресу.

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

Другие вопросы по тегам