Rebooting From Your Program
<一>暖開機(Warm Reboot)及冷開機(Cold Reboot)
在DOS裡頭,有二種重開機方式。
(1)暖開機(Warm Reboot): 可用組合鍵"Ctrl-Alt-Del"達成。重開機的時候,除了記憶體測試(memory test)不被執行外,將會執行所有的系統電源測試(Power On System Tests,POSTs)。此外,中斷向量(Interrupt Vector)及系統計時器(System Timers)也重新啟始。換句話說,BIOS碼會將電腦系統啟始,準備載入作業系統(OS)。OS的載入由interrupt 19h發出。
(2)冷開機(Cold Reboot): 冷開機在系統開啟時發生。與暖開機唯一的不同點在memory測試。冷開機將不會略過 memory test,而是完整執行所有的測試。
<二>由軟體執行重開機
要執行暖開機或是冷開機決定在ROM BIOS的資料區裡的reset旗標,此旗標值被設為1234h時,將執行暖開機,設為其他值則會執行冷開機,通常設為0。此部份的code片斷:
ROMBIOS_DATA segment at 0400h
org 72h
ResetFlag dw ?
ROMBIOS_DATA ends
ROMBIOS segment at 0f000h
org 0fff0h
Reset label far
ROMBIOS ends
在code中:
mov ax, seg ROMBIOS_DATA
mov ds, ax
ASSUME ds:ROMBIOS_DATA
mov ResetFlag, 1234h ; or 0 if cold reset is desired
jmp Reset
<三>使用INT 19H
單獨使用此中斷只會重新將OS載入到電腦上,而有可能不適當地啟始電腦。中斷向量不會被重設,但有改寫中斷向量表的常駐程式(TSR)可能被覆蓋。明顯地,當這些被蓋掉的中斷被呼叫時,可能會引起系統當機。其他的問題像是計時器沒有重設,擴充卡沒被適當的重置等等。因此,千萬不要使用INT 19h來重開機。
<四>JUMP的位址以F000:E05B取代F000:FFF0
在原始的IBM ROM BIOS裡,記憶體位址F000:FFF0處的指令是做長跳躍到F000:E05B。而一些程式略過了這個JUMP,而直接到RESET程序的起點F000:E05B。我檢查了我的非IBM BIOS的386 CPU,發現RESET程序起點是一樣的。我相信直接使用F000:E05B是相當危險的,因為我們不能保證RESET程序起點一定都是在這個位置。使用F000:FFF0作為這個JUMP的位址,會避免一些錯誤的發生。