Самый простой способ удалить что-то из стека FPU - PullRequest
10 голосов
/ 23 января 2011

В последнее время у меня возникли проблемы с переполнением стека FPU.Мне удалось отследить его до функции библиотеки с ошибками, которая помещает значение мусора в стек FPU каждый раз, когда он вызывается, и никогда не очищает его.

К счастью, это легко воспроизводимо, и я точно знаю, какие условия вызывают его,Я могу вставить блок встроенного ASM в подпрограмму, которая вызывает эту подпрограмму, чтобы высвободить верхнее значение из стека FPU ... за исключением того, что я не совсем знаю, что писать.Мой ASM-fu справедлив по отношению к middlin ', но не , что strong.

Так каков самый простой способ избавиться от верхнего значения в стеке FPU в сборке x86, предполагая, что это мусор?данные и мне плевать на значение?

Ответы [ 4 ]

13 голосов
/ 27 января 2011

Для Delphi / BASM, на мой взгляд, самый простой способ извлечь стек FPU:

asm
 fstp st(0)
end;
7 голосов
/ 23 января 2011

Если вы знаете, сколько нужно настроить стек, вы можете использовать fincstp.Вы также хотите ffree регистры, которые вы увеличиваете.

Однако, возможно, самое простое решение - это использовать одну из операций передачи данных с прерыванием, такую ​​как fstp.Обычно вы сохраняете результат в области памяти для последующего использования, например:

mem_area: defs 10         ; ten bytes for 80 bits
          fstp mem_area   ; pop it

Но если вы знаете, что хотите просто выбросить значение, вы можете использовать st(0) в качественазначение, сохраняя требования к памяти:

fstp st(0)

См. здесь для подробного руководства по инструкциям (в частности этот бит ).

4 голосов
/ 23 января 2011

Если st0 - единственный используемый регистр x87, вы можете очистить его с помощью:

ffree st0

Но это отличается от обычного всплывающего окна, если используется несколько стековых регистров, потому что это неотрегулировать указатель вершины стека (поле TOP в слове состояния x87).

См. главу регистров учебника Simply FPU x87 .

st1 все равно будет st1 после освобождения st0 вместо щелчка, так что обычно это не то, что вам нужно, и не имеет существенного преимущества перед fstp st0.

2 голосов
/ 23 января 2011

просто вытолкните его из стека любой (быстрой) инструкцией, которая появится. 8087 набор инструкций

если это не сработает, FUCOMPP выскочит дважды.

...