这个例子是用 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 =1111 1111 1111 1111?
此时ax=0011 1111 1111 1111,也就是说ST7=00(有效),
其余的是11(空).
No。标记字指的是寄存器 (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 加载到ST(0)
它指向R7。要清空 R7,您必须使用ffree st0
.
请看第8章英特尔手册卷。 1在那里详细讨论了它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)