【汇编语言】内中断(三) —— 中断探险:从do0到特殊响应的奇妙旅程

文章目录
- 前言
- 1. do0
- 1.1 do0程序
- 1.2 存放字符串,得到完整的程序
- 1.3 分析初步完成的程序
- 1.4 正确的完整程序
- 1.5 分析正确的完整程序
- 2. 设置中断向量
- 3. 单步中断
- 3.1 什么是单步中断?
- 3.2 CPU为什么要提供单步中断
- 3.2.1 思考一下Debug功能
- 3.2.2 Debug是如何利用单步中断的
- 3.2.3 可能的问题以及如何解决的
- 4. 响应中断的特殊情况
- 4.1 说明情况
- 4.2 举例说明 —— 栈相关寄存器的设置
- 4.2.1 产生的原因
- 4.2.2 反映在Debug中的情况
- 结语
前言
📌
汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深入理解计算机底层工作原理,提升代码效率,尤其在嵌入式系统和性能优化方面有重要作用。此外,它在逆向工程和安全领域不可或缺,帮助分析软件运行机制并增强漏洞修复能力。
本专栏的汇编语言学习章节主要是依据王爽老师的《汇编语言》来写的,和书中一样为了使学习的过程容易展开,我们采用以8086CPU为中央处理器的PC机来进行学习。
1. do0
1.1 do0程序
do0程序的主要任务是显示字符串,程序如下:
do0:;设置ds:si指向字符串 mov ax, 0b800hmov es, axmov di, 12*160+36*2 ;设置es:di指向显存空间的中间位置mov cx, 21 ;设置cx为字符串长度s: mov al, [si]mov es:[di], alinc siadd di, 2loop smov ax, 4c00hint 21hdo0end: nop
1.2 存放字符串,得到完整的程序
程序写好了,可要显示的字符串放在那里呢?
我们看下面完整的程序。
assume cs:code data segmentdb "overflow!"
data endscode segment
start: mov ax, csmov ds, axmov si, offset do0 ;设置ds:si指向源地址mov ax, 0mov es, axmov di, 200h ;设置es:di指向目的地址mov cx, offset do0end - offset do0 ;设置cx为传输长度cld ;设置传输方向为正rep movsb;设置中断向量表mov ax, 4c00hint 21hdo0: mov ax, datamov ds, axmov si, 0 ;设置ds:si指向字符串mov ax, 0b800hmov es, axmov di, 12*160+36*2 ;设置es:di指向显存空间的中间位置mov cx, 21 ;设置cx为字符串长度s: mov al, [si]mov es:[di], al inc siadd di, 2loop smov ax, 4c00hint 21h
do0end: nopcode ends
end start
1.3 分析初步完成的程序
上面的程序,看似合理,可实际上却大错特错。
注意,“overflow !“在上面程序的data段中。程序执行完成后返回,它所占用的内存空间被系统释放,而在其中存放的“overfow!”也将很可能被别的信息覆盖。
而do0程序被放到了0:200处,随时都会因发生了除法溢出而被 CPU 执行0号中断程序,很难保证 do0程序从原来程序所处的空间中取得的是要显示的字符串“overflow!”。
因为 do0 程序随时可能被执行,而它要用到字符串“overflow!”,所以该字符串也应该存放在一段不会被覆盖的空间中。
1.4 正确的完整程序
正确的程序如下。
assume cs:codecode segment
start: mov ax, csmov ds, axmov si, offset do0 ;设置ds:si指向源地址mov ax, 0mov es, axmov di, 200h ;设置es:di指向目的地址mov cx, offset do0end - offset do0 ;设置cx为传输长度cld ;设置传输方向为正rep movsb;设置中断向量表mov ax,4c00hint 21hdo0: jmp short do0startdb "overflow!"do0start:mov ax, csmov ds, axmov si, 202h ;设置ds:si指向字符串mov ax, 0b800hmov es, axmov di, 12*160+36*2 ;设置es:di指向显存空间的中间位置mov cx, 21 ;设置cx为字符串长度s: mov al, [si]mov es:[di], alinc siadd di, 1mov al, 02h ;设置颜色mov es:[di], al add di, 1loop smov ax, 4c00hint 21h
do0end: nopcode ends
end start
1.5 分析正确的完整程序
在最新的程序中,将“overflow!”放到do0程序中,程序执行时,将标号 do0到标号 do0end 之间的内容送到 0000:0200处。
❗注意,因为在do0程序开始处的“overflow!”不是可以执行的代码,所以在“overflow!”之前加上一条 jmp 指令,转移到正式的 do0 程序。
当除法溢出发生时,CPU 执行 0:200处的jmp指令,跳过后面的字符串,转到正式的do0程序执行。
do0程序执行过程中必须要找到“overfow!”,那么它在哪里呢?
-
首先来看段地址,“overflow!”和 do0的代码处于同一个段中,而除法溢出发生时,CS中必然存放do0的段地址,也就是“overflow!”的段地址;
-
再来看偏移地址,0:200处的指令为
jmp short do0start,这条指令占两个字节,所以“overfow!”的偏移地址为202h。
2. 设置中断向量
下面,将do0的入口地址0:200,写入中断向量表的0号表项中,使do0成为0号中断的中断处理程序。
0号表项的地址为0:0,其中0:0字单元存放偏移地址,0:2字单元存放段地址。
程序如下。
mov ax, 0
mov es, ax
mov word ptr es:[0*4], 200h
mov word ptr es:[0*4+2], 0
3. 单步中断
3.1 什么是单步中断?
基本上,CPU在执行完一条指令之后,如果检测到标志寄存器的TF位为1,则产生单步中断,引发中断过程。
单步中断的中断类型码为1,则它所引发的中断过程如下。
- (1)取得中断类型码1;
- (2)标志寄存器入栈,TF、IF设置为0;
- (3)CS、IP 入栈;
- (4)(CS)=(1*4+2)。(IP)=(1*4)。
如上所述,如果 TF=1,则执行一条指令后,CPU 就要转去执行1号中断处理程序。
3.2 CPU为什么要提供单步中断
3.2.1 思考一下Debug功能
我们在使用 Debug的 t 命令的时候,有没有想过这样的问题,Debug如何能让CPU在执行一条指令后,就显示各个寄存器的状态?
我们知道,CPU在执行程序的时候是从CS:IP指向的某个地址开始,自动向下读取指令执行。也就是说,如果CPU不提供其他功能的话,就按这种方式工作,只要CPU一加电,它就从预设的地址开始一直执行下去,不可能有任何程序能控制它在执行完一条指令后停止,去做别的事情。
可是,我们在Debug中看到的情况却是,Debug可以控制CPU执行被加载程序中的一条指令,然后让它停下来,显示寄存器的状态。
Debug 有特殊的能力吗?
显然没有😅😅😅
我们只能说Debug利用了CPU提供的一种功能。只有CPU提供了在执行一条指令后就转去做其他事情的功能,Debug或是其他的程序才能利用CPU提供的这种功能做出我们使用T命令时的效果。
3.2.2 Debug是如何利用单步中断的
好了,我们来简要地考虑一下Debug是如何利用CPU所提供的单步中断的功能的。
首先,Debug 提供了单步中断的中断处理程序,功能为显示所有寄存器中的内容后等待输入命令。
然后,在使用t命令执行指令时,Debug将TF设置为1,使得CPU工作于单步中断方式下,则在CPU执行完这条指令后就引发单步中断,执行单步中断的中断处理程序,所有寄存器中的内容被显示在屏幕上,并且等待输入命令。
3.2.3 可能的问题以及如何解决的
那么,接下来的问题是,当TF=1时,CPU在执行完一条指令后将引发单步中断,转去执行中断处理程序。注意,中断处理程序也是由一条条指令组成的,如果在执行中断处理程序之前,TF=1,则CPU在执行完中断处理程序的第一条指令后,又要产生单步中断,则又要转去执行单步中断的中断处理程序,在执行完中断处理程序的第一条指令后,又要产生单步中断,则又要转去执行单步中断的中断处理程序……
看来,上面的过程将陷入一个永远不能结束的循环,CPU永远执行单步中断处理程序的第一条指令。
CPU 当然不能让这种情况发生,解决的办法就是,在进入中断处理程序之前,设置TF=0。从而避免CPU在执行中断处理程序的时候发生单步中断。
这就是为什么在中断过程中有 TF=0这个步骤,我们再来看一下中断过程。
- (1)取得中断类型码1;
- (2)标志寄存器入栈,TF、IF设置为0;
- (3)CS、IP 入栈;
- (4)(CS)=(1*4+2)。(IP)=(1*4)。
✍最后,CPU提供单步中断功能的原因就是,为单步跟踪程序的执行过程,提供了实现机制。
4. 响应中断的特殊情况
4.1 说明情况
一般情况下,CPU 在执行完当前指令后,如果检测到中断信息,就响应中断,引发中断过程。可是,在有些情况下,CPU在执行完当前指令后,即便是发生中断,也不会响应。
4.2 举例说明 —— 栈相关寄存器的设置
4.2.1 产生的原因
对于这些情况,我们不一一列举,只是用一种情况来进行说明。
在执行完向ss寄存器传送数据的指令后,即便是发生中断,CPU也不会响应。这样做的主要原因是,ss:sp联合指向栈顶,而对它们的设置应该连续完成。
如果在执行完设置ss的指令后,CPU 响应中断,引发中断过程,要在栈中压入标志寄存器、CS和IP的值。而ss改变,sp并未改变,ss:sp指向的不是正确的栈顶,将引起错误。
所以CPU在执行完设置ss的指令后,不响应中断。这给连续设置ss和sp指向正确的栈顶提供了一个时机。
即,我们应该利用这个特性,将设置ss和sp的指令连续存放,使得设置sp的指令紧接着设置ss的指令执行,而在此之间,CPU不会引发中断过程。
比如,我们要将栈顶设为 1000:0,应该:
mov ax,1000h
mov ss,ax
mov sp,0
mov ax,0
而不应该:
mov ax,1000h
mov ss,ax
mov ax,0
mov sp,0
4.2.2 反映在Debug中的情况
Debug 利用单步中断来实现T命令的功能,也就是说,用T命令执行一条指令后,CPU响应单步中断,执行Debug设置好的处理程序,才能在屏幕上显示寄存器的状态,并等待命令的输入。
而在mov ss,ax指令执行后,CPU 根本就不响应任何中断,其中也包括单步中断,所以Debug设置好的用来显示寄存器状态和等待输入命令的中断处理程序根本没有得到执行,所以我们看不到预期的结果。
CPU接着向下执行后面的指令mov sp,10h,然后响应单步中断,我们才看到正常的结果。
结语
今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下。
也可以点点关注,避免以后找不到我哦!
Crossoads主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!

相关文章:
【汇编语言】内中断(三) —— 中断探险:从do0到特殊响应的奇妙旅程
文章目录 前言1. do01.1 do0程序1.2 存放字符串,得到完整的程序1.3 分析初步完成的程序1.4 正确的完整程序1.5 分析正确的完整程序 2. 设置中断向量3. 单步中断3.1 什么是单步中断?3.2 CPU为什么要提供单步中断3.2.1 思考一下Debug功能3.2.2 Debug是如何…...
0006.基于SpringBoot+element付费问答系统
适合初学同学练手项目,部署简单,代码简洁清晰; 愿世界和平再无bug 一、系统架构 前端:vue| elementui 后端:springboot | mybatis-plus 环境:jdk1.8 | mysql | maven 二、登录角色 1.管理员 2.用户 …...
SpringBoot feign基于HttpStatus重试
场景 基于springboot开发的项目,对接第三方,第三方的接口有限流策略,某个时间段内有调用频率限制,返回的状态码HttpStatus不是200,而HttpStatus是429。现基于HttpStatus我们发起的重试。 技术点 springbootfeign fe…...
【记录49】vue2 vue-office在线预览 docx、pdf、excel文档
vue2 在线预览 docx、pdf、excel文档 docx npm install vue-office/docx vue-demi0.14.6 指定版本 npm install vue-office/docx vue-demi <template><VueOfficeDocx :src"pdf" style"height: 100vh;" rendere"rendereHandler" error&…...
正则表达式中^的用法
正则表达式中^的用法 1.用法一: 限定开头 文档上给出了解释是匹配输入的开始,如果多行标示被设置成了true,同时会匹配后面紧跟的字符 比如 /^A/会匹配"An e"中的A,但是不会匹配"ab A"中的A 比如(\s|^)表示空字符串或字…...
WPF 关于界面UI菜单权限(或者任意控件的显示权限)的简单管理--只是简单简单简单简单
1.定义你的User类 public class User{public User(){ID ObjectId.NewObjectId().ToString();}public string? ID { get; set; }public string? Account { get; set; }public string? Password { get; set; }public string? PasswordMD5 { get; set; }public AccountType?…...
Https身份鉴权(小迪网络安全笔记~
附:完整笔记目录~ ps:本人小白,笔记均在个人理解基础上整理,若有错误欢迎指正! 5.2 Https&身份鉴权 引子:上一篇主要对Http数据包结构、内容做了介绍,本篇则聊聊Https、身份鉴权等技术。 …...
AngularJS 输入验证
AngularJS 输入验证 AngularJS 是一个强大的 JavaScript 框架,它允许开发者构建动态的、高性能的 Web 应用程序。在处理用户输入时,确保数据的准确性和完整性至关重要。AngularJS 提供了一套内置的输入验证机制,可以帮助开发者轻松地实现这一目标。 为什么需要输入验证? …...
【网络安全】WIFI WPA/WPA2协议:深入解析与实践
WIFI WPA/WPA2协议:深入解析与实践 1. WPA/WPA2 协议 1.1 监听 Wi-Fi 流量 解析 WPA/WPA2 的第一步是监听 Wi-Fi 流量,捕获设备与接入点之间的 4 次握手数据。然而,设备通常不会频繁连接或重新连接,为了加速过程,攻…...
前端使用xlsx-js-style导出Excel,带样式,并处理合并单元格边框显示不全和动态插入表头解决
一、在学习之前,先给出一些学习/下载地址: xlsx-js-style下载地址 https://github.com/gitbrent/xlsx-js-style 或者 https://www.npmjs.com/package/xlsx-js-style SheetJS中文教程: https://xlsx.nodejs.cn/docs/csf/cell 二、先看样…...
自动化工具ansible部署和实践
1 介绍和部署 1.1 介绍 ansible的功能 我爱你在当今的IT自动化领域,Ansible无疑是一个无法被忽视的重要角色。其便利性和高效性受到了广大开发者和系统管理员的一致好评,成为了配置管理和应用部署的首选工具。然而,对于一些初学者来说&#…...
无人机推流直播平台EasyDSS视频技术如何助力冬季森林防火
冬季天干物燥,大风天气频繁,是森林火灾的高发期。相比传统的人力巡查,无人机具有更高的灵敏度和准确性,尤其在夜间或浓雾天气中,依然能有效地监测潜在火源。 无人机可以提供高空视角和实时图像传输,帮助巡…...
React Fiber
React Fiber 是 React 16 引入的全新重写的协调(Reconciliation)算法的实现,旨在改善 React 的更新机制和性能,尤其是在复杂应用和大量更新的场景下。它使得 React 更加灵活、可调度,能够实现优先级控制和中断更新等特…...
【前端】JavaScript 中的 map() 方法:高级解析与应用
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 💯前言💯map() 方法的定义与核心特性1.1 方法定义1.2 主要特性 💯map() 方法的语法与高级用法2.1 基本语法2.2 简化写法与箭头函数2.3 结合链式操作 💯ma…...
《智能体开发实战(高阶)》四、系统化的日志周报智能体开发计划
智能体扩展与完善规划 为了将前几个章节的智能体逐步扩展为支持整个公司团队使用的高效工具,以下是分阶段的完善与扩写规划。每个阶段旨在提升功能覆盖范围、处理能力和用户体验,并为企业提供实际价值。 阶段一:基础功能完善 目标:巩固现有功能,提升健壮性和适用性。 支…...
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球最受欢迎的Web服务器软件,支持约30.2%的所有活跃网站。凭借其可靠性、灵活性和强大的功能,Apache数十年来一直是互联网的中坚力量。 一、Apache Web服务器的工作原理 Apache Web服务器的工作原理如下: 接收HTTP请求࿱…...
Mybatis——(2)
2.2 Mybatis 工具类(了解) 为了简化MyBatis的开发,可将MyBatis进一步封装。 import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apa…...
景联文科技入选中国信通院发布的“人工智能数据标注产业图谱”
近日,由中国信息通信研究院、中国人工智能产业发展联盟牵头,联合中国电信集团、沈阳市数据局、保定高新区等70多家单位编制完成并发布《人工智能数据标注产业图谱》。景联文科技作为人工智能产业关键环节的代表企业,入选图谱中技术服务板块。…...
修改浏览器地址栏参数
Vue 修改当前页面地址栏参数 function updateUrlParameter(param: string, value: string) {const url new URL(window.location.href); // 获取当前页面的 URL// 解析哈希部分const hash url.hash ? url.hash.slice(1) : "";const [path, queryString] hash.sp…...
Spring Boot教程之二十五: 使用 Tomcat 部署项目
Spring Boot – 使用 Tomcat 部署项目 Spring Boot 是一个基于微服务的框架,在其中创建可用于生产的应用程序只需很少的时间。Spring Boot 建立在 Spring 之上,包含 Spring 的所有功能。如今,它正成为开发人员的最爱,因为它是一个…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
