Бесплатные FPU стека x87, так (с архитектурой ia32)

в моем университете мы только что познакомились с ia32 x87 FPU. Но нам не сообщили, как очистить FPU-стек от уже не востребованных элементов.

представьте, что мы выполняем простой расчет, как (5.6 * 2.4) + (3.9 * 10.3).

.data
        value1: .float 5.6
        value2: .float 2.4
        value3: .float 3.8
        value4: .float 10.3

        output: .string "The result is: %fn"

.text
.global main

main:
        fld     value1          # Load / Push 5.6 into FPU
        fmul    value2          # Multiply FPU's top (5.6) with 2.4
        fld     value3          # Load / Push 3.8 into FPU
        fmul    value4          # Multiply the top element of the FPU's Stacks with 10.3
        fadd    %st(1)          # Add the value under the top element to the top elements value

.output:
        # Reserve memory for a float (64 Bit)
        subl , %esp
        # Pop the FPU's top element to the program's Stack
        fstpl (%esp)
        # Push the string to the stack
        pushl $output
        # Call printf function with the both parameters above
        call printf
        # Free the programs stack from the parameters for printf
        addl , %esp

.exit:
        movl , %eax
        int x80

проблема: после появления верхнего элемента FPU, который содержит результат вычисления. Как освободить стек FPU от оставшегося нового верхнего элемента, который содержит результат (5.6*2.4).

единственный способ, который я могу себе представить, - это освободить еще один стек программы и вытащить элементы из стека FPU, пока все больше не будут удалены.

есть ли способ напрямую манипулировать верхним указателем?

4 ответов


чтобы выполнить это, у вас нет гарбаджа в стеке, вам нужно использовать FADDP и FMULP и подобные инструкции.


в случае, если кто-то вроде меня приходит сюда в поисках лучшего способа очистить стек, я нашел это простое решение лучшим:

fstp ST(0) ; just pops top of the stack

emms также можно использовать для обозначения каждого члена f.p. стек как бесплатно. Это имеет преимущество перед finit, что он не меняет никаких флагов в f.p. контрольные или статусные слова (маски исключений и т. д.)


есть несколько инструкций, которые могут выполнять операции как один вы ищете. FDECSTP уменьшает указатель стека (не делая ничего), FFREE отмечает слот как пустой (не касаясь указателя стека, хотя). Решение, упомянутое выше, с FADDP или FMULP часто лучше, хотя.

вы должны рассмотреть загрузку Руководства По Архитектуре Intel. Они содержат полный набор инструкций семейства процессоров Intel.