【发布时间】:2014-11-12 02:41:23
【问题描述】:
我正在尝试实现this inline assembly trick 来获取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 的东西吗? (或以其他方式解决此问题)。
【问题讨论】:
-
在调试模式下,堆栈帧默认启用。在 Release 模式下,默认情况下禁用堆栈帧。项目选项中有一个设置可以控制这一点。
标签: windows assembly x86 c++builder c++builder-xe5