8.2.4 其他寄存器
除了控制寄存器和状态寄存器,x87 FPU还有几个寄存器,这些寄存器的主要作用在于内部使用或调试,而非一般编程(www.cppentry.com)接口。
(1)标志寄存器
在操作数据寄存器堆栈时,如果寄存器为空(即没有初始化过),那么一般浮点指令将出错;如果寄存器已经有数据,那么FLD指令将出错。这么规定的目的是在出现误操作时通过触发异常(堆栈溢出)报警,避免计算错误,提高系统的稳定性。但是,仅仅根据数据寄存器的内容(即数据本身)无法判断该寄存器是否为空,于是就出现了标志寄存器。
标记是否为空只需1位,但是每个标记使用了2位,这样就有4种可能的标记,见表8-3。
表8-3 x87 FPU的标志寄存器
|
标记< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
说明 |
|
00 |
一般有限数 |
|
01 |
0 |
|
10 |
特殊值,例如非法格式、NaN、±∞、弱规范数 |
|
11 |
空,即没有初始化过 |
可见,虽然标记的最初目的是用于标记是否为空,但兼顾了优化计算的目的。除了空之外的3个标记显然是按计算特性划分的。一般有限数需要进行计算,0可以快速处理,而特殊值不能参与计算,只能特殊处理。
(2)调试寄存器
为了进一步支持调试,x87 FPU还实现了最后指令地址寄存器、最后操作数地址寄存器和操作码寄存器。
浮点计算过程中,当异常被触发时,调试最需要知道的自然是哪儿触发了这个异常以及在干什么时触发的。最后指令地址寄存器给出异常指令的地址,如果这条指令使用内存操作数,那么最后操作数地址寄存器给出操作数的内存地址。
所给出的地址是48位全局地址,即选择字:偏移形式,例如CS:EIP或DS:ESI。更详细的说明可以参阅文献[2]。
这些寄存器最可能的用户是调试器,一般用户不大可能编写指令级异常处理程序,即使是调试错误也是在调试器的支持下进行的,因此知道即可,无需关心细节。
【责任编辑:
董书 TEL:(010)68476606】