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

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
Google Online Security Blog
Google Online Security Blog
月光博客
月光博客
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
V
V2EX
腾讯CDC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
M
MIT News - Artificial intelligence
Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
Apple Machine Learning Research
Apple Machine Learning Research
aimingoo的专栏
aimingoo的专栏
博客园 - 三生石上(FineUI控件)
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MongoDB | Blog
MongoDB | Blog
H
Help Net Security
The Cloudflare Blog
Blog — PlanetScale
Blog — PlanetScale
F
Full Disclosure
G
Google Developers Blog
罗磊的独立博客
Jina AI
Jina AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
A
About on SuperTechFans
IT之家
IT之家
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
有赞技术团队
有赞技术团队
GbyAI
GbyAI
雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
The Register - Security
The Register - Security
U
Unit 42
D
Docker
Martin Fowler
Martin Fowler
L
LINUX DO - 热门话题
NISL@THU
NISL@THU
阮一峰的网络日志
阮一峰的网络日志
C
Cybersecurity and Infrastructure Security Agency CISA
博客园_首页
Google DeepMind News
Google DeepMind News

faryou的博客

5月月考 - faryou的博客 - 日记 faryou的博客-五一回老家 【汇编 - 功能】中断安装中断实现 【汇编&硬件】时钟中断的具体实现 faryou的博客-这些年,我不再看《熊出没》 【汇编&硬件】网络连接相关中断的具体实现 faryou的博客-年初小记 【汇编&硬件】鼠标控制中断的具体实现 【汇编&硬件】声音输出中断的具体实现 【汇编&硬件】屏幕输出中断的具体实现 【汇编&硬件】磁盘读取中断的具体实现 【汇编&硬件】键盘读取中断的具体实现 【汇编】汇编环境的搭建及Debug的使用教程 【汇编】漫谈:学习汇编后的一些思考 faryou的博客-关于本站即日起实行“一站三体”运营制度 【汇编基础教程】完结篇 写在最后:前言 【汇编基础教程】使用BIOS的中断实现键盘输入及磁盘I/O 【汇编基础教程】中断 【汇编基础教程】端口 【汇编基础教程】标志寄存器 【汇编基础教程】再谈栈 【汇编基础教程】段 【汇编基础教程】来存一些数据! 【汇编基础教程】寄存器和内存&一些基本命令的说明 【汇编基础教程】来写个“函数” 【汇编基础教程】更灵活的定位内存 【汇编基础教程】理解一下[bx]和loop指令 【汇编基础教程】跳一跳! faryou的博客-我的竞赛经历&对人生的一些思考 faryou的博客-关于现在中小学计算机课的一些想法及思考 faryou的博客-2025年度总结 faryou的博客-临平山下十五年 faryou的博客-Windows 10即将停止支持,谈谈自己从小到大用电脑的感受 faryou的博客-谈谈一名10后的怀旧情怀 【汇编基础教程】8086CPU工作原理 【C语言】指针的理解与应用 【算法教程】【C/C++】DP(动态规划):区间DP——程序设计思路与代码实现 【算法教程】【C/C++】BFS(广度优先搜索)——程序设计思路与代码实现 【算法教程】【C/C++】DFS(深度优先搜索)——程序设计思路与代码实现 【算法教程】【C/C++】单源最短路径——程序设计思路与代码实现 【算法教程】【C/C++】最小生成树——程序设计思路与代码实现 【算法教程】【C/C++】并查集——程序设计思路与代码实现 【算法教程】【C/C++】DP(动态规划):背包DP——程序设计思路与代码实现 【算法教程】【C/C++】DP(动态规划):简单动规问题——程序设计思路与代码实现 【算法教程】【C/C++】递推——程序设计思路与代码实现 【算法教程】【C/C++】三分算法——程序设计思路与代码实现 【算法教程】【C/C++】二分答案——程序设计思路与代码实现 【算法教程】【C/C++】二分查找——程序设计思路与代码实现 【算法教程】【C/C++】贪心算法——程序设计思路与代码实现 【算法教程】【C/C++】基础数学:快排——程序设计思路与代码实现 【算法教程】【C/C++】基础数学:快速幂——程序设计思路与代码实现 【算法教程】【C/C++】基础数学:进制转换——程序设计思路与代码实现 一文弄懂C++中的自定义函数 faryou的博客-2024年度总结
【汇编&硬件】关机中断的具体实现
作者: 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)。