如何在启动模式下使用 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代码序列,设置适当的环境,这将花费很长时间。

没有 APMACPI 最接近关机的是众所周知的

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