assembly 在thumb2中设置寄存器的下半部分

8e2ybdfx  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(83)

我使用的是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。我需要一个单一的指令,将加载一个寄存器的下半部分,而不干扰上半部分。

gojuced7

gojuced71#

如果寄存器接近,则使用索引。即str rn, [rB, #offset]。*offset(偏移量)是generous +12bits
加载/存储地址模式旨在有效地处理结构。您可以将寄存器库视为一个结构。rB是寄存器组的基索引;可能是 * 0x 400 e0 e00 *。
如果范围很大,您可能需要在基rB中屏蔽几个位(参见bicorr)。也就是说,如果你有 *rB = 0x 400 e0000 *(访问0x 400 e0 fff),你需要 * 0x 400 ef 010 *,那么,

orr rB, rB, #0xf000 # select high portion
ldr rn, [rB, #10]   # offset in high portion.
bic rB, rB, #0xf000 # back to low portion.

bfcbfi也很有用,但如果算法允许,可以保留多个rB寄存器。

相关问题