Assembly x86-64从堆栈中存储和删除浮点值

Assembly x86-64从堆栈中存储和删除浮点值,assembly,segmentation-fault,stack,sse,Assembly,Segmentation Fault,Stack,Sse,所以我认为我应该制作简单的助手函数,用于在堆栈和XMM寄存器之间移动数据,但我还是在进行分段。如何正确地做到这一点?以下是我当前识别故障的代码: pushxmm0: SUB RSP, 8;Move the stack MOVSD QWORD [RSP], XMM0 RET popxmm0: MOVSD XMM0, QWORD [RSP] ADD RSP, 8;Move the stack RET main: ;Do stuff here

所以我认为我应该制作简单的助手函数,用于在堆栈和
XMM
寄存器之间移动数据,但我还是在进行分段。如何正确地做到这一点?以下是我当前识别故障的代码:

pushxmm0:
    SUB RSP, 8;Move the stack
    MOVSD QWORD [RSP], XMM0
    RET

popxmm0:
    MOVSD XMM0, QWORD [RSP]
    ADD RSP, 8;Move the stack
    RET

main:
    ;Do stuff here
    CALL pushxmm0
    ;Do more stuff
    CALL popxmm0 ;Restore the register value (segfault)

编辑:这与函数调用有关吗?

在执行
pushxmm0
例程的第一条指令之前,堆栈如下所示:

... used stack ...
RA      # return address in main, pointing to "CALL popxmm0"
        <--- RSP points here
... unused stack ...
... used stack ...
RA
copy of XMM0
              <--- RSP points here
... unused stack ...
问题:(下一个)
RET
指令返回到哪里


应该很清楚,它不会返回到预期的(RA)地址。

哦,是的,因此我必须移动
RSP
以指向正确的返回地址,确实这似乎是这里的问题,但这也会破坏堆栈,并且例程不会像返回后预期的那样执行,RSP指向“错误”地址,将改为使用宏来实现它。@Theamateurprogrammer:您正在编写一些反向波兰符号计算器吗?