问题描述
我在 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 上尝试并查看。