如何在引导模式下使用Assembly 16位关闭PC?

时间:2015-07-01 00:15:43

标签: assembly operating-system boot shutdown

我写了一个小的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

1 个答案:

答案 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