将数据写入绝对地址

问题描述 投票:2回答:2

我目前正在用Cortex-M3微控制器上的汇编器进行测试。我不确定这是否重要,但是您可以。

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

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

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

我正在使用GNU汇编器。

assembly cortex-m3 thumb
2个回答
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是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,它可能具有更大的范围。

0
投票

我如何使用ARM汇编器将值0x12345678写入RAM存储器位置0x20000000。

© www.soinside.com 2019 - 2024. All rights reserved.