|
|
原帖由 lvyanan 于 2008-11-21 20:49 发表 
老猫已经作答了,是个格式问题,你那条指令在裸汇编里是可以用的,但要编译,就必须加伪指令来说明。这条绝对跳转指令,是跳转到BIOS初始化程序的入口指令,系统至此就会无条件地重新启动,不需要准备什么其它动作。
是有区别的。在JMP FAR F000:FFF0后会检查[0040:0072]该字的值——
0000:相当于按RESET键。
1234:跳过内存检测,也就是所谓的热启动,相当于按CTRL+ALT+DEL。
5678:挂起/正常模式转换(可能对DOS无效),不检测内存、不POST、内存内容不变。
9ABC:厂家检测用。
ABCD:不停地循环POST。下面是MS给出的例程——- ; Assemble options needed: none
- .MODEL small
- .CODE
- Start:
- mov ax, @data ; Load ds with data segment
- mov ds, ax
- mov ax, 40h ; These three lines cause a memory
- mov es, ax ; test NOT to be performed. To
- mov WORD PTR es:[72h], 1234h ; do a memory test, remove them.
- jmp DWORD PTR b_vec ; Jump to the reboot address
- .DATA
- b_vec DW 00000h ; Offset of reboot vector
- DW 0FFFFh ; Segment of reboot vector
- .STACK
- END Start
复制代码 以上的重启仅在实模式有效。
===============================================
想在保护模式也有效的话,可以向键盘口写"系统复位"命令(当然要在RING0下)- cli
- WaitRdy: ;8042控制器忙
- in al,64H ;读8042状态字节
- test al,00000010B
- jnz WaitRdy
- mov al,0FEH ;8042 pin=0为系统复位
- out 64H,al ;重启
复制代码 ===============================================
其实LZ的那段代码可不一定都能实现关机,它与ACPI关机状态字节有关,根据那个字节的值的不同可能出现关机、STR、STD、唤醒、重启等多种状态。
[ 本帖最后由 netwinxp 于 2008-11-22 11:05 编辑 ] |
|