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 ...
现在我们执行SUB
和MOVSD
指令。堆栈现在看起来像这样:
... used stack ...
RA
copy of XMM0
<--- RSP points here
... unused stack ...
问题:(下一条)RET
指令return会在哪里?
应该很清楚,它不会return到预期的 (RA) 地址。
所以我认为我应该制作简单的辅助函数来在堆栈和 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 ...
现在我们执行SUB
和MOVSD
指令。堆栈现在看起来像这样:
... used stack ...
RA
copy of XMM0
<--- RSP points here
... unused stack ...
问题:(下一条)RET
指令return会在哪里?
应该很清楚,它不会return到预期的 (RA) 地址。