Запись данных по абсолютному адресу
Вопрос
В настоящее время я немного поиграл с ассемблером на микроконтроллере Cortex-M3.Я не уверен, важно ли это, но вот, пожалуйста.
Мне нужно записать значение по определенному адресу в памяти.Вот что я попробовал:
LDR R4, =__cs3_interrupt_vector_cortex_m
STR R4, [=VTOR]
Но, похоже, мне нужно сослаться на адрес VTOR относительно регистра PC.Вопрос в том, есть ли способ не ссылаться на относительный адрес и позволить этому выполняться автоматически (чтобы это в основном выглядело как мой подход).
Я использую GNU Assembler.
Решение
Вам необходимо загрузить адрес назначения в реестр.Я предполагаю , что 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.
РУКА / Большой палец /Thumb2 - это загрузка-накопитель архитектура.Вы не можете использовать операнды памяти в инструкциях загрузки и сохранения.Это упрощает конструкцию процессора, но отличается от M68K и x86 assembler.
Синтаксис ldr rX, =val
объясняется в Информационные страницы Gnu assembler.Как правило, он преобразуется в следующее,
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]
чтобы на самом деле написать по этому адресу.
Константы кодируются внутри инструкции, поэтому диапазон констант очень ограничен, особенно в большой палец режим.Я предполагаю, что вы используете большой палец 2 который может иметь больший радиус действия.