2017-06-17 41 views
2

这个例子是写在NASM:x87标记字中的哪些位会执行FFREE ST(i)修改?

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 1111 1111 1111?

+0

'FFREE'仅在与FDECSTP或FINCSTP组合时才有用。最常见的组合是'FFREE' +'FINCSTP',这相当于(并且效率低于)'FSTP'。我还没有找到一个很好的理由来使用'FFREE'。 –

+0

@CodyGray我看到那篇文章,与我的问题无关。我的问题更详细,将其标记为该帖子的副本是不公平的。 –

+0

@CodyGray因为人们会去看另一个问题,认为它是“原创”的,但它并没有像这个那样多的细节。 –

回答

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章,详细讨论它。

+0

确实,这让我困惑。指令'FFREE ST(i)'使用TOS来修改TAG。 –