将数据写入绝对地址

时间:2013-11-15 16:08:11

标签: assembly cortex-m3 thumb

我目前正在使用Cortex-M3微控制器上的汇编程序。我不确定这是否重要,但是你走了。

我需要将值写入内存中的某个地址。这是我试过的:

LDR     R4, =__cs3_interrupt_vector_cortex_m
STR     R4, [=VTOR]

但似乎我需要引用相对于PC寄存器的VTOR地址。问题是,是否有一种方法可以不引用地址relativ并让它自动执行(因此它基本上看起来像我的方法)。

我正在使用GNU汇编程序。

1 个答案:

答案 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 ,可能会有更多范围。