Самый простой способ удалить что -то из стека FPU

StackOverflow https://stackoverflow.com/questions/4772389

  •  23-10-2019
  •  | 
  •  

Вопрос

В последнее время у меня были некоторые проблемы с переполнением стека 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 появляется дважды.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top