【问题标题】:x86-64 storing and removing floating point values from the stack segfaultsx86-64 从堆栈段错误中存储和删除浮点值
【发布时间】:2020-06-07 13:39:44
【问题描述】:

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

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

【问题讨论】:

    标签: assembly segmentation-fault stack sse


    【解决方案1】:

    就在执行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 指令将返回哪里?

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

    【讨论】:

    • 哦,是的,所以我必须移动 RSP 以指向正确的返回地址,确实这似乎是这里的问题,但这也破坏了堆栈并且例程无法执行预计在返回后 RSP 指向“错误”地址,将改为使用宏来实现。
    • @Theamaturprogrammer:你在写一些逆波兰符号计算器吗?
    猜你喜欢
    • 1970-01-01
    • 2019-09-30
    • 2015-03-08
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 2018-10-29
    相关资源
    最近更新 更多