Linux内核完全剖析出错指针寄存器_Linux内核完全剖析出错指针寄存器试读-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 编程 > Linux内核完全剖析 > 出错指针寄存器

Linux内核完全剖析——出错指针寄存器

    出错指针寄存器(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内核完全剖析》其他试读目录

• 序
• 数学协处理器
• 浮点数据类型
• 特殊实数
• 数学协处理器功能和结构
• 栈式浮点累加器
• 状态与控制寄存器
• 出错指针寄存器 [当前]
• math_emulate.c程序