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

标签 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 指针

volatile void* temp;

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

最佳答案

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

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

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

关于c 内联汇编将寄存器值加载到 esp 寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31273303/

相关文章:

c - 从内核空间写入文件

c++ - 通过 C++ 中的非静态函数设置对 C 函数指针的回调

c - 使用 fscanf() 读取一行时遇到问题

我的链接列表的清晰度

c++ - 这两个程序有什么区别

linux - 反汇编为 Intel 语法的 x86 ELF 反汇编程序

c++ - 签名的二进制表示是否可以在体系结构之间移植?

c++ - 设置 SSE 寄存器中的最后或前 n 位

c - 从字符串打印字符值时出错

javascript - 为什么 javascript "for loop"对不同类型的对象有不同的行为