第三章的fault演示小程序,VS2008 SP1下出现了问题——异常总是消除不掉,导致程序不断循环。看了下下载的bin里用VC6编译的,是不是较高版本的VC都有这个问题??发现是编译器在idiv指令上使用了寄存器,禁用编译器优化并且为除数加了volatile 都没用。直接修改生成的二进制文件后正常了。
修改前:/*1291078*/ mov ecx, dword ptr [ebp-1C]/*129107B*/ cdq/*129107C*/ idiv ecx
修改后:/*1291078*/ cdq/*1291079*/ idiv dword ptr [ebp-1C]/*129107C*/ nop/*129107D*/ nop
有没有什么办法让编译器不要把除数放到寄存器里?
可以使用嵌入式汇编,改成下面的样子:
// nResult=nDividend / nDivisor; __asm{ mov eax, nDividend cdq idiv nDivisor mov nResult, eax };
我在VS2005上测试了一下是可以的。