Запись данных по абсолютному адресу
В настоящее время я немного поиграюсь с ассемблером на микроконтроллере 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, который может иметь больший диапазон.