我是GNU程序集内联的新手,我已阅读多篇文章,但仍然无法完全理解正在发生的事情。根据我的理解:
movl %eax, %ebx\n\t
会将%eax
中的任何内容移至ebx
,但不会将内容相互添加
addl %eax, %ebx\n\t
会将%eax
的内容添加到ebx
并将其保留在最正确的寄存器中
addl %1, %0\n\t
这是我感到困惑的地方,我们加1和0?为什么我们需要%0
呢?
答案 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