将寄存器值装入esp寄存器的C内联汇编程序



在代码中,我有以下声明

#if GCC == 1
#define SET_STACK(s)    asm("movl temp,%esp");
...
#endif

在代码中,只在一个地方使用了这个宏,在编译器指示undefined reference to 'temp'的那一行。

temp = (int*)some_pointer;
SET_STACK(temp);

temp变量被声明为全局volatile void指针

volatile void* temp;

内联程序集有语法问题吗?据我所知,内联汇编试图加载temp的值(不是解引用值,而是指针本身)

您必须使用扩展汇编器将C操作数传递给汇编器:阅读手册。(注意:因为你没有指定使用哪个版本,所以我只选了一个)。

不要忘记将汇编器中使用的寄存器添加到 clober列表中。您还应该使汇编器为asm volatile

根据您的执行环境,手动操作堆栈指针可能是一个非常糟糕的主意!至少应该将其放入__attribute__((naked))函数中,而不是放入宏中。宏后面的;绝对是错误的,你会在宏后面看到它(2个分号可能会打断条件语句!)

如果你想在GCC内联汇编中使用C变量,你必须使用扩展ASM语法,例如:

volatile int temp = 0;
asm("movl %0,%%esp"
  : /* No outputs. */
  : "rm" (temp)
);

最新更新