中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
English/Chinese Fix Translation
作者:
标题: DOS下关机的源程序(汇编) 上一主题 | 下一主题
ko20010214
版主




积分 7294
发帖 1628
注册 2002-10-16
状态 离线
『楼 主』:  DOS下关机的源程序(汇编) [已使用 LLM 解释]

.Model tiny
.Code
Org 100h
Start:

mov ax,5300h
xor bx,bx
int 15h ; Check APM install
jnb @@1
jmp ExitSys

@@1:
cmp bx,504Dh ; sign
jz @@2
jmp ExitSys

@@2:
cmp ax,101h ; ver 1.1
jnb @@3
jmp ExitSys

@@3:
push cx
mov Version,ax
mov ax,5400h
xor bx,bx
int 2Fh ; power.exe install check?
xor ax,ax
cmp bx,504Dh
jnz @@4
push ax ; power.exe version
mov ax,5401h
mov bx,100h
int 2Fh ; set management enable
pop ax
jb @@4
inc ax
@@4:
pop cx
push ax
push bx
push cx
mov ax,5301h
xor bx,bx
int 15h ; real-mode interface
mov ax,530Eh
xor bx,bx
mov cx,101h
int 15h ; driver version
mov ax,530Fh
mov bx,1
mov cx,bx
int 15h ; engage power management
mov ax,5308h
mov bx,1
mov cx,bx
int 15h ; enable power mamagement
mov ax,5307h
mov bx,1
mov cx,3
int 15h ; power off
pop cx ; support device

test cl,8 ; BIOS power management disable?
jz @@5
push cx
mov ax,5308h
mov bx,1
xor cx,cx
int 15h ; system stand-by
pop cx

@@5:
test cl,10h ; BIOS power disengaged
jz @@6
mov ax,530Fh
mov bx,1
xor cx,cx
int 15h ; disengage power management

@@6:
mov ax,5304h
xor bx,bx
int 15h ; disconnect interface
pop bx
pop ax
test ax,ax
jz ExitSys
mov ax,5401h
mov bl,bh
mov bh,1
int 2Fh ; set APM firmware power manager enable

ExitSys:

mov ax,4c00h
int 21h

Version DW ?

End Start
LLM 解释

代码整体功能概述

这段汇编代码是用于在DOS环境下尝试实现关机相关操作,主要涉及对高级电源管理(APM)的检查、初始化以及调用相关功能来执行关机等电源管理操作。

代码各部分详细解释

1. 初始设置

.Model tiny
.Code
        Org 100h
Start:
  • .Model tiny:声明使用微小模式,这种模式下程序被编译为一个64KB以内的COM文件。
  • .Code:标识代码段开始。
  • Org 100h:指定代码的起始偏移地址为100h,这是COM文件常见的起始位置。
  • Start::程序的入口标签。

2. 检查APM安装情况

        mov  ax,5300h
        xor  bx,bx
        int  15h         ; Check APM install
        jnb  @@1
        jmp  ExitSys
  • mov ax,5300h:将功能号5300h放入ax寄存器,这是BIOS中断15h中用于检查APM是否安装的功能号。
  • xor bx,bx:将bx寄存器清零。
  • int 15h:调用BIOS中断15h,执行检查APM安装的操作。
  • jnb @@1:如果进位标志位没有被设置(表示操作成功),则跳转到@@1标签处;否则跳转到ExitSys

3. 检查APM签名

@@1:
        cmp  bx,504Dh   ; sign
        jz   @@2
        jmp  ExitSys
  • cmp bx,504Dh:比较bx寄存器的值与APM的签名值504Dh(十六进制)。
  • jz @@2:如果相等,则跳转到@@2标签处;否则跳转到ExitSys

4. 检查APM版本

@@2:
        cmp  ax,101h    ; ver 1.1
        jnb  @@3
        jmp  ExitSys
  • cmp ax,101h:比较ax寄存器中的值与APM的版本号101h。
  • jnb @@3:如果大于等于该版本号,则跳转到@@3标签处;否则跳转到ExitSys

5. 检查power.exe相关情况

@@3:
        push cx
        mov  Version,ax
        mov  ax,5400h
        xor  bx,bx
        int  2Fh        ; power.exe install check?
        xor  ax,ax
        cmp  bx,504Dh
        jnz  @@4
        push ax         ; power.exe version
        mov  ax,5401h
        mov  bx,100h
        int  2Fh        ; set management enable
        pop  ax
        jb   @@4
        inc  ax
@@4:
        pop  cx
  • push cx:保存cx寄存器的值。
  • mov Version,ax:将ax中的版本信息保存到Version变量中。
  • mov ax,5400hint 2Fh:调用中断2Fh的5400h功能号,检查power.exe是否安装。
  • cmp bx,504Dhjnz @@4:如果bx的值不等于504Dh,则跳转到@@4
  • push axmov ax,5401hint 2Fh:如果power.exe安装了,设置管理使能相关操作。
  • pop axjb @@4inc ax:根据操作结果进行相应处理后,恢复cx寄存器的值并跳转到@@4

6. 调用APM相关电源管理功能

        push ax
        push bx
        push cx
        mov  ax,5301h
        xor  bx,bx
        int  15h        ; real-mode interface
        mov  ax,530Eh
        xor  bx,bx
        mov  cx,101h
        int  15h        ; driver version
        mov  ax,530Fh
        mov  bx,1
        mov  cx,bx
        int  15h        ; engage power management
        mov  ax,5308h
        mov  bx,1
        mov  cx,bx
        int  15h        ; enable power mamagement
        mov  ax,5307h
        mov  bx,1
        mov  cx,3
        int  15h        ; power off
        pop  cx         ; support device
  • push axpush bxpush cx:保存相关寄存器的值。
  • 一系列的movint 15hint 2Fh调用:分别执行与APM相关的初始化、获取驱动版本、启用电源管理、执行关机等操作。

7. 检查BIOS电源管理相关状态并处理

        test cl,8       ; BIOS power management disable?
        jz   @@5
        push cx
        mov  ax,5308h
        mov  bx,1
        xor  cx,cx
        int  15h        ; system stand-by
        pop  cx

@@5:
        test cl,10h     ; BIOS power disengaged
        jz   @@6
        mov  ax,530Fh
        mov  bx,1
        xor  cx,cx
        int  15h        ; disengage power management

@@6:
        mov  ax,5304h
        xor  bx,bx
        int  15h        ; disconnect interface
        pop  bx
        pop  ax
        test ax,ax
        jz   ExitSys
        mov  ax,5401h
        mov  bl,bh
        mov  bh,1
        int  2Fh        ; set APM firmware power manager enable
  • test cl,8jz @@5:检查cl寄存器的第3位(因为8是2的3次方),如果为0则跳转到@@5,否则执行系统待机操作。
  • test cl,10hjz @@6:检查cl寄存器的第4位(10h是2的4次方),如果为0则跳转到@@6,否则执行断开电源管理操作。
  • mov ax,5304hint 15h:断开APM接口。
  • 后续的pop操作恢复寄存器值,然后检查ax的值并进行相应的设置APM固件电源管理器使能的操作。

8. 程序退出

ExitSys:
        mov  ax,4c00h
        int  21h

Version DW ?

        End Start
  • mov ax,4c00hint 21h:使用DOS中断21h的4c00h功能号来终止程序运行。
  • Version DW ?:定义一个字类型的变量Version来存储版本信息。
  • End Start:标识程序结束,入口为Start标签。

多种实现关机的技术方案补充

方案一:直接调用DOS中断关机

.model tiny
.code
org 100h
start:
    mov ah,4Bh
    mov al,01h
    int 21h         ; 使用DOS中断4Bh的01h功能号来关机(相当于执行EXEC命令启动关机程序等)
    mov ah,4Ch
    int 21h
end start
  • mov ah,4Bhmov al,01hint 21h:通过调用DOS中断21h的4Bh功能号,配合al寄存器的值为01h来触发关机相关操作。这种方式是利用DOS提供的关机相关功能调用。

方案二:调用BIOS中断实现简单关机

.model tiny
.code
org 100h
start:
    mov ax,05307h   ; BIOS中断15h的5307h功能号用于关机
    xor bx,bx
    int 15h         ; 调用BIOS中断15h执行关机操作
    mov ah,4Ch
    int 21h
end start
  • mov ax,05307hint 15h:直接使用BIOS中断15h的5307h功能号来触发关机,这与上述代码中部分调用BIOS中断实现关机的思路类似,但相对更简洁地调用了特定的关机功能号。

总之,上述代码是通过对APM相关功能的检查和调用一系列中断来尝试实现关机,而另外两种方案则是利用DOS中断或特定的BIOS中断来实现关机操作,具体选择取决于系统环境和对不同中断机制的支持情况等因素。





ko20010214
=================================
大功告成,打个Kiss!
ko20010214@MSN.com
神州优雅Q300C
Intel CeleronM 370处理器 | 256MbDDR内存
40G硬盘 | USB2.0 | IEEE 1394
13.3 ' WXGA 宽屏(16:10) | COMBO光驱
10/100M网卡 | 四合一读卡器
2003-6-30 00:00
查看资料  发送邮件  发短消息  网志  OICQ (16959102)  编辑帖子  回复  引用回复
狐狸
初级用户




积分 118
发帖 6
注册 2003-6-4
状态 离线
『第 2 楼』:   使用 LLM 解释/回答一下

我试试看行不行。:)


2003-6-30 00:00
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
bgn
中级用户




积分 349
发帖 78
注册 2003-3-12
状态 离线
『第 3 楼』:   使用 LLM 解释/回答一下


谢谢你了,我会珍惜的。


2003-7-2 00:00
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
maple
中级用户




积分 417
发帖 137
注册 2003-5-30
状态 离线
『第 4 楼』:   使用 LLM 解释/回答一下

THANK YOU!


2003-7-24 00:00
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
qingwashaoye
中级用户




积分 271
发帖 74
注册 2004-11-17
状态 离线
『第 5 楼』:   使用 LLM 解释/回答一下

save,thank you


2017-2-2 21:47
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: