2012-07-06 109 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