汇编语言——第12章 内中断

目录

引言

12.1 内中断的产生

12.2 中断处理程序

12.3 中断向量表

检测点12.1

12.4 中断过程

12.5 中断处理程序和iret指令

12.6 除法错误中断的处理

12.7 编程处理0号中断

12.8 安装

12.9 do0

12.10 设置中断向量

12.11 单步中断

12.12 响应中断的特殊情况


引言

任何一个通用的CPU,比如8086,都具备一种能力,可以在执行完当前正在执行的指令之后,检测到从CPU外部发送过来的或内部产生的一种特殊信息,并且可以立即对所接收到的信息进行处理。这种特殊的信息,我们可以称其为:中断信息。中断的意思是指,CPU不再接着(刚执行完的指令)向下执行,而是转去处理这个特殊信息。

“中断信息“是要求CPU马上进行某种处理,并向所要进行的该种处理提供了必备的参数的通知信息。

中断信息可以来自CPU的内部和外部

12.1 内中断的产生

对于8086CPU,当CPU内部有下面的情况发生的时候, 将产生相应的中断信息:

(1)除法错误,比如,执行div指令产生的除法溢出;

(2)单步执行;

(3)执行into指令;

(4)执行int指令。

不同的信息需要进行不同的处理。

CPU首先要知道所接接收的中断信息的来源。所以中断信息中必须包含识别来源的编码。8086CPU用称为中断类型码的数据来标识中断信息的来源。中断类型码为一个字节型数据,可以表示256种中断信息的来源。

我们将产生中断信息的事件,即中断信息的来源,简称为中断源

上述的四种中断源,在8086CPU中的中断类型码如下:
(1)除法错误:0

(2)单步执行:1

(3)执行into指令:4

(4)执行int指令,该指令格式为int n,指令中的n为字节型立即数,是提供给CPU的中断类型码。

12.2 中断处理程序

用来处理中断信息的程序被称为中断处理程序。一般来说需要对不同的中断信息编写不同的处理程序。

CPU在收到中断信息后,应该转去执行该中断信息的处理程序。若要8086CPU执行某处的程序,就要将CS:IP指向它的入口(即程序第一条指令的地址)。

12.3 中断向量表

CPU用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址。

中断向量,就是中断处理程序的入口地址。中断向量表,就是中断处理程序入口地址的列表。

中断向量表在内存中保存,其中存放这256个中断源所对应的中断处理程序的入口。

CPU只要知道了中断类型码,就可以将中断类型码作为中断向量表的表项号,定位相应的表项,从而得到中断处理程序的入口地址。

中断向量表在内存中存放,对于8086PC机,中断向量表指定放在内存地址0处。从内存0000:0000到0000:03FF的1024个单元中存放这中断向量表。一个表项存放一个中断向量,也就是一个中断处理程序的入口地址,对于8086CPU,这个入口地址包括段地址和偏移地址,所以一个表项占两个字,高地址字存放段地址,低地址字存放偏移地址

检测点12.1

 

12.4 中断过程

用中断类型码找到中断向量,并用它设置CS和IP,这个工作是由CPU的硬件自动完成的。CPU硬件完成这个工作的过程被称为中断过程

CPU收到中断信息后,要对中断信息进行处理,首先将引发中断过程。硬件在完成中断过程后,CS:IP将指向中断处理程序的入口,CPU开始执行中断处理程序。

CPU在执行完中断处理程序后,应该返回原来的执行点继续执行下面的指令。所以在中断过程中,在设置CS:IP之前,还要将原来的CS和IP值保存起来

下面是8086CPU在收到中断信息后,所引发的中断过程:
(1)(从中断信息中)取得中断类型码;

(2)标志寄存器的值入栈(因为在中断过程中要改变标志寄存器的值,所以先将其保存在栈中ÿ

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,这个问题可以用汇编语言来解决。下面是一个可能的解决方案,仅供参考。 首先,我们需要定义一个数组,用于存储每个月份的缩。可以用如下方式定义: ``` months db 'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec' ``` 接下来,我们需要获取用户输入的数字,可以使用 DOS 中断 21h 中的功能来实现。具体步骤如下: 1. 调用中断 21h 的 01h 功能,显示提示信息 "Please enter a number (1-12): ",并等待用户输入。 2. 调用中断 21h 的 0Ah 功能,将用户输入的字符串读入到一个缓冲区中。 3. 将缓冲区中的字符串转换为数字,并保存到一个寄存器中。 代码如下: ``` mov ah, 09h ; 01h 功能:显示字符串 lea dx, prompt ; 提示信息 int 21h mov ah, 0Ah ; 0Ah 功能:输入字符串 lea dx, buffer ; 缓冲区 int 21h mov al, buffer[2] ; 第三个字符是用户输入的数字 sub al, '0' ; 将 ASCII 码转换为数字 ``` 接下来,我们需要检查用户输入的数字是否在 1-12 的范围内。如果不是,则显示错误信息并退出程序。否则,将对应月份的缩输出到屏幕上。 代码如下: ``` cmp al, 1 jl error cmp al, 12 jg error mov dl, months[al-1] ; 获取对应月份的缩 mov ah, 02h ; 02h 功能:显示字符 int 21h mov dl, months[al] int 21h mov dl, months[al+1] int 21h jmp exit error: mov ah, 09h lea dx, errmsg int 21h exit: mov ah, 4Ch ; 4Ch 功能:退出程序 int 21h prompt db 'Please enter a number (1-12): $' buffer db 3, 0 errmsg db 'Invalid input!$' ``` 完整代码如下: ``` .model tiny .code org 100h start: mov ah, 09h ; 01h 功能:显示字符串 lea dx, prompt ; 提示信息 int 21h mov ah, 0Ah ; 0Ah 功能:输入字符串 lea dx, buffer ; 缓冲区 int 21h mov al, buffer[2] ; 第三个字符是用户输入的数字 sub al, '0' ; 将 ASCII 码转换为数字 cmp al, 1 jl error cmp al, 12 jg error mov dl, months[al-1] ; 获取对应月份的缩 mov ah, 02h ; 02h 功能:显示字符 int 21h mov dl, months[al] int 21h mov dl, months[al+1] int 21h jmp exit error: mov ah, 09h lea dx, errmsg int 21h exit: mov ah, 4Ch ; 4Ch 功能:退出程序 int 21h prompt db 'Please enter a number (1-12): $' buffer db 3, 0 errmsg db 'Invalid input!$' months db 'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec' end start ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

关了个尔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值