x86-64 从堆栈段错误中存储和删除浮点值

x86-64 storing and removing floating point values from the stack segfaults

所以我认为我应该制作简单的辅助函数来在堆栈和 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 ...

现在我们执行SUBMOVSD指令。堆栈现在看起来像这样:

... used stack ...
RA
copy of XMM0
              <--- RSP points here
... unused stack ...

问题:(下一条)RET指令return会在哪里?

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