我试图通过阅读关于 CodeProject here 的文章在 C 和 GCC 中使用少量 AT&T 风格的内联汇编。我希望这样做的主要原因是找到 EIP 寄存器的旧值,以便能够在我的代码中获得可靠的指令地址。到目前为止,我已经编写了一个简单的示例程序来展示我对这个概念的理解:
#include <stdio.h>
#include <stdlib.h>
int mainReturnAddress = 0;
int main()
{
asm volatile (
"popl %%eax;"
"pushl %%eax;"
"movl %%eax, %0;"
: "=r" ( mainReturnAddress )
);
printf( "Address : %d\n", mainReturnAddress );
return 0;
}
这个特定示例的目的是从堆栈顶部弹出 4 个字节,代表从 EIP 寄存器保存的 32 位返回地址,然后将其压回到堆栈上。之后,我将其存储在全局
mainReturnAddress
变量中。最后,我打印存储在 mainReturnAddress 中的值。我从这个代码
4200560
收到的输出。这段代码是否达到了上述目的,这是 32 位 Windows 平台上的跨处理器吗?
最佳答案
在 GCC 中,您应该使用 __builtin_return_address
而不是尝试使用内联汇编。
关于c - 如何在C中找到函数的返回地址?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23818282/