FFREE ST(i)修改了x87标签字中的哪些位?

时间:2017-06-17 16:01:52

标签: assembly x86 x87

这个例子是用NASM编写的:

section .bss
    var28: resb  28


section .text
    _main:

        ; Initialize
            finit
            fldpi
        ; Read Tag Word
            fstenv [var28]
            mov    ax, [var28 + 8] ; move the Tag Word to ax

此时ax = 0011 1111 1111 1111,这意味着ST7 = 00(有效),其余为11(空)。

其余代码:

        ; FFREE ST(i)

            ffree ST7 ; Sets tag for ST(i) to empty.
            ; Read Tag Word
                fstenv [var28]
                mov    ax, [var28 + 8] ; move the Tag Word to ax

此时ax = 0011 1111 1111 1111 我的问题是,不应该是ax = 11 11 1111 1111 1111?

1 个答案:

答案 0 :(得分:4)

  

此时ax = 0011 1111 1111 1111,这意味着ST7 = 00(有效),   其余的是11(空)

即可。标签字指的是寄存器(R7..R0),而ST(i)指的是可以改变的“堆栈顶部”(TOS)。

第一个fldpi将TOS(= ST(0))设置为注册R7并将PI加载到该寄存器中。第二个fld会将TOS更改为注册R6并填充该寄存器。然后,ST(0)将指向第二个fld的寄存器。 ffree st0将释放R6(标记字中的第二个标记)并将ST0设置为R7。状态字包含一个三位数字,其中包含TOS当前指向的寄存器。

在您的示例程序中,fldpi将PI加载到指向R7的ST(0)。要清空R7,您必须使用ffree st0

请查看详细讨论的Intel Manual Vol. 1第8章。