1

我正在尝试实现这个内联汇编技巧来获取 C++Builder 中 EIP 的值。以下代码在发布模式下工作:

unsigned long get_eip()
{
    asm { mov eax, [esp] }
}

但是它在调试模式下不起作用。在调试模式下,代码必须更改为:

unsigned long get_eip()
{
    asm { mov eax, [esp+4] }
}

通过检查生成的程序集;不同之处在于,在调试模式下,为get_eip()函数(第一个版本)生成的代码是:

push ebp
mov ebp,esp
mov eax,[esp]
pop ebp
ret

但是在发布模式下,代码是:

mov eax,[esp]
ret

当然我可以#ifdef NDEBUG用来解决这个问题;但是有什么语法可以用来指定整个函数在汇编中并且编译器不应该插入这些push ebp东西吗?(或以其他方式解决此问题)。

4

1 回答 1

3

你试过__declspec(naked)吗?

__declspec(naked) unsigned long get_eip()
{
    asm { mov eax, [esp] }
}
于 2014-11-12T02:46:43.163 回答