【发布时间】:2011-01-04 11:24:04
【问题描述】:
这是我在 VC++ 项目中插入的一个简单的 asm 代码。 addr_curr_ebp 是 EBP 指针的当前地址。它指向堆栈帧内的旧 EBP 值。这之后的 4 个字节是应用程序函数内部的返回地址。我从代码部分中提取了一个字节。我将我的代码与 gtalk、vlc 等其他应用程序一起运行。当我在代码中包含 ProbStat 1 和 2 时,应用程序总是崩溃。当我删除这些语句时,一切正常。你觉得这是什么?
__asm{
push eax
push ebx
push cx
mov ebx, addr_curr_ebp
mov eax, [ebx + 4]
mov cl, BYTE PTR [eax - 5] //ProbStat 1
mov ret_5, cl // ProbStat 2
pop cx
pop ebx
pop eax
}
【问题讨论】:
-
是崩溃还是异常,具体发生在哪里?您是否尝试过将调试器设置为中断所有异常类型?
-
只推
CX并没有节省任何费用。另请注意,MS 使用ECX寄存器作为 C++ 中的this指针。否则没有足够的信息来回答你的问题。 -
@JimR: 'push cx' 保存 cx 寄存器,'pop cx' 恢复它。在这两者之间,只有 cl 被改变。所以 ecx 被保留了。
-
@TonyK:你没抓住我的意思。
push ECX不会更贵,而且可能更便宜,因为 CX 在进入堆栈之前必须扩大到 32 位。 -
@Bruce:如果您打开了该选项,也有可能是整个程序优化导致了这种情况。将其关闭并测试。
标签: c++ assembly inline-assembly