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

文章目录

    • ARM64 BFI 使用介绍
      • BFI 使用示例
      • memset 对 BFI 的使用

上篇文章:ARM64 常见汇编指令学习 16 – ARM64 SMC 指令

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 指令

你可能感兴趣的:(#,ARM,常见汇编指令学习,BFI,BFI,指令,bfi,与,memset)