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

Assembly 在thumb2中设置寄存器的下半部分,assembly,arm,cortex-m3,cortex-m,Assembly,Arm,Cortex M3,Cortex M,我正在使用due板,即cortex-m3,使用thumb2。我需要使用一组IO端口,这些端口都有以0x400E开头的地址,比如0x400E0E3C等。我使用寄存器来存储这些地址。当我多次这样做时,我加载寄存器的上半部分,地址为400E。如何在不干扰地址的上半部分的情况下,使用立即16位值加载地址的下半部分 这很有效- movw r8#400E movt r8,0E3C 我只想执行第二个指令一次,但问题是每次调用movw时,它都会将寄存器的上半部分重置为0。我需要一条指令来加载寄存器的下半部分,而

我正在使用due板,即cortex-m3,使用thumb2。我需要使用一组IO端口,这些端口都有以0x400E开头的地址,比如0x400E0E3C等。我使用寄存器来存储这些地址。当我多次这样做时,我加载寄存器的上半部分,地址为400E。如何在不干扰地址的上半部分的情况下,使用立即16位值加载地址的下半部分

这很有效- movw r8#400E movt r8,0E3C


我只想执行第二个指令一次,但问题是每次调用movw时,它都会将寄存器的上半部分重置为0。我需要一条指令来加载寄存器的下半部分,而不干扰上半部分。

如果寄存器接近,则使用索引。例如,
strrn,[rB,#offset]
。偏移量相当大

加载/存储地址模式旨在有效地处理结构。您可以将注册库视为一个结构
rB
是注册银行的基本索引;可能是0x400E00

如果范围太大,您可能需要在基带
rB
中屏蔽一些位(请参见
bic
orr
)。也就是说,如果您有rB=0x400e0000(访问0x400e0fff)并且需要0x400ef010,那么


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

没有单臂指令来加载低16位而不影响前16位。您可以旋转16,移动到上半部分,然后再次旋转16,但这并不比使用2个16位立即移动更好。另一种解决方案是将端口地址放在表中,用表地址加载寄存器,用寄存器+偏移地址加载。movw+movt+ldr可能比ldr+ldr更快。只要想到一种更好更简单的方法,我可以在寄存器中填充0x400E0000,使用下半部分作为和偏移量,只加载内存位置。注意-这不起作用,我得到的偏移量超出范围。您可以使用
BFI
,但您需要一个备用的中间寄存器,以便在插入即时数据之前将其加载到,而且每次加载仍然有两条指令,所以你可以只使用
MOVT
。是的,偏移量的工作原理是,我的地址的前5个十六进制数字是相同的,留下一个12位的地址,适合。
orr rB, rB, #0xf000 # select high portion
ldr rn, [rB, #10]   # offset in high portion.
bic rB, rB, #0xf000 # back to low portion.