从 asm 返回一个 double 到 c

问题描述 投票:0回答:1

我希望获取两个

double
变量,将它们传递给函数,减去它们,返回它们并打印结果。

我的例子:

#include <stdio.h>
extern double dev(double a, double b);
int main() {
    double a = 10.2;
    double b = 3.6;
    double result = dev(a, b);
    printf("%.2f", result);
    return 0
}

阿斯姆:

section .text
    global dev
dev:
    movsd xmm0, [rdi]
    movsd xmm1, [rsi]
    subsd xmm0, xmm1
    ret

它可以编译,但是当我尝试运行代码时,我得到一个

Segmentation fault (core dumped)

相信我已经发现了问题,但我只是不知道如何解决它。

double
是一个 64 位值。而
xmm
是一个 128 位寄存器。我尝试返回 128 位似乎是合乎逻辑的(至少对我来说),但我看不出有什么办法可以做到这一点。我尝试过
movsd rax xmm0
但同样的问题

c assembly nasm
1个回答
0
投票

优化

dev:
        subsd   xmm1, xmm0
        movaps  xmm0, xmm1
        ret

未优化

dev:
        push    rbp
        mov     rbp, rsp
        movsd   QWORD PTR [rbp-8], xmm0
        movsd   QWORD PTR [rbp-16], xmm1
        movsd   xmm0, QWORD PTR [rbp-16]
        subsd   xmm0, QWORD PTR [rbp-8]
        pop     rbp
        ret
© www.soinside.com 2019 - 2024. All rights reserved.