貌似很多遊戲保護系統都是這麼重啓的
mov dx, 64h
mov al, feh
out dx, al
HS的重啓
cli
push 000000FE
push 00000064
Call WRITE_PORT_UCHAR
hlt
異曲同工之處!
BIOS知識點滴Follow Bini系列之---系統重啓
複製內容到剪貼板
代碼:
;----------------------------------------------
; 文件名:KBCReset.asm
;----------------------------------------------
; 2007-12-11 bini.Yi/易祝兵 For teaching
;----------------------------------------------
.386
.model tiny
.code
org 100h
;; 如下代碼參照 《PC技術內幕》第8章 鍵盤系統
START:
mov bl, 0FEh ; KBC Reset命令
call keyboard_cmd ; 不應該有返回
hlt
IODELAY MACRO
out 0EDh, al
ENDM
;----------------------------------------------
; keyboard_cmd()
;----------------------------------------------
; 如果由於緩衝區滿超時,則 ah 返回非零
; 調用 bl = 命令字節
; ds = cs
;
; 返回 如果 ah =0,則成功
; 如果 ah =1,則失敗
;----------------------------------------------
keyboard_cmd PROC NEAR
xor cx, cx ; 超時計數器(64K)
cmd_wait:
in al, 64h ; 獲取控制器狀態
IODELAY
test al, 2 ; bit1,輸入緩衝區滿?(控制器是否有數據沒處理完)
jz cmd_send ; 緩衝區空,準備接收命令.
loop cmd_wait ; 緩衝區滿,重試
jmp cmd_error ; 超時,失敗
cmd_send:
mov al, bl ; 取 bl 中的命令字節
out 64h, al ; 發送命令字節
IODELAY
xor cx, cx ; 超時計數器(64K)
cmd_accept:
in al, 64h ; 獲取控制器狀態
IODELAY
test al, 2 ; bit1,輸入緩衝區滿?(控制器是否有數據沒處理完)
jz cmd_ok ; 緩衝區空,處理完
loop cmd_accept ; 緩衝區滿,重試
cmd_error: ; 超時失敗
mov ah, 1 ; 失敗返回狀態非零
jmp cmd_exit
cmd_ok:
xor ah, ah ; 成功返回零
cmd_exit:
ret
keyboard_cmd ENDP
END START
2、PORT 92h
從EISA系統之後,系統控制端口定義了一位用來快速重啓的寄存器,就是在PORT 92h的Bit0,這種方式最終結果是和KBC一樣的,HOST會拉CPU的INIT#以讓系統重啓。但這種方式不通過KBC,所以速度更快一點,代碼如下:
複製內容到剪貼板
代碼:
in al, 92h
IODELAY
or al, 1
out 92h, al
hlt
3、Reset Control Register(Port CF9h)
用此方法控制Reset,各Chip極有可能各芯片產商的做法會不同。
計算機研發論壇,BIOS技術網站,BIOS技術論壇,BIOS SPEC,BIOS手冊,BIOS入門,ACPI,SMBIOS,BIOS技術,EC資料,EC開發,PS/2,KBC) f$ w9 t7 X) l) h6 U
這裏大家可以認識幾種Reset的名詞: Platform Reset, PCI Reset, System Reset, Reset CPU.我們來看Intel的文檔,如下圖:
1.GIF (21.4 KB)
大家注意看,如果System Reset bit位爲1,那麼如果Reset CPU bit從0變爲1時,系統就會產生Platform Reset(包括產生PCI、FWH、SIO、LPC、MCH Reset),即稱爲Hard Reset;如System Reset bit位爲0,那麼系統就會產生Soft Reset,即:和KBC/PORT 92h Bit0一樣,下拉CPU INIT# 16個PCI Clock。
因此你可以用下如代碼Hard Reset:
複製內容到剪貼板
代碼:
mov al, 6
mov dx, 0CF9h
out dx, al
jmp $
也可以用如下代碼“關機”(看你的機器的做法,也就是對SLP_S3#,SLP_S4#,SLP_S5#的處理):
複製內容到剪貼板
代碼:
mov al, 0Eh
mov dx, 0CF9h
out dx, al
jmp $
4、Ctrl+Alt+Del
這種方法“基本”是在“DOS”下有效,教課書上常稱爲"熱啓"。鍵盤中斷會hook住你的按鍵,Hook就是BIOS的INT 09h軟中斷,當你按下這三個鍵時,就相當於Far jmp到 F000:FFF0處。用如下代碼在DOS可實現熱啓動。
複製內容到剪貼板
代碼:
jmp F000:FFF0
OK,你對系統重啓是否又清楚了一些呢?