我目前正在使用Cortex-M3微控制器上的汇编程序。我不确定这是否重要,但是你走了。
我需要将值写入内存中的某个地址。这是我试过的:
LDR R4, =__cs3_interrupt_vector_cortex_m
STR R4, [=VTOR]
但似乎我需要引用相对于PC寄存器的VTOR地址。问题是,是否有一种方法可以不引用地址relativ并让它自动执行(因此它基本上看起来像我的方法)。
我正在使用GNU汇编程序。
答案 0 :(得分:4)
您需要将目标地址加载到寄存器。我假设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是加载商店架构。您不能在加载和存储指令中使用内存操作数。这简化了CPU设计,但与M68K和x86汇编器不同。
Gnu assembler info pages中解释了语法ldr rX, =val
。通常它会转换为以下内容,
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]
这样的指令来实际写入该地址。
常量在指令内编码,因此常量范围非常有限,尤其是在 thumb 模式下。我猜您使用的是 thumb2 ,可能会有更多范围。