格式
__asm__(assember template
: output operands /* optional */
: input operands /* optional */
: list of clobbered registers /* optional */)
第一部分,汇编指令;
第二部分,指示运算结果要输出到哪些C操作数中;
第三部分,指示汇编指令需要从哪些C操作数获得输入;
第四部分,指示在汇编指令中被修改过的寄存器列表。
后三部分都是可选的,没有就空着只写个:号。
例子
#include <stdio.h>
int main()
{
int a = 10, b;
__asm__("movl %1 %%eax\n\t"
"movl %%eax %0\n\t"
:"=r"(b)
:"r"(a)
:"eax");
printf("Result: %d, %d\n", a, b);
return 0;
}
解释:
1、该汇编代码将变量a的值赋给b。
2、“r”(a)指示编译器分配一个寄存器保存变量a的值,作为汇编指令的输入,也就是指令中的%1(b对应%0,a对应%1),至于%1究竟代表哪个寄存器则由编译器自己决定。
3、%%eax(为了和%1这种占位符区分,eax前面要求加两个%号)。
4、“=r”(b)表示把%0所代表的寄存器的值输出给变量b。
5、在执行指令的过程中,寄存器eax的值被改变了,所以把"eax"写在第四部分,告诉编译器在执行指令期间不要用eax保存其他值。