GNU 汇编内联:%1 和 %0 是什么意思?

oct*_*ain 1 x86 assembly gcc inline-assembly att

我对 GNU 汇编内联非常陌生,我已经阅读了多篇文章,但仍然不完全了解发生了什么。根据我的理解:

movl %eax, %ebx\n\t将移动无论是在%eaxebx,但不会将内容添加到对方

addl %eax, %ebx\n\t将添加%eaxwith的内容ebx并将其保存在最右边的寄存器中

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

小智 5

整个 asm 内联块看起来像:

 asm [volatile] ( AssemblerTemplate
                      : OutputOperands
                      [ : InputOperands
                      [ : Clobbers ] ])
Run Code Online (Sandbox Code Playgroud)

或者

 asm [volatile] ( AssemblerTemplate
                      : OutputOperands)
Run Code Online (Sandbox Code Playgroud)

在 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) : );
Run Code Online (Sandbox Code Playgroud)

这个汇编代码相当于“b = a;”

更详细的解释在这里:https : //gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html