3.出错指针寄存器

出错指针寄存器(Error-Pointer Register)是4个32位的80387寄存器,其中含有80387最后执行指令和所用数据的指针,参见图11-6。前两个寄存器FIP和FCS中是最后执行指令中2个操作码的指针(忽略前缀码)。FCS是段选择符和操作码,FIP是段内偏移值。后两个寄存器FOO和FOS是最后执行指令内存操作数的指针。FOS中是段选择符,FOO中是段内偏移值。如果最后执行的协处理器指令不含内存操作数,则后两个寄存器值无用。指令FLDENV、FSTENV、FNSTENV、FRSTOR、FSAVE和FNSAVE用于加载和保存这4个寄存器的内容。前3条指令共加载或保存28字节内容:控制字、状态字和特征字以及4个出错指针寄存器。控制字、状态字和特征字都以32位操作,高16位为0。后3条指令用于加载或保存协处理器所有108字节的寄存器内容。

4.浮点指令格式

对协处理器进行仿真就是解析具体的浮点指令操作码和操作数,根据每一条指令的结构使用80386的普通指令来执行相应的仿真操作。数学协处理器80387共有七十多条指令,共分5类,见表11-4。每条指令的操作码都有2个字节,其中第一个字节高5位都是二进制11011。这5位的数值(0x1b或十进制27)正好是字符ESC(转义)的ASCII代码值,因此所有数学协处理器指令都被形象地称为ESC转义指令。在仿真浮点指令时可忽略相同的ESC位,只要判断低11位的值即可。

Linux内核完全剖析---数学协处理器1)

表中各个字段的含义如下(有关这些字段的具体含义和详细说明请参考80x86处理器手册):

1)OP(Operation opcode)是指令操作码,在有些指令中它被分成了OPA和OPB两部分。

2)MF(Memory Format)是内存格式。00:32位实数;01:32位整数;10:64位实数;11:64位整数。

3)P(Pop)指明在操作后是否要执行一次出栈处理。0:不需要;1:操作后弹出栈。

4)d(destination)指明保存操作结果的累加器。0:ST(0);1:ST(i)。

5)MOD(Mode)和R/M(Register/Memory)是操作方式字段和操作数位置字段。

6)SIB(Scale Index Base)和DISP(Displacement)是具有MOD和R/M字段指令的可选后续字段。

另外,所有浮点指令的汇编语言助记符都以字母F开头,例如:FADD、FLD等。还有如下一些标准表示方法:

1)FI 所有操作整型数据的指令都以FI开头,例如FIADD、FILD等。

2)FB 所有操作BCD类型数据的指令都以FB开头,例如FBLD、FBST等。

3)FxxP 所有会执行一次出栈操作的指令均以字母P结尾,例如FSTP、FADDP等。

4)FxxPP 所有会执行二次出栈操作的指令均以字母PP结尾,例如FCOMPP、FUCOMPP等。

5)FNxx 除了以FN开头的指令,所有指令在执行前都会先检测未屏蔽的运算异常。而以FN开头的指令不检测运算异常情况,例如FNINIT、FNSAVE等。


相关内容