【我所认知的BIOS】->反汇编BIOS之Bootblock(5)--Store CPU type to CMOSBy Lightseed5/18/2010一、BIOS的主流程从这章开始,我在每章的开头说把目前BIOS的主流程进行到了哪一步放在最前面,这样有助于理解整个Award BIOS的流程。到目前为止,我们的BIOS主流程如图1所示,图1 BIOS主流程那这节我们就来看看BIOS中记录CPU type的子函数。二、Record_CPU_type_cmos废话还是要说一下,从下面的code中我们可以看到,在Record_CPU_type_cmos这个函数前面有其他的东西,我们先暂时不管,直接看这个函数的一些片段(因为那是下下个章节要说的。)。_F000:E580 ;哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?_F000:E580_F000:E580 Record_CPU_type_cmos: ; CODE XREF: _F000:E1DAj_F000:E580 mov es, sp_F000:E582 assume es:nothing_F000:E582 xchg si, dx_F000:E584 mov sp, 0E58Ah_F000:E587 jmp locret_FF76A_F000:E59A_F000:E59A Wait_RTC_ready: ; CODE XREF: _F000:E5B0j _F000:E5D3 xchg dx, bp_F000:E5D5 mov si, 0E57Ah ; From the table, we can know there is no thing infomation in the CPU_TYPE_TABLE_F000:E5D8_F000:E5D8 loc_FE5D8: ; CODE XREF: _F000:E5EAj_F000:E5D8 mov ax, cs:[si]_F000:E5DB cmp dx, cs:[si+2]_F000:E5DF jb loc_FE5E7_F000:E5E1 cmp dx, cs:[si+4]_F000:E5E5 jbe loc_FE5EC_F000:E5E7_F000:E5E7 loc_FE5E7: ; CODE XREF: _F000:E5DFj_F000:E5E7 add si, 6_F000:E5EA jmp short loc_FE5D8_F000:E5EC ;哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪? Call Store_cpu_type_CMOS ;伪代码 _F000:E604 ;哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?_F000:E604 mov sp, es ; Return CPU_detect_F000:E606 retn上面是Record_CPU_type_cmos的主函数,因为code感觉稍微比较乱一点,我还是要简单说明一下他的结构。①_F000:E582,_F000:E58C ,_F000:E58E这三行都是为了保存DX寄存器做的动作。②Wait_RTC_ready这个loop主要是为了测试CMOS是否是OK的。否则就会在这里死机。③_F000:E5D3这行是恢复了CPU上电时存在GS里面的CPU的信息,后续的动作是用这个DX的值来在_F000:E57A CPU_type_table这个table中确定当前CPU的type的。④经过上面的三步后,再通过调用相关操作CMOS的函数把对应的值存到CMOS里面去。⑤从_F000:E579 ;哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?_F000:E57A CPU_type_table db 86h ; ?_F000:E57B db 0 ; _F000:E57C db 0 ; _F000:E57D db 0 ; _F000:E57E db 0FFh ; _F000:E57F db 0FFh ;这个table里面可以看到,其实实际的是没信息的。那么在函数执行的时候,参考这个table的时候发现是没有对应的CPU类型的,那么就会记录这个CPU类型是未知的。姑且我们现在不去追究后续有什么用,BIOS在留下了足迹到CMOS里。三、小结这个函数没有什么特色的地方,操作也比较简单,没说太多。函数的作用在文章的前面就说了。