惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

云风的 BLOG
云风的 BLOG
The GitHub Blog
The GitHub Blog
A
About on SuperTechFans
P
Proofpoint News Feed
G
Google Developers Blog
Stack Overflow Blog
Stack Overflow Blog
IT之家
IT之家
Microsoft Security Blog
Microsoft Security Blog
F
Fortinet All Blogs
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
C
Check Point Blog
Microsoft Azure Blog
Microsoft Azure Blog
aimingoo的专栏
aimingoo的专栏
月光博客
月光博客
美团技术团队
D
Docker
博客园 - Franky
Y
Y Combinator Blog
大猫的无限游戏
大猫的无限游戏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 【当耐特】
罗磊的独立博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报

faryou的博客

faryou的博客 faryou的博客 faryou的博客 faryou的博客 faryou的博客 faryou的博客-福建行小记 faryou的博客 faryou的博客 faryou的博客 faryou的博客 faryou的博客-夏令营小记 faryou的博客 faryou的博客 faryou的博客 faryou的博客-暑假阶段总结与展望 faryou的博客 faryou的博客 faryou的博客 faryou的博客 台风进行时 faryou的博客 limbo虚拟机初体验&安装Windows NT 4.0 faryou的博客 台风将来时 faryou的博客 faryou的博客 faryou的博客 faryou的博客 出租车上的对话 faryou的博客
【汇编&硬件】关机中断的具体实现
作者: faryou · 2026-03-30 · via faryou的博客

前言

在8086汇编环境中,直接实现关机功能通常依赖硬件支持(如ATX电源的控制端口),且不同系统的实现方式存在差异。以下是一个基于ATX电源控制逻辑的关机中断模拟实现,通过操作特定端口发送关机命令,实际使用需结合硬件环境。

代码实现

; 常量定义(ATX电源相关端口和命令)
POWER_CTRL_PORT equ 0604h ; 假设的电源控制端口(不同硬件可能不同)
SHUTDOWN_CMD equ 0FEh ; 关机命令(ATX电源通常使用特定命令码)
WAIT_LOOP_COUNT equ 10000 ; 等待硬件响应的循环次数
 
code segment
    assume cs:code, ds:data
 
; 关机中断服务程序(入口:AH=00h表示执行关机)
; 功能:向电源控制端口发送关机命令,等待硬件响应
shutdown_int proc far
    push ax
    push bx
    push cx
    push dx
    push si
    push di
    push es
    push ds ; 保存所有寄存器
 
    ; 仅处理AH=00h的关机命令
    cmp ah, 00h
    jne int_end
 
    ; 步骤1:发送关机命令到电源控制端口
    mov dx, POWER_CTRL_PORT
    mov al, SHUTDOWN_CMD
    out dx, al ; 向硬件发送关机指令
 
    ; 步骤2:等待硬件响应(循环延迟,确保命令被接收)
    mov cx, WAIT_LOOP_COUNT
wait_shutdown:
    loop wait_shutdown ; 空循环等待
 
    ; 步骤3:若支持,可检测电源状态(此处简化,不处理反馈)
 
int_end:
    pop ds
    pop es
    pop di
    pop si
    pop dx
    pop cx
    pop bx
    pop ax
    iret ; 中断返回
shutdown_int endp
 
; 安装关机中断到int 63h(用户自定义中断号)
install proc
    cli ; 关中断,防止安装过程被打断
    mov ax, 0
    mov es, ax ; ES指向中断向量表(0段)
    mov di, 63h * 4 ; int 63h的向量地址:63h×4=0000:018C
    ; 保存原中断向量(用于恢复)
    mov ax, es:[di]
    mov [orig_63h_off], ax
    mov ax, es:[di + 2]
    mov [orig_63h_seg], ax
    ; 写入自定义关机中断的地址
    mov ax, offset shutdown_int
    stosw ; 写入偏移量
    mov ax, cs
    stosw ; 写入段地址
    sti ; 开中断
    ret
install endp
 
; 恢复原始中断向量(程序退出时调用)
restore proc
    cli
    mov ax, 0
    mov es, ax
    mov di, 63h * 4
    ; 恢复原中断向量
    mov ax, [orig_63h_off]
    stosw
    mov ax, [orig_63h_seg]
    stosw
    sti
    ret
restore proc
 
; 主程序:测试关机中断
main:
    mov ax, data
    mov ds, ax ; 初始化数据段
 
    call install ; 安装关机中断
 
    ; 测试:调用关机中断(实际使用时需谨慎!)
    mov ah, 00h ; 功能:执行关机
    int 63h ; 触发关机中断
 
    ; 若关机失败,恢复中断并退出(仅作演示)
    call restore
    mov ah, 4Ch
    int 21h
 
code ends
 
; 数据段:保存原始中断向量
data segment
    orig_63h_off dw 0 ; int 63h原始偏移量
    orig_63h_seg dw 0 ; int 63h原始段地址
data ends
 
    end main

代码说明

  1. 硬件交互逻辑:代码假设系统使用ATX电源,通过特定控制端口(0604h,实际需根据硬件手册修改)发送关机命令(0FEh)。ATX电源通常支持通过端口命令触发关机,具体端口和命令码需参考硬件文档。
  2. 中断功能设计:a.自定义int 63h作为关机中断,仅响应AH=00h的功能调用,执行以下操作:- 向电源控制端口发送关机命令;b.循环延迟等待硬件处理命令(避免命令未被接收)。
  3. 中断安装与恢复:b.安装时将自定义中断服务程序地址写入int 63h的向量表,并保存原始向量;b.程序退出前恢复原始向量,避免影响系统默认中断处理。
  4. 注意事项:a.实际关机端口和命令因硬件而异(如某些系统使用0x60/0x64端口或ACPI协议),需根据具体环境调整;b.现代操作系统(如Windows/Linux)在保护模式下禁止直接端口操作,此代码仅适用于实模式环境(如DOS)。