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

nmx*_*ime 6 c x86 cygwin pointers inline-assembly

在代码中,我有以下声明

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

在代码中,恰好在一个地方,使用这个宏,编译器在哪个行上指示undefined reference to 'temp'.

temp = (int*)some_pointer;
SET_STACK(temp);
Run Code Online (Sandbox Code Playgroud)

temp变量声明为全球挥发性空指针

volatile void* temp;
Run Code Online (Sandbox Code Playgroud)

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

too*_*ite 1

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

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

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