+ -
当前位置:首页 → 问答吧 → 如何用汇编语言实现关机,是通过向某个寄存器中赋特定的值来实现关机吗?

如何用汇编语言实现关机,是通过向某个寄存器中赋特定的值来实现关机吗?

时间:2008-06-04

来源:互联网

如何用汇编语言实现关机,是通过向某个寄存器中赋特定的值来实现关机吗?
请高手指点,谢谢!!

作者: z341223318   发布时间: 2008-06-04

DOS下关机?int15中提供了关机功能。
Assembly code
    mov    ax,5301H
    xor    bx,bx
    xor    cx,cx
    int    15H
    mov    ax,530EH
    xor    bx,bx
    mov    cx,102H
    int    15H
    mov    ax,5307H
    mov    bx,1
    mov    cx,3
    int    15H

作者: cnzdgs   发布时间: 2008-06-04

我用的ARM处理器,不同的处理器的关机指令应该不一样,
但是大致的思想和流程应该是一样,请高手描述一下.

作者: z341223318   发布时间: 2008-06-04

对ARM不了解。
这里如果不特别说明平台,大家都会按照x86来理解。

作者: cnzdgs   发布时间: 2008-06-04

最简单的关机就是切断电源,这是一种硬关机,软件没法预测和控制的。
软件能控制的关机在PC上通常就有两种方式:APM和ACPI,这都是BIOS和操作系统提供的功能,严格意义上来说与处理器没有多少关系。
在DOS中,关机是通过BIOS提供的APM接口来做的,不过这INT 15h中的APM不是所有系统中都有的,还是要先做一下安装检测。
Windows中,关机用API ExitWindowsEx就可以了,非常简单。
Linux中可以用sys_reboot或者machine_power_off,和Windows差不多。
你用ARM处理器,也不太可能是在裸机上开发吧,用操作系统的话估计也就是Linux、Nuclears这些东西,都有APM、ACPI支持。

作者: DelphiGuy   发布时间: 2008-06-04

俺用51片子做过自关机,那需要硬件支持。

作者: jennyvenus   发布时间: 2008-06-04

用一个端口输出的0/1信号控制继电器来开关电源就可以,但是这种方法只适合简单的系统。

作者: DelphiGuy   发布时间: 2008-06-05

sdfasd

作者: szwsnraa   发布时间: 2008-06-05


Assembly code

.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



作者: homesos   发布时间: 2008-06-05

学习,收藏

作者: dongyi940333   发布时间: 2008-06-06

不懂,学习了

作者: wxyztuv   发布时间: 2010-11-29