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:您正在编写一些反向波兰符号计算器吗?