在我的大学里,我们刚刚介绍了IA32 x87 FPU。但是我们没有被告知如何清除FPU-Stack中不再需要的元素。

想象我们正在执行一个简单的计算,例如(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: %f\n"

.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 $8, %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 $12, %esp

.exit:
        movl $1, %eax
        int $0x80

问题是:在弹出FPU的顶部元素之后,该元素保存了计算结果。我如何从现在剩下的新的顶部元素(包含结果(5.6 * 2.4))中释放FPU的堆栈。

我能想象的唯一方法是释放更多的程序堆栈,并从FPU的堆栈中弹出元素,直到所有不再需要的元素都被删除为止。

是否可以直接操纵顶部指针?

最佳答案

为了确保您在堆栈上没有垃圾,您需要使用FADDPFMULP以及类似的指令。

关于assembly - 释放x87 FPU堆栈(ia32),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19892215/

10-11 07:35