# An example of basic FPU math
#
# 基本浮点运算
#
# FADD 浮点加法
# FDIV 浮点除法
# FDIVR 反向浮点除法
# FMUL 浮点乘法
# FSUB 浮点减法
# FSUBR 反向浮点减法
#
# 每一个都具有单独的指令和格式,可以生成6个可能的功能,取决于执行的确切操作是什么。
#
# FADD source # 内存中的32位或者64位值和ST0相加
# FADD %st(x), %st(0) # st(x) 和 st(0) 相加,结果存储到st(0)中
# FADDP %st(0), %st(x) # st(0) 和 st(x) 相加,结果存储到st(x)中,并且弹出st(0)
#
# 操作完成后如何处理寄存器(要么保留,要么弹出堆栈)。跟踪FPU寄存器值的状态很重要。
# 有时候复杂的数学操作会执行多个操作,这些操作把各种值存储到不同的寄存器中,这时跟踪状态是困难的。
#
#
# ((43.65 / 22) + (76.34 * 3.1)) / ((12.43 * 6) - (140.2 / 94.21))
#
#
.section .data
value1:
.float 43.65
value2:
.int 22
value3:
.float 76.34
value4:
.float 3.1
value5:
.float 12.43
value6:
.int 6
value7:
.float 140.2
value8:
.float 94.21
output:
.asciz "The result is %f\n"
.section .text
.globl main
main:
nop
finit
flds value1
fidiv value2
flds value3
flds value4
fmul %st(1), %st(0)
fadd %st(2), %st(0)
flds value5
fimul value6
flds value7
flds value8
fdivrp
fsubr %st(1), %st(0)
fdivr %st(2), %st(0)
subl $8, %esp
fstpl (%esp)
push $output
call printf
add $12, %esp
push $0
call exit
# gcc -g -o 04 04-fpmath.s -m32
#
# The result is 3.264907
#