【发布时间】:2014-07-04 03:48:51
【问题描述】:
我正在使用正版板,即 cortex-m3,使用 thumb2。我需要使用一堆 IO 端口,它们都有以 0x400E 开头的地址,例如 0x400E0E3C 等。我正在使用寄存器来存储这些地址。当我多次这样做时,我用地址 400E 加载寄存器的上半部分。如何在不影响上半部分的情况下使用立即 16 位值加载地址的下半部分。
这行得通 - movw r8, #400E movt r8, 0E3C
我只想执行第二条指令一次,但问题是每次我调用 movw 时,它都会将寄存器的上半部分重置为 0。我需要一条指令来加载寄存器的下半部分,而无需打扰了上半部分。
【问题讨论】:
-
没有单条ARM指令可以加载低16位而不影响前16位。可以循环16位,移动到上半部分,再循环16位,但这并不比使用2好16 位立即移动。另一种解决方案是将端口地址放在一个表中,用表地址加载一个寄存器,然后用寄存器+偏移地址加载。
-
movw+movt+ldr 可能会比 ldr+ldr 更快。
-
只是想到了一种更好更简单的方法,我可以在寄存器中填充 0x400E0000 并使用下半部分作为偏移量并加载内存位置。 P.S - 那没用,我的偏移量超出了范围。
-
你可以使用
BFI,但是你需要一个备用的中间寄存器在插入它们之前加载立即数,而且每次加载仍然有两条指令,所以你最好使用MOVT. -
是的,偏移量有效,因为我的地址的前 5 个十六进制数字相同,留下一个 12 位地址,适合。
标签: assembly arm cortex-m3 cortex-m