Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top