在代码中,我有以下声明
#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)
);