x86汇编语言中的中断
引言
在计算机系统中,中断是一种至关重要的机制,它允许硬件或软件事件在CPU执行当前任务时暂停其执行。中断机制在现代计算机系统中扮演着至关重要的角色,确保了系统的稳定性、响应性和安全性。本文将深入探讨x86汇编语言中的中断机制,揭示其运作原理、类型和处理方式。
中断的基本概念
中断是一种外部或内部事件,它导致CPU暂停当前执行的指令,转而执行中断服务例程(ISR)。中断通常是由硬件设备或软件错误触发的,例如:
x86中的中断机制
在x86处理器中,中断通过一个称为中断表(IDT)的特殊数据结构进行管理。IDT包含一个中断向量的数组,每个向量对应一个特定的中断类型。当一个中断发生时,CPU会根据中断类型从IDT中检索相应的中断向量。
中断向量是一个指向ISR的指针。当CPU执行中断向量时,它会将当前指令指针(EIP)压入堆栈,然后跳转到ISR的地址。ISR负责处理中断事件,并根据需要执行适当的操作。
中断类型
x86体系结构定义了多种类型的中断,每种类型都有一个特定的中断号。以下是一些常见的x86中断类型:
中断处理
当发生中断时,CPU会执行以下步骤:
压入当前EIP到堆栈。压入当前标志寄存器(EFLAGS)到堆栈。压入当前段寄存器(CS、DS、SS、ES)到堆栈。根据中断号从IDT中检索中断向量。跳转到中断向量指向的ISR。
ISR负责处理中断事件。ISR可以执行各种操作,例如:
中断示例
以下是一个使用x86汇编语言处理键盘中断的示例代码:
buffer: .space 128 ; 键盘缓冲区
main
main:
; 启用键盘中断
mov eax, 0x21
mov ebx, 0xFD
int 0x21
; 循环读取键盘输入
loop:
; 检查键盘缓冲区是否为空
mov eax, 0x21
mov ebx, 0xFC
mov ecx, 0
int 0x21
cmp eax, 0
je loop
; 读取键盘输入
mov eax, 0x21
mov ebx, 0x01
mov ecx, buffer
int 0x21
; 处理键盘输入
...
; 跳回循环
jmp loop
; 退出程序
mov eax, 0x4C
int 0x21
结论
中断机制是现代计算机系统中不可或缺的一部分。通过暂停当前执行的指令并执行ISR,中断机制确保了硬件事件和软件错误得到及时处理。x86汇编语言提供了一组强大的指令,用于处理中断,这对于开发嵌入式系统和低级操作系统至关重要。理解中断机制对于任何希望掌握x86汇编语言的程序员来说都是必不可少的。
汇编--学习笔记(十三)-中断及中断处理程序
中断时计算机科学中最基本、也是十分重要的一个概念,可以说没有中断概念的引入和应用就不会有今天的计算机,至少不会有搞效率的计算机。
一、中断:
定义:中断就是使CPU暂时挂起当前正在进行的工作并转向某紧急事件的服务与处理程序(该服务与处理程序称为中断服务程序),在执行完中断服务程序后再返回到被中止的原有工作处的过程。
中断分类:中断按其产生的方式可分为硬件中断和软件中断。硬件中断又分为内部和外部两种。
二、内部硬件中断
一个字节即一共256个中断,00H~FFH。
定义:内部硬件中断是由某些特殊的指令触发的,例如单步中断、除法出错中断。通常我们所说的硬件中断即指内部硬件中断。
硬件中断举例:在使用DEBUG调试程序时我们经常使用T命令和P命令,而T命令和P命令的执行恰好正是利用了内部硬件中断。
(3)INT 03H:断点中断,由P命令产生。
(4)INT 04H:溢出中断。
三、外部硬件中断
定义:外部硬件中断是指从处理器外部的硬件设备中产生并发向处理器的中断。
分类:分为可屏蔽中断和不可屏蔽中断两种。分别由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)中断向量表的优点
例一:保存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自动提供
4、软中断的处理过程
软中断被响应后,CPU进入中断响应周期。CPU将中断类型号乘以4,得到中断向量表的入口地址,并执行一下动作:
(3)将当前代码段寄存器的内容(CS)压栈。(4)将当前指令指针(IP)压栈。
(5)转向中断服务程序入口并将控制交给中断服务程序。
在中断服务程序执行完后,即CPU接收到IRET指令时,它又将产生以下步骤:
5、中断服务程序的编写
中断服务程序可以按各个设备的要求来加以编制,但一般有:
6、软中断的分类
一般情况下,目前使用的软中断可分为三大类:
(2)DOS中断 — 20H ~ 3FH(32个)
(3)自由中断 — 40H ~ FFH(192个)
7、软中断的访问
软中断的访问在不同的环境中有不同的形式,在这里我们仅仅就汇编语言对软中断的访问讨论一下。用汇编语言申请一个标准DOS或BIOS中断是非常简单的,用户程序通过规定的寄存器与中断服务程序之间进行内定的规范的信息交换。大部分的中断处理程序都有一个入口和一个出口,在入口处用寄存器传入规定的数据,在中断请求完毕之后再通过特定的寄存器传递出返回值。
MOV DL,'A'
MOV AH,02H
INT 21H ;显示一个字符