reactos操作系统实现(18)

X86 的体系架构里,整数运算和浮点运算是分开的。算术逻辑单元 (Arithmetic Logic Unit, ALU) 是中央处理器 (CPU) 的执行单元,是所有中央处理器的核心组成部分,由 " 与门 " " 或门 " 构成的算术逻辑单元,主要功能是进行二进制的算术运算,如加减乘 ( 不包括整数除法 ) 。基本上,在所有现代 CPU 体系结构中,二进制都以二补数的形式来表示。浮点运算器( floating point unit ,缩写 FPU )是执行浮点运算的结构。一般是用电路来实现,应用在计算机芯片中。是整数运算器之后的一大发展,因为在浮点运算器发明之前,计算机中的浮点运算都是用整数运算来模拟的,效率十分低下。

 

下面这行语句,就是检测CPU是否有浮点运算器。

/* Check if an FPU is present */

    NpxPresent = KiIsNpxPresent();

如果有有浮点运算器,就会返回TRUE,否则返回FALSEKiIsNpxPresent函数是使用汇编编写的,如下:

#001  .globl _KiIsNpxPresent@0

#002  .func KiIsNpxPresent@0

#003  _KiIsNpxPresent@0:

#004 

#005      /* Save stack */

#006      push ebp

#007 

#008      /* Get CR0 and mask out FPU flags */

#009      mov eax, cr0

#010      and eax, ~(CR0_MP + CR0_TS + CR0_EM + CR0_ET)

获取CR0寄存器的值。

 

#011 

#012      /* Initialize the FPU and assume FALSE for return */

#013      xor edx, edx

#014      fninit

设置返回值为FALSE,并初始化浮点运算器。

 

#015 

#016      /* Save magic value on stack */

#017      mov ecx, 0x42424242

#018      push ecx

#019 

#020      /* Setup stack for FPU store */

#021      mov ebp ,esp

#022      fnstsw [ebp]

保存浮点控制寄存器值到栈里。

 

#023 

#024      /* Now check if our magic got cleared */

#025      cmp byte ptr [ebp], 0

#026      jnz NoFpu

上面判断浮点控制寄存器值是否保存出来,如果清空为0,说明保存出来,有浮点运算器,否则就是没有。

 

#027 

#028      /* Enable FPU, set return to TRUE */

#029      or eax, CR0_ET

#030      mov edx, 1

打开浮点运算器,并设置返回值为TRUE

 

#031  

#032      /* If this is a 486 or higher, enable INT 16 as well */

#033      cmp dword ptr fs:KPCR_PRCB_CPU_TYPE, 3

#034      jbe NoFpu

#035      or eax, CR0_NE

#036 

#037  NoFpu:

#038      /* Set emulation enabled during the first boot phase and set the CR0 */

#039      or eax, (CR0_EM + CR0_TS)

#040      mov cr0, eax

#041 

#042      /* Restore stack */

#043      pop eax

#044      pop ebp

#045 

#046      /* Return true or false */

#047      mov eax, edx

#048      ret

#049  .endfunc

 

通过上面这段代码,就可以判断 X86 CPU 是否有浮点运算器,如果没有浮点运算器,就可以使用整数来模拟了。如下图,就是显示 FPU 的存在:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值