Самый простой способ удалить что -то из стека FPU
Вопрос
В последнее время у меня были некоторые проблемы с переполнением стека FPU. Мне удалось отслеживать его обратно к функции библиотеки Buggy, которая выдвигает значение мусора в стек FPU каждый раз, когда она называется и никогда не очищает ее.
К счастью, это легко воспроизводимо, и я точно знаю, какие условия это вызывают. Я могу сбросить блок встроенного ASM в подпрограмму, которая называет эту рутину, чтобы отобрать верхнее значение обратно из стека FPU ... за исключением того, что я не совсем знаю, что написать. Мой ASM-FU справедливый для Миддлина, но не что сильный.
Итак, как самый простой способ избавиться от верхнего значения в стеке FPU в сборке x86, предполагая, что это мусорные данные, и мне это не волнует значение?
Решение
Если вы знаете, сколько вам нужно настроить стек, вы можете использовать fincstp
. Анкет Вы также хотите ffree
Регистры, которые вы увеличиваете.
Однако, вероятно, самое простое решение - использовать одну из операций по передаче данных, например fstp
. Анкет Обычно вы храните результат в области памяти для последующего использования, что -то вроде:
mem_area: defs 10 ; ten bytes for 80 bits
fstp mem_area ; pop it
Но, если вы знаете, что просто хотите выбросить ценность, вы можете использовать st(0)
Сам как пункт назначения, сохранение требования к памяти:
fstp st(0)
Видеть здесь Для подробного руководства по инструкциям (особенно это бит).
Другие советы
Для Delphi/BASM, на мой взгляд, самый простой способ выскочить стек FPU один раз:
asm
fstp st(0)
end;
Если st0
единственный используемый регистр x87, вы можете опустошить его:
ffree st0
Но это отличается от обычного POP, если используется несколько регистров стека, потому что он не настраивает указатель верхнего положения (верхнее поле в статусе x87).
Видеть Глава регистров учебника Simple FPU X87.
st1
все еще будет st1
После освобождения st0
Вместо того, чтобы заскочить, так что это обычно не то, что вы хотите, и не имеет существенного преимущества перед fstp st0
.
Просто вытащите его из стека с любой (быстрой) инструкцией, которая появляется.8087 Набор инструкций
Если это не сработает, Fucompp появляется дважды.