我试图通过阅读关于 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/

10-11 15:56