# An example get the FPU status register contents
#
# FPU寄存器包括8个80位数据寄存器。
#
# 因FPU独立于主处理器,一般不使用EFLAGS来表示结果和确定行为。
# FPU包含它自己的寄存器组来执行这些功能。有16位状态(status)、控制(control)、标记(tag)寄存器。
#
# FPU数据寄存器称为R0到R7。它们的操作和杆准寄存器不同,不同之处在于它们连接在一起形成一个堆栈。
# 和内存中的堆栈不同,FPU寄存器堆栈是循环的,即堆栈中的最后一个寄存器连接回堆栈中的第一个寄存器。
#
# 堆栈顶部的寄存器是在FPU的控制字寄存器中定义的,名为ST(0)。
# 除了顶部寄存器外的其他寄存器名称是ST(x),x是1到7。
#
# 当数据被加载到FPU堆栈时,堆栈顶部沿着8个寄存器向下移动。
# 当8个值被加载到堆栈中之后,所有8个FPU数据寄存器就都被使用了。
# 如果把第9个数据加载到堆栈中,堆栈指针回绕到第一个寄存器,
# 并且使用新的值替换这个寄存器中的值,这会产生FPU异常错误。
#
#
.section .data
output:
.asciz "The FPU status register is 0x%x\n"
.section .bss
.lcomm status, 2
.section .text
.globl main
main:
nop
fstsw %ax
fstsw status
push %ax
push $output
call printf
add $8, %esp
push $status
push $output
call printf
add $8, %esp
movl $1, %eax
movl $0, %ebx
int $0x80
# gcc -g -o 01 01-fstsw.s -m32
#
# gdb -q -f 01
#
# info all
#
# st0 0 (raw 0x00000000000000000000)
# st1 0 (raw 0x00000000000000000000)
# st2 0 (raw 0x00000000000000000000)
# st3 0 (raw 0x00000000000000000000)
# st4 0 (raw 0x00000000000000000000)
# st5 0 (raw 0x00000000000000000000)
# st6 0 (raw 0x00000000000000000000)
# st7 0 (raw 0x00000000000000000000)
# fctrl 0x37f 895
# fstat 0x0 0
# ftag 0xffff 65535
# fiseg 0x0 0
# fioff 0x0 0
# foseg 0x0 0
# fooff 0x0 0
# fop 0x0 0