题
我目前正在 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, =val
解释于 Gnu 汇编器信息页面. 。一般会转换成下面的样子,
ldr rX, [pc, #offset]
...
offset: .word val ; your constant is stored here.
这 伪操作 .ltorg
告诉汇编器转储文字表;这 抵消 上面的部分代码。您可以添加一个 .ltorg
子例程之间的任何位置等。
您不能使用语法 str r4,[=VTOR]
作为 等于 语法只是使用的快捷方式 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 可能有更大的范围。
不隶属于 StackOverflow