; 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.
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.
1条答案
按热度按时间wvt8vs2t1#
您需要将目的地址加载到寄存器。我假设
VTOR
是一个内存地址或'C'指针,__cs3_interrupt_vector_cortex_m
是一个常量。也就是说,你想写一个32位的常量到一个地址。如果是这样的话字符串
ARM/Thumb/Thumb 2是一个 * 加载-存储 * 架构。不能在加载和存储指令中使用内存操作数。这简化了CPU设计,但与M68 K和x86汇编程序不同。
语法
ldr rX, =val
在Gnu assembler info pages中解释。一般会转换为以下内容,型
.ltorg
* 告诉汇编程序转储文字表;上面代码的 offset 部分。您可以在子例程之间的任何位置添加.ltorg
,等等。不能使用语法
str r4,[=VTOR]
,因为 equals 语法只是用于ldr
的捷径。比如说,型
您可以使用
ldr rX,=VTOR
语法获取寄存器的地址。然后,它需要另一条指令(如str rY, [rX]
)来实际写入该地址。常量被编码在指令内,因此常量范围非常有限,特别是在thumb模式下。我猜你正在使用thumb 2,它可能有更多的范围。