Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

《软件调试》答疑

帖子发起人: whislter   发起时间: 2008-10-16 17:56 下午   回复: 3

Print Search
帖子排序:    
   2008-10-16, 17:56 下午
whislter 离线,最后访问时间: 2010/2/8 14:24:44 whislter

发帖数前500位
注册: 2008-10-07
发 贴: 3
关于第三章Fault演示程序的疑问
Reply Quote

      第三章的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

有没有什么办法让编译器不要把除数放到寄存器里?


IP 地址: 已记录   报告
   2008-10-16, 20:55 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: 关于第三章Fault演示程序的疑问
Reply Quote

可以使用嵌入式汇编,改成下面的样子:

        // nResult=nDividend / nDivisor;
        __asm{
            mov eax, nDividend
            cdq
            idiv nDivisor
            mov nResult, eax
        };

我在VS2005上测试了一下是可以的。


IP 地址: 已记录   报告
   2008-10-16, 22:24 下午
whislter 离线,最后访问时间: 2010/2/8 14:24:44 whislter

发帖数前500位
注册: 2008-10-07
发 贴: 3
Re: 关于第三章Fault演示程序的疑问
Reply Quote
谢谢张老师!
同样是改汇编,我第一反应居然没想到嵌入式汇编。。。
IP 地址: 已记录   报告
   2009-06-14, 12:08 下午
benben 离线,最后访问时间: 2010/5/15 5:25:32 笨笨

发帖数前500位
注册: 2009-06-14
发 贴: 3
Re: 关于第三章Fault演示程序的疑问
Reply Quote
关于这个问题
我想请教一下为什么把nDivisor 定义为volatile int nDivisor=0;依然会失败?

volatile是告诉cl该变量可能会以cl不知道的方式被改变,所以对该变量的访问不要做优化,要老老实实地按照programmer的指示去访问相应的memory.
编译,链接完成后,volatile已经体现在binary code中了,从binary中可以看到,对nDivisor的访问确实都没有被优化掉.
volatile是语言层面的keyword,它作用的对象是c/c++中的语句(sentence),是语句级的.
而本例乃异常(exception),是指令(instruction)级的,所以volatile起不了作用,只能用嵌入汇编.

请问我的理解对不?

ps:对于IA-32,有没有指令级的,作用与volatile相近的指令或compiler directive?

谢谢
IP 地址: 已记录   报告
高端调试 » 图书 » 《软件调试》答疑 » Re: 关于第三章Fault演示程序的疑问

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.