c内联汇编将寄存器值加载到esp寄存器

时间:2015-07-07 15:42:25

标签: c pointers x86 cygwin inline-assembly

在代码中,我有以下声明

#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* temp;

内联汇编有什么语法问题吗? 根据我的理解,内联汇编尝试加载temp的值(不是取消引用的值,而是指针本身)

2 个答案:

答案 0 :(得分:1)

您必须使用扩展汇编程序将C操作数传递给汇编程序:阅读manual。 (注意:由于您没有指定您使用的是哪个版本,我只选了一个。)

不要忘记将汇编程序中使用的寄存器添加到 clobber列表中。您还应该制作汇编程序asm volatile

根据您的执行环境,手动操作堆栈指针可能是一个非常糟糕的主意!至少你应该把它放到__attribute__((naked))函数中,而不是宏。宏中的尾随;肯定是错误的,你将在宏之后就已经有了这个(2个分号可能会破坏条件语句!

答案 1 :(得分:1)

如果要在GCC内联汇编中使用C变量,则必须使用Extended ASM syntax,例如:

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