汇编--学习笔记(十三)-中断及中断处理程序

 中断时计算机科学中最基本、也是十分重要的一个概念,可以说没有中断概念的引入和应用就不会有今天的计算机,至少不会有搞效率的计算机。

  • 一、基本概念
  • 二、BIOS中断服务
  • 三、DOS中断服务
  • 四、中断处理技术
  • 五、中断处理程序实例

一、中断:
定义:中断就是使CPU暂时挂起当前正在进行的工作并转向某紧急事件的服务与处理程序(该服务与处理程序称为中断服务程序),在执行完中断服务程序后再返回到被中止的原有工作处的过程。
中断分类:中断按其产生的方式可分为硬件中断和软件中断。硬件中断又分为内部和外部两种。


二、内部硬件中断

一个字节即一共256个中断,00H~FFH。
定义:内部硬件中断是由某些特殊的指令触发的,例如单步中断、除法出错中断。通常我们所说的硬件中断即指内部硬件中断。
硬件中断举例:在使用DEBUG调试程序时我们经常使用T命令和P命令,而T命令和P命令的执行恰好正是利用了内部硬件中断。

  • (1)INT 00H:除法错误中断。
  • (2)INT 01H:单步中断,由T命令产生。
    • 它的特征是将陷阱标志位TF置位,这样当程序运行时,会在每一条指令的后面产生一个单步中断,从而中止指令的继续执行。
  • (3)INT 03H:断点中断,由P命令产生。
    • 与INT 01H类似,但不会跟踪进子程序、中断调用等。
  • (4)INT 04H:溢出中断。
    • 在指令序列中,若上一个指令由于某些特殊原因使溢出标志OF置1,那么当执行溢出中断指令INTO是立即产生中断04H;若OF为0,则INTO不起作用。

三、外部硬件中断

定义:外部硬件中断是指从处理器外部的硬件设备中产生并发向处理器的中断。
分类:分为可屏蔽中断不可屏蔽中断两种。分别由INTR引脚NMI引脚的信号来触发。即有2条外部中断请求线。

1、可屏蔽中断–INTR
 可以通过设置中断控制器的屏蔽参数来禁止某些指定的中断。
 可屏蔽中断还可以通过指令CLI(关中断)来禁止CPU响应所有的外部中断。
2、不可屏蔽中断–NMI
 是用来处理一些紧急情况的,如机器掉电等。它不能由用户通过编制软件来屏蔽,一旦CPU接收到NMI引脚上的信号时就必须立即响应,转向NMI的服务程序,硬件将自动完成断点保护及现场保护,且在中断返回时执行一条RETN指令。


四、软中断

定义:严格说来,软件中断是内部中断的一种,是由软件引起的非屏蔽型中断。

1、INT n 指令
 CPU执行INT n指令时,立即产生一个软件中断,中断的类型由指令中的n指明。
应用:因为指令中可以指定任何的类型号,故此指令可以方便地用来调试为外设编好的中断服务程序。
2、中断向量表
 中断过程中很关键的一步是要由中断处理程序对因各种原因触发的相应中断进行处理。因此每一个中断都要对应的有一个中断处理程序。对这些中断进行管理的就是中断向量表了。
(1)中断向量表结构
中断向量表的长度为1K字节(1024字节),共有256项,每一项4个字节,对应一个中断。也就是说一张表中断最多可对应256个中断(当然,实际上并没有这么多中断,这就为用户自己编制并扩充中断服务程序提供了便利的条件)
 中断向量表在内存中靠前的部分并固定在这个段地址为00H,偏移量为00H~3FFH,即00000H—003FFH的位置。
中断向量表每项的四个字节存放着该项对应中断的中断处理程序的入口地址。四个字节也就是两个字,高字存放中断处理程序入口地址的段CS,低字存放偏移IP。
(2)中断服务程序的调用
 中断指令INT n 发出以后,就要到向量表中去找其对应的服务程序的地址。
n* 4所得到的就是中断INT n 所对应的n号中断的四个字节地址在向量表中的首地址。
 由首地址开始的四个连续字节即两个字中顺序存放着其对应中断服务程序的入口地址的偏移和段地址,然后程序跳到此入口地址,并将控制交给中断服务程序。
(3)中断向量表的优点

  • 1)便于管理和扩充,就像通过仓库存货单可以找到任何一件存储的物品那样,我们可以通过向量表来找到每一个中断对应的中断服务程序。
  • 2)当用户想要编制和使用自己的中断服务程序时,可以先设置中断向量,以确定该中断在中断向量表中的位置,然后将自己编制的中断服务程序(可以是驻留内存的,也可以是非驻留内存的)的地址返回给它在中断向量表中对应位置的两个字中,至此,用户就可以十分方便地为自己建立一个软中断了。

例一:保存5号中断入口,然后重置5号中断的入口

PUSH ES
MOV AX,3505H  ;取中断向量
INT 21H
MOV [OLD_IP],BX ;保存旧的偏移地址
MOV [OLD_ES],ES ;保存旧的段地址
POP ES 
MOV AX,2505H ;重置中断向量
MOV DX,OFFSET INT05H
INT 21H

3、中断类型号的提供
(1)INT 00H ~ 05H自动提供

  • INT 00H — 除法错误
  • INT 01H — 单步错误
  • INT 02H — 非屏蔽中断NMI
  • INT 03H — 断点中断
  • INT 04H — 溢出中断
  • INT 05H — 屏幕打印(拷屏)中断

4、软中断的处理过程
 软中断被响应后,CPU进入中断响应周期。CPU将中断类型号乘以4,得到中断向量表的入口地址,并执行一下动作:

  • (1)将标志寄存器压入堆栈。
  • (2)用清中断标志(IF)和单步标志(TF)禁止硬件中断,即关中断。
    • 所以当我们自己编制中断服务程序时,在程序内必要时可以开中断,即打开由硬件自动关闭的中断允许触发器,使之能够响应更高级的中断。
  • (3)将当前代码段寄存器的内容(CS)压栈。
  • (4)将当前指令指针(IP)压栈。
    • 步骤(3)、(4)的目的是要确保中断处理完毕之后能够正确地返回中断调用者。
  • (5)转向中断服务程序入口并将控制交给中断服务程序。

 在中断服务程序执行完后,即CPU接收到IRET指令时,它又将产生以下步骤:

  • (1)弹出IP:从堆栈中将保存的指令指针IP由堆栈弹出到IP中。
  • (2)弹出CS:将保存的段寄存器内容由堆栈弹出到代码段寄存器中。
  • (3)恢复标志寄存器

5、中断服务程序的编写
 中断服务程序可以按各个设备的要求来加以编制,但一般有:

  • (1)保护现场(入栈)
  • (2)恢复现场(出栈)
  • (3)中断返回(IRET)
    说明:软中断指令非常类似子程序调用的CALL指令(即中断的INT 21H指令),但两者之间还是有明显区别的:
  • (1)软中断全部都是段间的调用,所以在结束时用IRET返回;
  • (2)软中断的IRET指令具有自动恢复断点和标志的功能。

6、软中断的分类
 一般情况下,目前使用的软中断可分为三大类:

  • (1)BIOS中断 — 10H ~ 1FH(16个)
    • 它主要是提供I/O驱动程序使用,提供了应用程序、DOS与设备的接口功能。用户可以忽略对具体设备硬件上的了解,直接应用这些功能调用完成对具体设备的控制。
  • (2)DOS中断 — 20H ~ 3FH(32个)
    • 目前使用了其中的20H ~ 27H和2FH,其余的为保留中断。
  • (3)自由中断 — 40H ~ FFH(192个)
    • 这类中断是由系统或应用程序设置开发的。可以理解为这类中断是系统或应用程序为了完成特定的功能而扩展出来的中断。可以看得出来,系统给自身和应用程序留下了相当大的余地。这类中断是不定。

7、软中断的访问
 软中断的访问在不同的环境中有不同的形式,在这里我们仅仅就汇编语言对软中断的访问讨论一下。用汇编语言申请一个标准DOS或BIOS中断是非常简单的,用户程序通过规定的寄存器与中断服务程序之间进行内定的规范的信息交换。大部分的中断处理程序都有一个入口和一个出口,在入口处用寄存器传入规定的数据,在中断请求完毕之后再通过特定的寄存器传递出返回值。

MOV DL,'A'
MOV AH,02H
INT 21H  ;显示一个字符
  • 9
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
随着国家十四五新战略规划的推出,众多国内企业都参与到国产芯片替代浪潮中来,可以预测未来越多的国产芯片会被设计、生产和使用在我们日常所使用的电子产品中,国产芯片拥有巨大的市场前景。 目前国产芯片采用的体系架构主要有X86、ARM、MIPS、RISC V、PowerPC、Alpha等。我们知道电子产品正常工作必须要有操作系统和各种应用软件,没有操作系统和应用软件的芯片就是一堆废铁,而大多数人并不知道的是没有系统固件来加载操作系统的电脑亦是一堆废铁, UEFI就是由UEFI行业协会提出和维护一种行业标准的系统固件,它支持目前市面上的大多数芯片体系结构和操作系统,随着标准的不断演进相信越来越多的体系结构的芯片和操作系统会被支持。 笔者从事BIOS开发已有十余年的时间,见证了Legacy BIOS辉煌与隐退,也有幸了参与了新世纪初系统固件从Legacy BIOS往UEFI BIOS的迁移的全过程。科技行业风起云涌新技术新架构日新月异,每每回望不禁感慨我辈可谓是“眼见着他起高楼,眼见着他宴宾客”的那一波BIOS人。曾经系统固件江湖还是Legacy BIOS的天下,BIOS人使用汇编语言编码、通过中断来与操作系统沟通。自UEFI框架被广泛使以来开我们的发环境从纯汇编变成了99%的C语言加1%的汇编语言的模式,开发效率大大的加强了。 虽然UEFI框架大大加快了开发效率,但是由于系统固件开发属于比较偏门和专业的领域,学习和入门门槛比较高,现有的BIOS工程师又分布在大大小小的各个公司内部缺乏有效沟通和交流,同时BIOS源码又属于敏感和机密数据受到各种NDA限制,市面上对UEFI框架介绍的资料少之又少,因此笔者从2000左右开始就陆续以Cstyle_0x007为ID在https://blog.csdn.net/CStyle_0x007发布一系列博文,现已有数十篇原创文章。刚开始的想法是把博文当作工作笔记方便自己随时查阅,后来慢慢发展成了与业内外感兴趣的朋友的沟通交流的平台。 随手写的博文难免有错误与纰漏为了避免误导大众,准备把博文重新整理在纠正谬误同时也会补充一些新的内容,尽量做到所写的每句话都是无误的,也欢迎有兴趣的朋友踊跃提出意见和建议。组建了微信公众号,目的在于方便有兴趣的朋友一起交流,名字初步定为“固件C字营”,其中“固件”泛指一切固化的软件,这里主要指UEFI BIOS系统固件,“C”泛指“China“,我们可以把这里当作大家沟通交流的营地,我们会不定时发布一些行业资讯、工作、学习心得,感兴趣扫描下面二维码就可以加入,也可以发邮件到[email protected]投稿分享你的想法。 本文取名《UEFI内核的导读》这里的UEFI专指“UEFI BIOS”,全文专注于对UEFI内核的梳理与分享,同时兼顾对X86系统固件生态中常用的工程技术的介绍,主要包含以下内容:UEFI启动流程以及各个阶段主要完成的任务及参考的实现方式导读UEFI及PI规范中的常见Protocol的实现与使用技巧UEFI固件生态中常见外设、总线、行业标准的协议内容及使用方法 雄关漫道真如铁,而今迈步从头越,系统固件雄起之路道阻且长,相信我们的BIOS人一定可以为国产芯片的起飞助力、为系统固件团队的壮大贡献自己的一份微薄之力,为每一个不畏艰难、不惧寂寞坚守在工作岗位的BIOS人加油,好样的。
汇编语言是一种低级编程语言,它直接对应于计算机的机器语言,但使用了人类可读的助记符和符号来替代机器语言中的二进制指令和地址。以下是关于汇编语言的详细说明: ### 基本概念与特性 1. **机器相关性**: - **面向特定体系结构**:汇编语言是为特定计算机体系结构(如x86、ARM、MIPS等)设计的,每种体系结构都有其专属的汇编语言。这意味着汇编程序通常不能直接在不同类型的处理器上运行,不具备源代码级别的可移植性。 2. **指令与操作码**: - **助记符表示**:汇编语言使用助记符(mnemonics)来代表特定的机器指令,这些助记符往往与指令的功能相关,如`MOV`(移动数据)、`ADD`(加法)、`JMP`(跳转)等。每个助记符对应一个特定的二进制操作码。 3. **低级操作**: - **直接硬件控制**:汇编语言允许程序员直接操控硬件资源,如寄存器、内存地址、I/O端口等,这使得它非常适合编写对时间和空间效率要求极高、需要精确控制硬件的程序,如设备驱动、实时系统内核、性能关键算法等。 4. **代码效率**: - **紧凑的代码**:汇编程序生成的目标代码通常比高级语言编译后的代码更为紧凑,占用内存较少。 - **快速执行**:由于直接对应于机器指令,汇编程序在执行时无需经过复杂的解释或编译过程,能够快速、高效地被执行。 5. **编写与调试难度**: - **复杂性高**:编写汇编程序需要深入了解计算机体系结构和指令集细节,即使是简单的任务也可能需要大量的指令。此外,程序逻辑的表述不如高级语言直观,容易出错且难以阅读和维护。 - **调试挑战**:由于代码高度依赖具体的硬件状态,调试汇编程序可能非常困难,尤其是在处理复杂的控制流、数据依赖性和异常处理时。 6. **工具支持**: - **汇编器**:汇编语言源代码通过汇编器(assembler)转换成机器语言(机器码或二进制码),汇编器负责将助记符和符号地址解析为具体的机器指令和物理地址。 - **链接器**:生成的机器码通常需要链接器(linker)进行链接,将多个目标文件合并为一个可执行文件,同时解决外部符号引用。 ### 应用场景与优势 汇编语言主要应用于以下几个方面: - **系统级编程**:操作系统内核、设备驱动、中断服务程序等底层软件开发,这些领域要求对硬件有精细控制,且性能要求高。 - **性能优化**:在高级语言编写的程序中,对性能敏感的部分可以用汇编重写以提升效率。 - **反病毒与安全研究**:理解和编写汇编代码有助于分析恶意软件行为、逆向工程及编写防病毒软件。 - **教学与理解计算机原理**:学习汇编语言有助于深入理解计算机体系结构、指令集、内存管理和硬件接口等基础概念。 ### 编程特点与挑战 - **手动管理内存**:程序员需要手动分配和释放内存,跟踪数据在内存中的位置,处理堆栈、堆和静态内存区域。 - **无高级抽象**:缺乏高级语言中的类、对象、函数库等高级抽象概念,所有编程结构如循环、条件分支等都需要手工实现。 - **依赖特定硬件**:汇编程序直接依赖于特定处理器的指令集、寄存器组织和寻址模式,更换硬件平台通常意味着重新编写代码。 尽管汇编语言具有上述挑战,但它在特定场景下提供了无可比拟的优势,如极高的执行效率、对硬件资源的精确控制以及在安全和反病毒领域的应用。随着编译器技术的进步,许多高级语言也能生成高效的目标代码,但在某些对性能和硬件控制有严格要求的情况下,汇编语言仍然是不可或缺的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值