2011-01-23 2 views
8

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

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

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

ответ

5

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

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

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

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

fstp st(0) 

См here для детального руководства по инструкции (в частности, this bit).

+0

Right вы, @Shaggieh, прокляните эти толстые пальцы. Исправлена. – paxdiablo

+0

Это сработало. Благодаря! –

+0

@Shaggieh: да, но дважды ошибаться в одном ответе просто небрежно :-) Исправлено еще раз. Приветствия. – paxdiablo

0

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

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

2

Если это только верхнее значение вы хотите избавиться от:

ffree st0 
13

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

asm 
fstp st(0) 
end; 
+4

На самом деле это правильный ответ. Большинство реализаций x87 оптимизированы для этого случая и даже не будут выполнять передачу, просто вытащите значение из стека. – IneQuation

 Смежные вопросы

  • Нет связанных вопросов^_^