如何访问用于内联程序集操作的C变量?

如何访问用于内联程序集操作的C变量?,c,gcc,assembly,inline-assembly,C,Gcc,Assembly,Inline Assembly,鉴于此代码: #include <stdio.h> int main(int argc, char **argv) { int x = 1; printf("Hello x = %d\n", x); } #包括 int main(int argc,字符**argv) { int x=1; printf(“Hello x=%d\n”,x); } 我想在内联汇编中访问和操作变量x。理想情况下,我希望使用内联汇编更改其值。GNU汇编程序,并使用AT&T语法。在GNU

鉴于此代码:

#include <stdio.h>

int main(int argc, char **argv)
{
    int x = 1;
    printf("Hello x = %d\n", x);
}
#包括
int main(int argc,字符**argv)
{
int x=1;
printf(“Hello x=%d\n”,x);
}

我想在内联汇编中访问和操作变量x。理想情况下,我希望使用内联汇编更改其值。GNU汇编程序,并使用AT&T语法。

在GNU C内联asm中,使用x86 AT&T语法:
(但如果你能避免的话)

在此之后,x包含0

请注意,通常应避免将
mov
作为asm语句的第一条或最后一条指令。不要从
%[some]
复制到像
%%eax
这样的硬编码寄存器,只需使用
%[some]
作为寄存器,让编译器进行寄存器分配

有关更多文档和指南,请参阅和


并非所有编译器都支持GNU语法。 例如,对于MSVC,您可以执行以下操作:

\u asm mov x,0
x
在此语句后的值为
0

请指定要使用的编译器

还要注意,这样做将限制您的程序仅使用特定的编译器-汇编程序组合进行编译,并且只针对特定的体系结构


在大多数情况下,使用纯C和内部函数,而不是内联asm,可以获得同样好或更好的结果。

asm(“mov$0,%1”:“=r”(x):“r”(x):“cc”)
——这可能会让您走上正确的轨道。尽可能多地指定寄存器使用,以提高性能和效率。然而,正如Aniket所指出的,它高度依赖于体系结构,需要gcc。

哪种内联汇编的变体?GCC风格是唯一的好风格,但是如果你在寻找MSVC,回答这个问题会浪费时间。哪个编译器?哪个处理器?您尝试了什么?以什么方式没有工作?GNU汇编程序,使用AT&t syntaxI,期待您的帮助。假设我想给X值10,我该怎么做?@user1888502要做到这一点,你需要先学习x86汇编。虽然
movl$10…
可以做到这一点here@user1888502在我的回答中,将0替换为10,你就得到了:-)敌人%[某些人]是什么意思?
// this example doesn't really need volatile: the result is the same every time
asm volatile("movl $0, %[some]"
    : [some] "=r" (x)
);