基本格式:
asm [ volatile ] (
assembler template //汇编代码
[ : output operands ] /* optional *///输出运算符列表
[ : input operands ] /* optional *///输入
[ : list of clobbered registers ] /* optional *///被修改资源列表
);
int main() {
int a, b, c, d, e;
a = 10;
b = 20;
__asm__("movl %4, %%eax;" //%eax = a; a存在%ecx
"movl %%eax, %0;" //c = %eax;
"movl %5, %1;" //d = b;
"movl %6, %2;" //e = 30;
"mov $1, %4;" //a = 1;
:"=r"(c), "=b"(d), "=r"(e), "=c"(a)
:"3"(a), "m"(b), "i"(30)
);
cout << a << " " << c << " " << d << " " << e << endl;
return 0;
}
%0-%6分别表示输入输出表中,变量的顺序;
"="表示只写,输出特有;还有"&"见本文结尾;
"r"约束指明可以先将变量c存入任一可用的寄存器;
同理: a : %eax, %ax, %al
b : %ebx, %bx, %bl
c : %ecx, %cx, %cl
d : %edx, %dx, %dl
S : %esi, %si
D : %edi, %di
"m"修饰表示直接操作内存;
"i"修饰表示立即数;还有"o","V","g","n"等见本文结尾;
"3"当一个变量既是输入又是输出时,可以用该变量的输出序号来表示输入约束,如上述的变量a;
用g++ -S查看编译后的代码:
#APP
# 18 "main.cpp" 1
movl %ecx, %eax;movl %eax, %edi;movl -36(%rbp), %ebx;movl $30, %edx;mov $1, %ecx;
# 0 "" 2
#NO_APP
其他约束符介绍:GCC-Inline-Assembly-HOWTO