GNU程序集内联:%1和%0是什么意思?

时间:2015-09-29 23:19:36

标签: gcc assembly x86 inline-assembly att

我是GNU程序集内联的新手,我已阅读多篇文章,但仍然无法完全理解正在发生的事情。根据我的理解:

movl %eax, %ebx\n\t会将%eax中的任何内容移至ebx,但不会将内容相互添加

addl %eax, %ebx\n\t会将%eax的内容添加到ebx并将其保留在最正确的寄存器中

addl %1, %0\n\t这是我感到困惑的地方,我们加1和0?为什么我们需要%0呢?

1 个答案:

答案 0 :(得分:2)

整个asm内联块看起来像:

 asm [volatile] ( AssemblerTemplate
                      : OutputOperands
                      [ : InputOperands
                      [ : Clobbers ] ])

OR

 asm [volatile] ( AssemblerTemplate
                      : OutputOperands)

在AssemblerTemplate中是汇编代码,在Output / InputOperands中,您可以在C和ASM之间传递变量。

然后在Asm中,%0引用作为OutputOperand或InputOperand传递的第一个变量,将%1引用到第二个等等。

示例:

 int32_t a = 10;
 int32_t b;
 asm volatile ("movl %1, %0" : "=r"(b) : "r"(a) : );

此asm代码相当于“b = a;”

更详细的解释如下:https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html