2015-11-13 64 views
0

我正在做我的學校項目:Visual Studio中的動態MASM彙編程序庫,它實現了CaesarCipher的方法。一切正常,當我使用控制檯應用程序。當我創建Windows Forms UI時,MMX函數開始導致錯誤。彙編MMX錯誤

MMX功能 - 我的項目的問題。我沒有在我的項目中看到它的用法,但我必須做的一件事是使用MMX代碼,即使它沒用。

在控制檯,工作得很好:

 
movq mm1, mm0 

在窗體應用程序它會導致一般錯誤。

+0

你忘了emms嗎? – harold

+0

你是什麼意思?我不太明白。 – user1678401

回答

5

使用的MMX指令將導致FPU轉換到MMX模式(在某種程度上,這是不是一個真正的模式),這意味着所有8個FPU寄存器將成爲有效並可供MMX指令使用。在此狀態下使用x87指令可能會很容易失敗,所有FPU堆棧槽都被填充,因此加載任何內容都會導致FPU堆棧溢出。在一個控制檯程序中,很容易出現這種情況,根本沒有使用x87指令,所以將FPU置於該狀態並不是一個大問題,但windows窗體使用了一些x87指令,並且他們認爲將會有空間像往常一樣FPU堆棧。

可以使用MMX使用emms指令後清空FPU堆棧。

+0

謝謝!有效! – user1678401

+0

至少sysv abi要求fpu棧在進入函數時是空的,我假設microsoft也是這樣做的,儘管我找不到明確指出這一點的文檔。 [最相關的MSDN文章](https://msdn.microsoft.com/en-us/library/ha59cbfz.aspx)只談論函數退出,而不是條目。 – Jester

+1

@Jester我發現[另一個來源](http://www.agner.org/optimize/calling_conventions.pdf),說它在入門時必須是空的(正如我所期望的),但我沒有'無法直接找到微軟這樣說 – harold