如何将一个 32 位整数拆分为两个 16 位半字

How to split a 32-bit integer to two 16-bit half-words

如何将一个 32 位十六进制数分成两个 16 位十六进制数并存储它们,使低位在第一个寄存器内,高位在第二个寄存器内。

例如,我有一个数据,例如 0xB0B0A0A0,我想在我的代码中将 0xA0A0​​ 提取到 R0,将 0xB0B0 提取到 R1。

在足够现代的 ARM 芯片上,您可以为此目的使用 uxth(无符号扩展半字)指令:

@ assuming R2 = 0xb0b0a0a0
uxth r0, r2, ror #0    @ r0 = 0x0000a0a0
uxth r1, r2, ror #16   @ r1 = 0x0000b0b0

详见ARMv7-M ARM Architecture Reference Manual

如果针对 ARMv6-M 目标进行编程或者如果针对 Thumb 上的代码大小进行优化,则第二条指令可以替换为 lsrs 以减少代码大小:

lsrs r1, r2, #16       @ r1 = 0x0000b0b0

但请注意,这会导致 NZCV 被修改。