Assembly 汇编程序MMX错误

Assembly 汇编程序MMX错误,assembly,mmx,Assembly,Mmx,我正在做我的学校项目:VisualStudio中的动态MASM汇编程序库,它实现了CaesarCipher的方法。当我使用控制台应用程序时,一切都很好。当我创建Windows窗体UI时,MMX函数开始导致错误 MMX功能-我的项目的问题。我看不出在我的项目中使用它有什么意义,但我必须做的一件事是使用MMX代码,即使它没有用 在工作正常的控制台中: movq mm1, mm0 movq mm1,mm0 在窗体应用程序中,它会导致一般错误。使用MMX指令将导致FPU切换到MMX模式(某种程度上,它不

我正在做我的学校项目:VisualStudio中的动态MASM汇编程序库,它实现了CaesarCipher的方法。当我使用控制台应用程序时,一切都很好。当我创建Windows窗体UI时,MMX函数开始导致错误

MMX功能-我的项目的问题。我看不出在我的项目中使用它有什么意义,但我必须做的一件事是使用MMX代码,即使它没有用

在工作正常的控制台中:

movq mm1, mm0 movq mm1,mm0
在窗体应用程序中,它会导致一般错误。

使用MMX指令将导致FPU切换到MMX模式(某种程度上,它不是真正的模式),这意味着所有8个FPU寄存器都将变为有效,并准备由MMX指令使用。在此状态下使用x87指令很容易失败,所有FPU堆栈插槽都已填满,因此加载任何内容都会导致FPU堆栈溢出。在控制台程序中,很容易出现根本不使用x87指令的情况,因此将FPU保持在该状态不是什么大问题,但windows窗体使用一些x87指令,并且他们假设FPU堆栈上会像往常一样有空间


您可以在使用MMX后通过使用该指令清空FPU堆栈。

使用MMX指令将导致FPU切换到MMX模式(某种程度上,它不是真正的模式),这意味着所有8个FPU寄存器都将变为有效,并可供MMX指令使用。在此状态下使用x87指令很容易失败,所有FPU堆栈插槽都已填满,因此加载任何内容都会导致FPU堆栈溢出。在控制台程序中,很容易出现根本不使用x87指令的情况,因此将FPU保持在该状态不是什么大问题,但windows窗体使用一些x87指令,并且他们假设FPU堆栈上会像往常一样有空间


使用MMX后,您可以使用指令清空FPU堆栈。

您是否忘记了
emms
?您的意思是什么?我真的不明白。你忘了写emms了吗?什么意思?我真的不明白。至少sysv abi要求fpu堆栈在进入函数时为空,我假设microsoft也这样做,即使我找不到明确说明这一点的文档。只谈到函数的退出,而不是进入。@Jester我发现它说它在进入时也必须是空的(正如我所期望的),但我还没有发现Microsoft直接这么说至少sysv abi要求fpu堆栈在进入函数时是空的,我想微软也会这么做,尽管我找不到明确说明这一点的文档。只谈到函数退出,而不是进入。@Jester我发现它说它在进入时也必须是空的(正如我所期望的),但我还没有发现Microsoft直接这么说