我试图通过阅读有关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
。
这段代码是否达到了上述目的,这是Windows平台上32位的跨处理器吗?