《汇编语言》第12章 -内中断 实验12

检测点12.1

(1)3号中断源对应的中断处理程序的入口地址为:00:70
(2)N号中断源对应的中断处理程序的入口地址的偏移地址的内存单元的地址为:4N
段地址为的内存单元地址为:4N+2

实验12 编写0号中断的处理程序

王老师要求:仔细跟踪调试,在理解整个过程之前,不要进行后面课程的学习。

这个实验的答案,在文章中都有,每一步的讲解,王老师讲解的都很详细到位。需要我们好好理解?。

实验结果如下,(加了一点颜色?)
在这里插入图片描述


课程知识点概括

0.内中断

中断:CPU不在接着(刚执行完的程序)向下执行,而去转去处理这个特殊信息。

中断信息:一种特殊的信息。要求CPU马上进行某种处理,并向所要进行的某种处理提供必备的参数的通知信息。
中断信息可以来自于CPU的内部和外部。

1.内中断的产生

当CPU内部发生:
(1)除法错误,比如div指令产生了溢出
(2)单步执行;
(3)执行into指令;
(4)执行int指令;
时,将产生相应的中断信息。

中断源:产生中断信息的事件,即中断信息的来源;
中断类型码:标识中断信息的来源;(有8位,可用来标识256种不同的中断信息)

例如:除法错误的中断类型码为 0;
单步执行的中断类型码为 1;
执行into指令的中断类型码为 4;

2,3.中断处理程序与中断向量表

中断处理程序:由我们编写的,用来处理中断信息的程序;一般来说,需要对不同的中断信息编写不同的处理程序。

中断向量表:就是中断处理程序入口地址的列表。(在内存种保存)

CPU用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址。
注:中断向量表必须放在0000:0000~0000:03FF单元种。8086CPU就从这个地方读取中断向量表。
中断向量表中,一个表项占两个字,高地址字存放段地址,低地址字存放偏移地址。

N号中断源对应的中断处理程序的入口偏移地址的内存单元地址位:4N,段地址的内存单元地址为:4N+2;

4.中断过程

中断过程:CPU硬件完成中断处理程序的CS和IP的设置的这一过程;

8086收到中断信息后,所引发的中断过程:
(1)从中断信息中取得中断类型码;
(2)flag入栈;
(3)设置flag的第8位TF和第9位IF的值为0;
(4)CS入栈
(5)IP入栈
(6)由硬件读取内存中4中断类型码和4中断类型码+2 的两个字单元中设置中断处理程序的入口地址CS和IP。
即:
(1)取得中断类型码N;
(2)pushf
(3)TF=0,IF=0
(4)push CS
(5)push IP
(6)(IP)=(N4),(CS)=(N4+2)

5.中断处理程序和iret指令

中断处理程序要一直存储在内存某段空间之中。
(因为随都有可能检测到中断信息。)

iret指令:
pop ip
pop cs
popf
通常和硬件自动完成的中断过程配合使用。用来恢复中断处理前的执行状态。

6.除法错误中断的处理

当发生除法溢出错误时,产生中断类型码为0的中断信息,CPU检测到这个信息,然后引发中断过程,转去执行0号中断的中断处理程序。
0号中断处理程序的功能是:显示提示信息,返回到操作系统中。

7.编程处理0号中断

分两部分,一个是安装程序段,一个是0号中断处理程序段(do0)。
安装程序段的作用是将do0的数据复制到00:200处,然后设置中断向量使do0变为0号中断处理程序。

完整的程序:

assume cs:code
code segment
start:
"""
安装程序段
"""
mov ax,cs
mov ds,ax
mov si,offset do0			;设置ds:si指向源地址

mov ax,0
mov es,ax
mov di,200h					;设置es:di指向目的地址

mov cx,offset do0end-offset do0
							;设置cx为传输长度
cld							;设置传输方向为正

rep movsb					;开始传送

"""
设置中断向量
"""
mov ax,0
mov es,ax
mov word ptr es:[0*4],200h
mov word ptr es:[0*4+2],0

mov ax,4c00h
int 21h

do0:
jmp short do0start
db "overflow!"

do0start:
mov ax,cs
mov ds,ax
mov si,202h					;设置ds:si指向字符串

mov ax,0b800h
mov es,ax
mov di,12*160+36*2			;设置es:di指向显存的中间位置

mov cx,9					;设置cx为字符串长度

s:
mov al,[si]
mov es:[di],al
inc si
add di,2
loop s

mov ax,4c00h
int 21h

do0end:nop

code ends
end start

11.单步中断

CPU在执行完一条指令之后,若检测到flag的TF位为1,则产生单步中断,引发中断过程。

如下:
(1)取得中断类型码1;
(2)flag入栈,TF,IF设置为0;
(3)CS,IP入栈
(4)(IP)=(14),(CS)=(14 +2)

单步中断为debug的实现提供了机制。

12.响应中断的特殊情况

在CPU执行入栈或出栈指令时,不会响应中断。须在入栈和出栈操作完整执行前后,才会响应中断。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值