在代码中,我有以下声明
#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
的值(不是取消引用的值,而是指针本身)
答案 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)
);