出错指针寄存器(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位的值即可。 表11-4 浮点指令类型 第1字节 第2字节 可选字段 1 1 1 0 1 1 OPA 1 MOD 1 OPB R/M SIB DISP 2 1 1 0 1 1 MF OPA MOD OPB R/M SIB DISP 3 1 1 0 1 1 d P OPA 1 1 OPB ST(i) 4 1 1 0 1 1 0 0 1 1 1 1 OP 5 1 1 0 1 1 0 1 1 1 1 1 OP 15~11 10 9 8 7 6 5 4 3 2 1 0 表中各个字段的含义如下(有关这些字段的具体含义和详细说明请参考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等。
Linux内核完全剖析——出错指针寄存器
书名: Linux内核完全剖析
作者: 赵炯
出版社: 机械工业出版社
副标题: 基于0.12内核
出版年: 2008.10
页数: 945
定价: 99.00元
装帧: 平装
ISBN: 9787111250470