这个例子是用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?
答案 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章。