【我所認知的BIOS】->反彙編BIOS之Bootblock(5)
--Store CPU type to CMOS
By Lightseed
5/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裏。
三、小結
這個函數沒有什麼特色的地方,操作也比較簡單,沒說太多。函數的作用在文章的前面就說了。