如何在启动模式下使用 16 位程序集关闭 PC?
How can shutdown the PC with Assembly 16 bits in boot mode?
我写了一个小的引导加载程序,我写在软盘上,引导加载程序工作正常,我写了一个函数来重启电脑,但我无法关闭电脑,我尝试了很多,但我只是从扬声器中听到无限的哔哔声。我处于启动模式,因此 windows 中断不起作用。我该怎么做?我正在用 NASM 编译并用 Rawriter 写入软盘。
我曾尝试过我在 Whosebug 中看到的代码,但它不起作用。
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
你想用这个走多远?
因为关闭计算机是特定于芯片组的,所以硬件编程接口从未标准化。
然而一个软件界面已经标准化,实际上有两个是:Advanced Power Management (APM) and Advanced Configuration And Power Interface (ACPI).
虽然第一个非常简单,而且是您正在使用的那个,但它非常古老(在计算机行业年代)。我制作了一个简单的启动程序,它使用 APM 来关闭计算机。它以正确的方式迂腐地完成所有事情。
与 Bochs 一起工作。在真正的硬件上(在 3 台笔记本电脑上测试过)它不会打印错误代码 A 这意味着 No APM service found.
这似乎表明不再支持 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
我写了一个小的引导加载程序,我写在软盘上,引导加载程序工作正常,我写了一个函数来重启电脑,但我无法关闭电脑,我尝试了很多,但我只是从扬声器中听到无限的哔哔声。我处于启动模式,因此 windows 中断不起作用。我该怎么做?我正在用 NASM 编译并用 Rawriter 写入软盘。
我曾尝试过我在 Whosebug 中看到的代码,但它不起作用。
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
你想用这个走多远?
因为关闭计算机是特定于芯片组的,所以硬件编程接口从未标准化。
然而一个软件界面已经标准化,实际上有两个是:Advanced Power Management (APM) and Advanced Configuration And Power Interface (ACPI).
虽然第一个非常简单,而且是您正在使用的那个,但它非常古老(在计算机行业年代)。我制作了一个简单的启动程序,它使用 APM 来关闭计算机。它以正确的方式迂腐地完成所有事情。
与 Bochs 一起工作。在真正的硬件上(在 3 台笔记本电脑上测试过)它不会打印错误代码 A 这意味着 No APM service found.
这似乎表明不再支持 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