В моем университете мы только что познакомились с IA32 x87 FPU. Но нам не сообщили, как очистить FPU-Stack от более не требуемых элементов.Бесплатно x87 FPU Stack (ia32)
Представьте, что мы выполняем простой расчет, например (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, пока все ненужные элементы не будут удалены.
Есть ли способ напрямую манипулировать указателем верхнего уровня?
Компилятор C обычно хорош для генерации кода, подобного этому. Шахта использует FMULP вместо FMUL, проблема решена. –
Обратите внимание, что вы * можете * вручную перемещать вершину с помощью 'fincstp' и' fdecstp' и отмечать regs бесплатно с помощью 'ffree', но лучше этого избежать. – gsg
Если вы знаете, сколько элементов у вас есть в стеке FPU, вы можете выполнить 'ffree st (0)' и 'fincstp' в цикле. – Michael