语法规则

__asm__ __volatile__(
    "mov x1, #2\n"
    "add %x[x], %x[y], x1\n"    // 汇编代码
    : [x] "+&r" (x)             // 输出部分
    : [y] "r" (y)               // 输入部分
    : "cc", "memory", "x1"      // 影响部分
);

汇编部分

每行以\n结尾

输出、输入部分

[foo] "+&r" (), 顺序声明,其中[]为别名,""内为描述,()为引用变量

  • [foo]内的别名可以在汇编中按照%x[foo]来使用,如果省略则按照%0来使用
  • =表示写,+表示读写,&表示独占寄存器;
  • rq表示通用寄存器,w表示向量寄存器

    影响部分

  • cc表示修改了状态寄存器标志位
  • memory表示修改了内存值
  • v0x1表示修改了指定寄存器的值

示例

__asm__ __volatile__(     
    "sxtl v18.4s, %0.4h\n"
    "sxtl2 v19.4s, %0.8h\n"
    ".inst 0x4f80e0d2 // sdot v18.4s, v6.16b, v0.4b[0]\n"
    ".inst 0x4f80e073 // sdot v19.4s, v3.16b, v0.4b[0]\n"
    "sqxtn %0.4h, v18.4s\n"
    "sqxtn2 %0.8h, v19.4s\n"
    : "+&w" (sum)
    : "w" (x), "w" (s8_0), "w" (s8_1)
    : "memory", "v18", "v19"
);