通过内联汇编操作c变量

通过内联汇编操作c变量,c,assembly,inline-assembly,C,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语

可能重复:

鉴于此代码:

#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语法。假设我想在printf语句之后将x的值更改为11,我该如何执行此操作?

函数的
asm()
顺序如下:

asm ( "assembly code"
           : output operands                  /* optional */
           : input operands                   /* optional */
           : list of clobbered registers      /* optional */
);
要通过c代码将11与程序集放在一起,请执行以下操作:

int main()
{
    int x = 1;

    asm ("movl %1, %%eax;"
         "movl %%eax, %0;"
         :"=r"(x) /* x is output operand and it's related to %0 */
         :"r"(11)  /* 11 is input operand and it's related to %1 */
         :"%eax"); /* %eax is clobbered register */

   printf("Hello x = %d\n", x);
}
您可以通过避免寄存器阻塞来简化上述asm代码

asm ("movl %1, %0;"
    :"=r"(x) /* related to %0*/
    :"r"(11) /* related to %1*/
    :);
通过避免输入操作数并使用asm中的局部常量值(而不是c中的常量值),可以进一步简化:

asm ("movl $11, %0;" /* $11 is the value 11 to assign to %0 (related to x)*/
    :"=r"(x) /* %0 is related x */
    :
    :);
另一个例子:

另请参见指南,官方文档比发布此答案时更好:。(以及手册中有关泛型和机器特定约束的相邻页面)另请参阅-当您可以让编译器从C Intrinsic生成所需的asm时,请避免使用它:产生未定义行为的错误(如在不通知编译器的情况下销毁寄存器或内存位置)的可能性要小得多。请参阅,以及其他相关问答:/