繁体   English   中英

写数据到绝对地址

[英]Writing data to absolute address

我目前正在 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 是一种加载存储架构。 您不能在加载和存储指令中使用内存操作数。 这简化了 CPU 设计,但与 M68K 和 x86 汇编器不同。

语法ldr rX, =valGnu 汇编程序信息页中进行了解释。 一般会转换成下面这样,

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]这样的另一条指令来实际写入该地址。

常量在指令中编码,因此常量范围非常有限,尤其是在拇指模式下。 我猜你正在使用可能有更大范围的拇指2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM