我目前正在用Cortex-M3微控制器上的汇编器进行测试。我不确定这是否重要,但是您可以。
我需要将一个值写入内存中的某个地址。这是我尝试过的:
LDR R4, =__cs3_interrupt_vector_cortex_m
STR R4, [=VTOR]
但是似乎我需要引用相对于PC寄存器的VTOR地址。问题是,是否有一种方法可以不引用相对地址,而让它自动执行(这样基本上看起来像我的方法)。
我正在使用GNU汇编器。
您需要将目标地址加载到寄存器中。我假设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是load-store体系结构。您不能在加载和存储指令中使用内存操作数。这简化了CPU设计,但是与M68K和x86汇编程序不同。
ldr rX, =val
的语法在Gnu assembler info pages中进行了说明。通常它将转换为以下内容,
ldr rX, [pc, #offset]
...
offset: .word val ; your constant is stored here.
pseudo-op .ltorg
告诉汇编器转储文字表;上面代码的offset部分。您可以在子例程之间的任意位置添加.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]
来实际写入该地址。
常量在指令内编码,因此常量范围非常有限,尤其是在thumb
模式下。我猜您正在使用thumb2,它可能具有更大的范围。我如何使用ARM汇编器将值0x12345678写入RAM存储器位置0x20000000。