assembly - 将数据写入绝对地址

标签 assembly cortex-m thumb

我目前正在 Cortex-M3 微 Controller 上使用汇编器。我不确定这是否重要,但就这样吧。

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

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 assembler info pages 中进行了解释。一般会转换成下面的样子,

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 ,它可能有更大的范围。

关于assembly - 将数据写入绝对地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20005395/

相关文章:

c++ - 数组到C++函数(使用ASM)读取错误

从使用 __asm 定义的 ARM 函数调用 C 函数

cortex-m - Cortex-M23/33 的 TrustZone 与 Cortex-A 的 TrustZone

linux - 如何仅编译 ARM32 二进制文件(没有拇指)

gcc - 这是 GCC 中的错误还是我的代码错误?

assembly - 计算字符串的长度然后添加到 cx

c - 在理解从 C 代码生成的基本汇编代码方面需要帮助

c - 如何将包含 32 位 asm 的 C 程序编译成 .o 文件?

gcc - STM32F030启动时出现硬故障,__ libc_init_array

assembly - 为什么前向引用 ADR 指令在 Thumb 代码中以偶数偏移进行汇编?