如何将一个 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 被修改。
如何将一个 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 被修改。