我正在为一个应用程序编写一个 DLL 附加组件,该应用程序内部有大量用汇编语言编写的部分。我正在混合托管 C++、非托管 C++ 和内联汇编。
我刚刚花了几个小时调试一个问题,结果发现在调用主应用程序期间没有保留 ebx
。仅当代码在 Release模式下且在调试器外部运行时,才会发生该错误。在调试器中发布代码不会出现此问题。
我已经关闭了可以为发布版本找到的所有优化,但它仍然依赖于 ebx
。我添加了 push/pop ebx
作为解决方法,但这个错误肯定会再次出现。 :-(
是否可以告诉编译器 ebx
在函数调用期间可能会更改?
最佳答案
错误出现在函数的原型(prototype)中,该函数报告它符合调用约定,但实际上并未遵守调用约定的寄存器保存规则。您需要将对有缺陷的函数的调用包装在您自己的函数中,使其符合要求(通过保留寄存器),并让每个人都调用包装器。 #pragma deprecated
将让您强制执行此策略。
关于visual-studio-2010 - 发布代码必须依赖于通过函数调用保留的 ebx 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8056753/