在代码中,我有以下声明
#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 操作数传递给汇编器:阅读 manual . (注意:由于您没有指定您使用的是哪个版本,所以我只选择了一个)。
不要忘记将汇编器中使用的寄存器添加到 clobber 列表。您还应该使汇编器 asm volatile
。
根据您的执行环境,手动操作堆栈指针可能是一个非常糟糕的主意!至少您应该将其放入 __attribute__((naked))
函数,而不是宏。宏中尾随的 ;
绝对是错误的,您将在宏之后立即拥有它(2 个分号可能会破坏条件语句!
关于c 内联汇编将寄存器值加载到 esp 寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31273303/