在函数调用之前保存 XMM 寄存器
Posted
技术标签:
【中文标题】在函数调用之前保存 XMM 寄存器【英文标题】:Saving the XMM register before function call 【发布时间】:2014-06-19 05:44:59 【问题描述】:是否需要在调用汇编函数之前将任何 XMM 寄存器保存/推送到堆栈? 因为我正在使用 64 位开发的发布模式(使用 AVX2)观察我的代码中的崩溃问题。在调试模式下它工作正常。我尝试保存 XMM8 寄存器的内容并在函数调用结束时恢复它,然后它工作正常。
有什么想法或参考吗?
【问题讨论】:
是的,但是哪种调用约定? Win64 还是 SystemV? xmm8 在两者中都是调用者保存的,但我会给你一个不同的参考。 我正在使用标准调用约定。 嗯,这并不是 64 位代码的真正选项之一。您可以继续使用它,但如果您调用任何外部函数,它将无法正常工作。 @Falcon,哈罗德真的在问你使用的是哪个操作系统。在 x86 上,Windows 和其他所有人的调用约定不同。我猜你是在 Windows 上;) 【参考方案1】:是的,在 Microsoft Windows 上,您需要保留 XMM6-XMM15 寄存器。请参阅http://msdn.microsoft.com/en-us/library/7kcdt6fy.aspx - 这包括 xmm8,所以要么保留它们,要么不在你的函数中使用它们。
但在 Linux 上,这些是临时寄存器,因此不必保留。请参阅http://www.x86-64.org/documentation/abi.pdf 第 21 页。
【讨论】:
以上是关于在函数调用之前保存 XMM 寄存器的主要内容,如果未能解决你的问题,请参考以下文章