上篇文章:ARM64 常见汇编指令学习 16 – ARM64 SMC 指令
下篇文章:ARM64 常见汇编指令学习 18 – ARM64 TST 指令与 条件标志位 Z
ARM64 BFI 使用介绍
ARM64架构的 BFI(Bit Field Insert)指令用于将一个寄存器中的位字段插入到另一个寄存器中的指定位置。这个指令对于位操作很有用。
BFI指令的格式如下:
BFI 目标寄存器,源寄存器,lsb,宽度
- 目标寄存器:将被插入位字段的寄存器。
- 源寄存器:包含要插入的位字段的寄存器。
- lsb:在目标寄存器中插入位字段的最低位的位置。
- 宽度:要插入的位字段的宽度。
例如,考虑以下BFI指令:
BFI x0, x1, #4, #8
这个指令将x1
寄存器的最低8
位插入到x0
的第4
位到第11
位(包括第4位和第11位)。其他位置的位不改变。
在BFI指令中,源寄存器的位字段始终是从最低位开始的。如果你想从源寄存器的中间位置开始插入,你需要先通过其他指令(如LSL或LSR)将源寄存器的位移动到最低位。
BFI 使用示例
mov w0, 0x5678 mov w1, 0x1234 bfi w0, w1, 16, 16
w0 的值为 0x
memset 对 BFI 的使用
通常我们都会使用类似于下面的memset函数:
static void emmc_memset(uint8_t *buff, uint8_t data, uint32_t cnt)
从接口可以看到,对某一块内存按照字节进行填充,我们知道ARM64 寄存器的位宽为64bits, 所以为了提高效率ARM 使用BFI指令对memset 进行了优化,下面截取 memset 汇编实现的关于 BFI指令使用的代码。
lib/libc/aarch64/memset.S
/* 8-bytes aligned */ aligned:cbz x1, x1_zero bfi w1, w1, #8, #8 /* propagate 'val' */ bfi w1, w1, #16, #16 bfi x1, x1, #32, #32 x1_zero:ands x4, x2, #~0x3f b.eq less_64
下面对汇编代码解析:
cbz x1, x1_zero
:这是一个条件分支指令,如果x1寄存器的值为0,就跳转到标签x1_zero处执行。否则就继续执行下面的指令。bfi w1, w1, #8, #8
:这是一个位字段插入指令,它将w1寄存器的最低8位插入到w1的第8位到第15位。这样,w1的最低16位就都设置为了相同的值。bfi w1, w1, #16, #16
:类似地,这个指令将w1的最低16位插入到w1的第16位到第31位。这样,w1的32位就都设置为了相同的值。bfi x1, x1, #32, #32
:最后,这个指令将x1的最低32位插入到x1的第32位到第63位。这样,x1的64位就都设置为了相同的值。
这个代码片段的目的是将x1
寄存器的最低8
位的值复制到x1
的其他位,从而使得x1
的所有位都设置为了相同的值。这对于实现memset
操作有用,因为我们需要将一段内存设置为指定的值。
上篇文章:ARM64 常见汇编指令学习 16 – ARM64 SMC 指令
下篇文章:ARM64 常见汇编指令学习 18 – ARM64 TST 指令与 条件标志位 Z
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/96285.html