语法规则
__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
来使用=
表示写,+
表示读写,&
表示独占寄存器;r
q
表示通用寄存器,w
表示向量寄存器影响部分
cc
表示修改了状态寄存器标志位memory
表示修改了内存值v0
x1
表示修改了指定寄存器的值
示例
__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"
);