你想走多远?
由于关闭计算机是特定于芯片组的,因此硬件编程接口从未被标准化。
但是一个软件接口已经标准化了,实际上有两个:Advanced Power Management (APM)和Advanced Configuration And Power Interface (ACPI)。
虽然第一个非常简单,并且是您正在使用的那个,但它非常古老(在计算机行业年代)。我制作了一个简单的启动程序,使用 APM 来关闭计算机。它以正确的方式学究式地做所有事情。
与 Bochs 一起工作。在真正的硬件上(在 3 台笔记本电脑上测试)它不会并打印错误代码 A,这意味着 未找到 APM 服务。
这似乎表明 APM 接口不再受支持,老实说,这并不让我感到惊讶,我期待它,反之亦然。
所以你只剩下 ACPI,除非你真的很熟悉它,否则我只是建议你不要深入研究它(如果你是一个特定的解决方案,请获取你的芯片组数据表),因为它相当详细,并且有特定的术语,它处理电源管理的整个方面。
你必须找到并解析各种表,解释AML代码序列,设置合适的环境,这需要很长时间。
在没有 APM 或 ACPI 的情况下最接近关机的是众所周知的
cli
hlt
指令对。
如果你对APM引导程序感兴趣可以试试看,这里是
BITS 16
jmp 07c0h:WORD __START__
__START__:
mov ax, cs
mov ss, ax
xor sp, sp
push cs
pop ds
push WORD 0b800h
pop es
mov ax, 03h
int 10h
;^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
; \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
; v v v v v v v v v v v v v v v v v
;Check APM service is present
mov BYTE [error], 'A'
mov ax, 5300h
xor bx, bx
int 15h
jc .err
inc BYTE [error]
cmp bx, 504dh
jne .err
;^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
; \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
; v v v v v v v v v v v v v v v v v
;Connect RM interface, compatibility mode APM 1.0
inc BYTE [error]
mov ax, 5301h
xor bx, bx
int 15h
jc .err
;^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
; \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
; v v v v v v v v v v v v v v v v v
;Switch to APM 1.1+
inc BYTE [error]
mov ax, 530eh
xor bx, bx
mov cx, 0101h
int 15h
jc .err
inc BYTE [error]
cmp al, 01h
jb .err
;^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
; \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
; v v v v v v v v v v v v v v v v v
;Enable APM
inc BYTE [error]
mov ax, 5308h
mov bx, 01h
mov cx, 01h
int 15h
jc .err
;^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
; \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
; v v v v v v v v v v v v v v v v v
;Engage APM
inc BYTE [error]
mov ax, 530fh
mov bx, 01h
mov cx, 01h
int 15h
jc .err
;^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
; \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \
; v v v v v v v v v v v v v v v v v
;Shutdown
inc BYTE [error]
mov ax, 5307h
mov bx, 01h
mov cx, 03h
int 15h
jc .err
jmp .end
.err:
xor di, di
mov ah, 09h
mov al, BYTE [error]
stosw
.end:
cli
hlt
error db 0
TIMES 505-($-__START__) db 0
dw 0aa55h