通过内联汇编操作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时,请避免使用它:产生未定义行为的错误(如在不通知编译器的情况下销毁寄存器或内存位置)的可能性要小得多。请参阅,以及其他相关问答:/