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