news 2026/9/21 23:14:52

汇编:改写中断例程-以int9为例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
汇编:改写中断例程-以int9为例
assume cs:code stack segment db 128 dup(0) ; 定义栈段,大小128字节 stack ends code segment start: ;设置各段地址 mov ax,stack mov ss,ax mov sp,128 ; 栈顶指向栈段末尾(128字节栈,sp初始为128) push cs pop ds ; 让ds = cs(代码段和数据段同段,方便访问自定义中断例程 mov ax,0 mov es,ax ; es指向0段(中断向量表所在的段) ;安装新程序(自定义int9程序安装在0:204位置处) mov si,offset int9 ; si = 自定义int9例程的偏移地址 mov di,204h ; di = 0段204H(新例程的存放地址) mov cx,offset int9end - offset int9 ;cx = 新例程的字节长度 cld ; 方向标志DF=0(串操作时si/di递增) rep movsb ; 循环复制:将cs:[si]的内容复制到es:[di],共cx字节 ;将原中断地址保存在0:200单元处 push es:[9*4] pop es:[200H] push es:[9*4+2] pop es:[202H] ;将自定义的int9程序所在地址CS:IP写入---向量表中,向量表触发时就转到0:204处的自定义int9处 cli ; 关中断(禁止CPU响应外部中断,防止修改向量时被打断) mov word ptr es:[9*4],204H ; int9偏移地址 = 204H(新例程偏移) mov word ptr es:[9*4+2],0 ; int9段地址 = 0(新例程段地址) sti ; 开中断(恢复中断响应) mov ax,4c00h int 21h ;定义新中断例程 int9: push ax push bx push cx push es in al,60H pushf ;仅将标志位寄存器压入栈中 ;调用旧中断例程 call dword ptr cs:[200h] ;调用原系统向量表保存的CS:IP地址,并执行; ;处理F1键 cmp al,3BH jne int9ret mov ax,0B800H mov es,ax mov bx,1 mov cx,2000 s: inc byte ptr es:[bx] add bx,2 loop s int9ret: pop es pop cx pop bx pop ax iret int9end:nop code ends end start

关键知识点:

在 Intel 8086 CPU 中,IRET(Interrupt Return,中断返回)是一条用于从中断服务程序(ISR, Interrupt Service Routine)返回到被中断程序的指令。


一、功能说明

IRET指令的主要作用是恢复被中断时的程序执行上下文。它会从堆栈中弹出以下内容(按顺序):

  1. IP(Instruction Pointer)—— 返回地址的偏移部分
  2. CS(Code Segment)—— 返回地址的段部分
  3. FLAGS(标志寄存器)—— 恢复中断前的标志状态(包括 IF、TF 等)

注意:8086 是实模式处理器,不支持保护模式下的特权级切换,因此IRET在 8086 中只处理上述三个寄存器。


二、堆栈操作(执行 IRET 时)

假设堆栈指针为 SP,堆栈向下增长(向低地址方向),执行IRET相当于以下操作:

POP IP POP CS POP FLAGS

即:

  • 从 [SP] 弹出 IP(2 字节)
  • 从 [SP+2] 弹出 CS(2 字节)
  • 从 [SP+4] 弹出 FLAGS(2 字节)
  • 最终 SP 增加 6(因为弹出了 3 个字,每个 2 字节)

三、使用场景

IRET必须用在中断服务例程的末尾,用于:

  • 软件中断(如 INT 21h)
  • 硬件中断(如 IRQ0 对应的 INT 08h)
  • 异常处理(如除零异常 INT 0)

例如:

; 中断服务程序示例 my_isr: push ax push dx ; ... 中断处理代码 ... pop dx pop ax iret ; 返回到被中断的程序

注意:在进入 ISR 时,CPU 自动将 FLAGS、CS、IP 压入堆栈;因此必须用IRET返回,不能用RET,否则无法恢复 FLAGS,可能导致中断系统异常(如 IF 标志未恢复,导致后续中断被屏蔽)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/21 22:47:30

Chrony时间同步服务:从底层原理到技术演进的全景解析

一、底层原理:时钟驯服算法的革命性突破 Chrony的核心突破在于其时钟驯服算法(Clock Discipline Algorithm),该算法通过动态调整系统时钟频率实现亚秒级精度同步。其工作机制可分为三个关键层次: 1. 时钟偏差测量体系 …

作者头像 李华
网站建设 2026/9/21 23:39:17

线性回归与KNN算法的核心原理及实践应用

文章目录线性回归与KNN算法的核心原理及实践应用一、机器学习基础概念二、线性回归分析2.1 相关关系与回归分析2.2 一元线性回归模型2.3 误差项分析2.4 参数估计方法2.5 模型评价指标三、K-近邻算法(KNN)3.1 算法原理3.2 距离度量3.3 算法优缺点四、实践…

作者头像 李华
网站建设 2026/9/20 22:56:10

Windows右键菜单革命:从混乱到高效的终极解决方案

你是否曾在右键点击文件时,面对那长得需要滚动才能看完的菜单列表而感到无奈?或者因为某个已卸载软件的残留菜单项而心烦意乱?今天,让我们一同探索如何通过ContextMenuManager这款神器,彻底告别右键菜单的混乱时代。 【…

作者头像 李华
网站建设 2026/9/21 13:20:48

入门友好的低代码平台推荐,其中一款完全免费又能私有化部署

今天来跟大家分享5款我实际体验后觉得高效的国产低代码平台,个人或企业用起来都是很适合的。01|斑斑低代码 —— 完全免费 可私有化部署,团队自建系统的宝藏工具如果你希望零成本开始低代码开发,斑斑是真的会让人眼前一亮。平台全…

作者头像 李华
网站建设 2026/9/21 23:38:31

基于VUE的小剧场票务系统[VUE]-计算机毕业设计源码+LW文档

摘要:随着文化娱乐产业的蓬勃发展,小剧场演出作为一种独特的艺术形式受到越来越多人的喜爱。为了提高小剧场票务管理的效率和用户体验,本文设计并实现了基于VUE的小剧场票务系统。该系统利用VUE框架的前端优势,结合后端技术构建了…

作者头像 李华
网站建设 2026/9/21 23:38:19

AI不再“失忆“!揭秘让大模型记住一切的神奇技术,代码详解+实战教程,小白也能变大神!

一、引言 1.1 当今AI的记忆幻觉 像 ChatGPT 或编码助手这样的工具一开始会让人觉得很有用,但当你一遍又一遍地重复指令或偏好设置时,就会发现它们有很多使用不便的地方。此时,需要构建能够学习、进化和协作的智能体来扩展LLM能力,…

作者头像 李华