Intel汇编-FPU状态

# 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值