我写了一个小的bootloader,我在Diskette中写道,bootloader工作正常,我写了一个功能来重启PC,但是我无法关闭PC,我尝试了很多,但我刚刚得到一个来自扬声器的无限哔哔声。我处于启动模式,因此Windows中断不起作用。我该怎么做?我正在编译NASM并用Rawriter写入软盘。
我曾尝试过在Stackoverflow中看到的代码,但它不起作用。
MOV AX,5307
MOV BX,0001
MOV CX,0003
INT 15
我也尝试了另一个
mov ax, 0x1000
mov ax, ss
mov sp, 0xf000
mov ax, 0x5307
mov bx, 0x0001
mov cx, 0x0003
int 0x15
答案 0 :(得分:2)
你想走多远?
由于关闭计算机是特定于芯片组的,因此硬件编程接口从未被标准化 但是,软件界面已经标准化,实际上有两个: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