X86 64 在函数调用之前保存XMM寄存器

X86 64 在函数调用之前保存XMM寄存器,x86-64,intel,avx2,sse,X86 64,Intel,Avx2,Sse,在调用汇编函数之前,是否需要将任何XMM寄存器保存/推送到堆栈中? 因为我在64位开发(使用AVX2)的发布模式下的代码中观察到了崩溃问题。在调试模式下,它可以正常工作。我尝试保存XMM8寄存器的内容,并在函数调用结束时恢复它,然后它就可以正常工作了 有什么想法或参考资料吗?是的,在Microsoft Windows上,您需要保留XMM6-XMM15寄存器。请参阅-这包括xmm8,因此要么保留它们,要么在函数中不使用它们 但是在Linux上,这些是临时寄存器,因此不必保留。请参阅第21页。是的,

在调用汇编函数之前,是否需要将任何XMM寄存器保存/推送到堆栈中? 因为我在64位开发(使用AVX2)的发布模式下的代码中观察到了崩溃问题。在调试模式下,它可以正常工作。我尝试保存XMM8寄存器的内容,并在函数调用结束时恢复它,然后它就可以正常工作了


有什么想法或参考资料吗?

是的,在Microsoft Windows上,您需要保留XMM6-XMM15寄存器。请参阅-这包括xmm8,因此要么保留它们,要么在函数中不使用它们


但是在Linux上,这些是临时寄存器,因此不必保留。请参阅第21页。

是的,在Microsoft Windows上,需要保留XMM6-XMM15寄存器。请参阅-这包括xmm8,因此要么保留它们,要么在函数中不使用它们


但是在Linux上,这些是临时寄存器,因此不必保留。请参阅第21页。

是的,但使用哪种呼叫约定?Win64还是SystemV?xmm8在这两个方面都是调用方保存,但我会给你一个不同的参考。我使用的是Std调用约定。嗯,这不是64位代码的选项之一。你可以直接使用它,但如果你调用任何外部函数,它都不会工作。@Falcon,harold真的在问你使用的是哪种操作系统。在x86上,Windows和其他所有系统之间的调用约定都不同。我猜你是在Windows上;)是的,但是哪一个电话会议?Win64还是SystemV?xmm8在这两个方面都是调用方保存,但我会给你一个不同的参考。我使用的是Std调用约定。嗯,这不是64位代码的选项之一。你可以直接使用它,但如果你调用任何外部函数,它都不会工作。@Falcon,harold真的在问你使用的是哪种操作系统。在x86上,Windows和其他所有系统之间的调用约定都不同。我猜你是在Windows上;)