我使用的是due板,即cortex-m3,使用thumb 2。我需要使用一堆IO端口,这些端口的地址都以0x 400 E开头,如0x 400 E0 E3 C等。我使用一个寄存器来存储这些地址。当我这样做很多次时,我用地址400 E加载寄存器的上半部分。如何在不干扰地址上半部分的情况下,将地址的下半部分与立即的16位值一起加载。
这是可行的-
movw r8, #400E
movt r8, 0E3C
我只想执行第二个指令一次,但问题是每次我调用movw时,它都会将寄存器的上半部分重置为0。我需要一个单一的指令,将加载一个寄存器的下半部分,而不干扰上半部分。
1条答案
按热度按时间gojuced71#
如果寄存器接近,则使用索引。即
str rn, [rB, #offset]
。*offset(偏移量)是generous +12bits。加载/存储地址模式旨在有效地处理结构。您可以将寄存器库视为一个结构。
rB
是寄存器组的基索引;可能是 * 0x 400 e0 e00 *。如果范围很大,您可能需要在基
rB
中屏蔽几个位(参见bic
和orr
)。也就是说,如果你有 *rB = 0x 400 e0000 *(访问0x 400 e0 fff),你需要 * 0x 400 ef 010 *,那么,bfc
和bfi
也很有用,但如果算法允许,可以保留多个rB
寄存器。