assembly 将数据写入绝对地址

ubby3x7f  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(104)

我目前正在Cortex-M3微控制器上使用汇编程序。我不知道这是否重要,但给你。
我需要将一个值写入内存中的某个地址。下面是我尝试过的:

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

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

wvt8vs2t

wvt8vs2t1#

您需要将目的地址加载到寄存器。我假设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/Thumb 2是一个 * 加载-存储 * 架构。不能在加载和存储指令中使用内存操作数。这简化了CPU设计,但与M68 K和x86汇编程序不同。
语法ldr rX, =valGnu 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模式下。我猜你正在使用thumb 2,它可能有更多的范围。

相关问题