oct*_*ain 1 x86 assembly gcc inline-assembly att
我对 GNU 汇编内联非常陌生,我已经阅读了多篇文章,但仍然不完全了解发生了什么。根据我的理解:
movl %eax, %ebx\n\t将移动无论是在%eax成ebx,但不会将内容添加到对方
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