2012-07-06 118 views
1

我遇到了一个奇怪的问题,我从来没有见过,在Delphi 2010有时使用例程CopyMemory(内部调用移动)时,我得到一个无效的浮点操作异常,当使用Move?移动时浮点操作无效?

我在汇编程序中有一个调试信息,我检查了Move的源代码,并且在FILD指令中发生了问题,我发现FILD将一个整数值从内存转换为浮点寄存器中的浮点数,操作,但为什么会发生?我现在坚持了2天

Assembler Information: 
; System.Move (Line=0 - Offset=1) 
; 
00404E0C cmp eax, edx 
00404E0E jz System.Move 
00404E10 cmp ecx, +$20 
00404E13 jnbe System.Move 
00404E15 sub ecx, +$08 
00404E18 jnle System.Move 
00404E1A jmp dword ptr [System.Move+ecx*4] 
00404E21 fild qword ptr [ecx+eax] 
00404E24 fild qword ptr [eax] ; <-- EXCEPTION 
00404E26 cmp ecx, +$08 
00404E29 jle System.Move 
00404E2B fild qword ptr [eax+$08] 
00404E2E cmp ecx, +$10 
00404E31 jle System.Move 
00404E33 fild qword ptr [eax+$10] 
00404E36 fistp qword ptr [edx+$10] 
00404E39 fistp qword ptr [edx+$08] 
00404E3C fistp qword ptr [edx] 
00404E3E fistp qword ptr [ecx+edx] 

Registers: 
EAX: 0E3A4694 EDI: 0000000D 
EBX: 00001B5C ESI: 0ECF7928 
ECX: 00000005 ESP: 0612FC1C 
EDX: 0E3A2B38 EIP: 00404E24 

什么可能导致错误?

+3

发生异常时,浮点控制字的值是多少? – 2012-07-06 14:30:14

+0

不幸的是我不知道,因为这个错误是由我的客户网站EurekaLog捕获,我没有比这更多的信息:( – Eric 2012-07-06 16:40:01

回答

6

我以前见过这个问题。问题是,在进入Move方法之前,x87寄存器的堆栈包含一些无效的浮点值,而不是空的。这是由于之前发生的异常,并且像这样离开了x87堆栈。

Move命令使用x87寄存器,因为它们允许快速移动数据而不依赖于SSE指令,但它假定堆栈为空。

寻找解决方法:

  • 设置移动命令开始一个断点,并使用FPU调试窗口,以验证FPU堆栈确实看不上。
  • 从这里:回溯在你的应用程序中使用同一个窗口的原因,这个废弃的FPU堆栈。这是你的问题的原因。
+0

感谢您的指示...我相信,我的H.264解码库中的一些外部异常可能会这样做,因为当我尝试解码一些损坏的H.264流时,这个错误开始发生,我会进一步调查它 – Eric 2012-07-06 16:46:22