在函数调用之前保存 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 寄存器的主要内容,如果未能解决你的问题,请参考以下文章

GCC 不保存/恢复函数调用的保留寄存器

自制反汇编工具使用实例 其二(使用xmm寄存器初始化对象,以及空的成员函数指针)

在 ARM C 调用约定中要保存哪些寄存器?

xmm0 的函数参数

this指针 (保存调用成员函数对象的地址)

c++内联函数