x86-64 хранение и удаление значений с плавающей запятой из ошибок стека - PullRequest
1 голос
/ 24 февраля 2020

Итак, я подумал, что мне нужно создать простые вспомогательные функции для перемещения данных между стеком и XMM регистрами, но я снова стал segfaulting. Как это должно быть сделано правильно? Ниже мой текущий код segfaults:

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)

EDIT: это как-то связано с вызовом функций?

1 Ответ

1 голос
/ 24 февраля 2020

Непосредственно перед выполнением первой инструкции процедуры 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?

Должно быть достаточно ясно, что она не вернется к намеченному ( РА) адрес.

...