微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决创建添加两个 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 上尝试并查看。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。