ARM 汇编指令:UBFX
UBFX是 ARM 架构中的一条汇编指令,全称是Unsigned Bit Field Extract,即无符号位域提取。
1. 指令格式
UBFX <Rd>, <Rn>, #<lsb>, #<width>Rd:目标寄存器,用于存放提取后的结果。Rn:源寄存器,存放要提取位域的数据。lsb:要提取的位域的最低有效位位置(从 0 开始计数)。width:要提取的位域的宽度(1 到 32 位)。
2. 功能说明
该指令从源寄存器Rn中提取一个连续的位域,从指定的lsb位置开始,提取长度为width的位,然后将这个位域零扩展到 32 位,存入目标寄存器Rd。
操作伪代码:
Rd = ZeroExtend(Rn[lsb + width - 1 : lsb])约束条件:
0 ≤ lsb ≤ 311 ≤ width ≤ 32 - lsb- 如果
width为 0,则行为是不可预测的(在 ARMv6T2 及更高版本中,width=0表示width=32,但最好显式写 32)。
3. 举例
假设R1 = 0xABCD1234,执行以下指令:
UBFX R0, R1, #4, #8lsb = 4:从第 4 位开始(bit4)。width = 8:提取 8 位。- 提取过程:
- 源数据
0xABCD1234二进制位 4 到 11(共 8 位)是:
从 bit4 到 bit11 对应0xABCD1234中的半字节:0xABCD1234二进制(部分相关位):
bit11~bit4:0011 0010(对应十六进制0x32)。 - 提取后,零扩展为 32 位:
0x00000032。
- 源数据
- 结果:
R0 = 0x00000032
4. 与其它指令的关系
与
UBFX对应的是SBFX:SBFX是带符号位域提取,提取后会进行符号扩展,而不是零扩展。与移位、AND 指令的比较:
例如UBFX R0, R1, #4, #8等价于:MOV R0, R1, LSR #4 ; 右移 4 位,将 bit4 移到 bit0 AND R0, R0, #0xFF ; 保留低 8 位但
UBFX是一条指令完成,效率更高。
5. 支持的架构
- ARMv6T2 及更高版本(包括 Thumb-2 指令集)。
- 在 AArch64 中,有类似的
UBFX指令,但语法略有不同(在 64 位寄存器上操作)。
6. 常见用途
- 从打包的数据结构中提取特定字段(如协议头、标志位等)。
- 替代移位和掩码操作,提高代码可读性和执行效率。
- 硬件寄存器位域提取(如外设状态寄存器)。
示例应用
; 假设 R1 存放一个 32 位数据,其中位域 [15:8] 表示“长度字段” UBFX R2, R1, #8, #8 ; 提取位 15~8 到 R2,无符号 ; 现在 R2 中即为长度值(0~255)这条指令在嵌入式编程、驱动开发中经常用到,特别是在处理硬件寄存器或数据包解析时。