【ARM64 常见汇编指令学习 17 -- ARM64 BFI 指令】


上篇文章: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 的值为 0x12345678

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

主公CodingCos

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值