我正在尝试实现这个内联汇编技巧来获取 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
东西吗?(或以其他方式解决此问题)。