创建添加两个 XMM 寄存器的过程时返回什么寄存器

问题描述

我在 C++ 上调用 ASM 函数,我希望能够返回 YMM2 存储值,我知道在过程中返回的寄存器是 RAX,我怎样才能返回 YMM2 值以及在哪里可以将该值存储在 C++ 上。

.data
    vec1 real4 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0
    vec2 real4 9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0
    
.code

SumProc proc
    vmovups ymm0,ymmworld ptr [vec1]
    vmovups ymm1,ymmworld ptr [vec2]
    
    vaddps ymm2,ymm0,ymm1
    ret
    

解决方法

您正在寻找的概念称为 Application Binary Interface (ABI),它可能因架构甚至每个编译器而异。

例如,AMD64 ABI 用于除 Windows 状态之外的所有地方

浮点返回值类似地存储在 XMM0 和 XMM1 中。更宽的 YMM 和 ZMM 寄存器用于在 XMM 存在时传递和返回更宽的值。

注释中提到的 __vectorcall Windows 调用约定是相同的:

使用前四个 XMM/YMM 寄存器返回结果向量类型和 HVA 值

未明确说明默认的 Windows 返回约定,因此最好在 Godbolt.org 上尝试并查看。