【问题标题】:How can shutdown the PC with Assembly 16 bits in boot mode?如何在引导模式下使用 Assembly 16 位关闭 PC?
【发布时间】:2015-09-17 23:29:04
【问题描述】:

我写了一个小引导加载程序,我用软盘编写,引导加载程序工作正常,我写了一个重启电脑的函数,但我无法关闭电脑,我尝试了很多,但我刚刚得到了一个扬声器发出无限的哔声。我处于启动模式,所以 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

【问题讨论】:

  • 请澄清“不起作用”是什么意思。
  • 代码只是冻结了 PC 并且扬声器发出了很多哔声
  • 第一个版本显然行不通,除非你以某种方式告诉 NASM 默认使用 base 16。 15 != 0x15 和 5307 != 0x5307。
  • 你用int 15h / ax=5301h连接APM接口了吗?
  • 第二个代码 sn-p 应该是mov ss,ax

标签: assembly operating-system boot shutdown


【解决方案1】:

你想走多远?

由于关闭计算机是特定于芯片组的,因此硬件编程接口从未被标准化。
但是一个软件接口已经标准化了,实际上有两个:Advanced Power Management (APM)Advanced Configuration And Power Interface (ACPI)

虽然第一个非常简单,并且是您正在使用的那个,但它非常古老(在计算机行业年代)。我制作了一个简单的启动程序,使用 APM 来关闭计算机。它以正确的方式学究式地做所有事情。
与 Bochs 一起工作。在真正的硬件上(在 3 台笔记本电脑上测试)它不会并打印错误代码 A,这意味着 未找到 APM 服务
这似乎表明 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多