您好,欢迎来到钮旅网。
搜索
您的当前位置:首页8086汇编语言学习(十)8086中断

8086汇编语言学习(十)8086中断

来源:钮旅网
8086汇编语⾔学习(⼗)8086中断

8086中断介绍

  任何⼀种CPU,都具备⼀种能⼒,可以在执⾏完当前正在执⾏的指令之后,检测到来⾃CPU内部或外部产⽣的特殊通知信息,并⽴即对所接收到的信息做出相应的处理。这类特殊的信息,被称作中断信息。

  顾名思义,中断指的是CPU不去正常执⾏接下来的指令,⽽是被中断,转⽽处理中断信息。

  中断信息的种类有很多,但却有着⼀些共同点,中断信息中都包含了中断信息的类型码,⽤于标识中断信息。8086的中断类型码是8位的,这代表着8086CPU最多可以处理256种不同的中断信息。

中断处理程序

  CPU接受到了中断信息后,需要进⾏相应的处理,处理逻辑依然是由开发⼈员编写程序来控制的,所编写的程序被称作中断处理程序。⼀般来说,需要编写不同的中断处理程序以应对不同的中断信息。

  要令CPU中⽌当前指令的执⾏,转⽽跳转执⾏中断处理程序,其原理依然是通过改变8086CPU中CS:IP的值,使之指向中断信息对应的中断处理程序。

  想要CPU令处理不同的中断信息时跳转到对应的中断处理程序,则必须要有⼀种机制将中断信息和中断处理程序建⽴关联。

中断向量表

  8086CPU的设计者提供了⼀种叫做中断向量表的结构,⽤于建⽴中断类型码和中断处理程序⼊⼝的关联关系。中断向量表,就是中断程序⼊⼝地址的⼀个列表,被保存在指定的内存地址中,便于CPU读取。

  每⼀个中断向量列表项(即中断处理程序⼊⼝地址)是32位的,占两个字的空间,其中⾼16位存放段地址,低16为存放偏移地址。中断向量表在8086CPU中的位置是固定的,位于0000:0000~0000:03ff这⼀特殊内存空间中(CPU会固定的到约定的内存处获取数据)。

  CPU在跳转中断处理程序时,以中断类型码*4+2字单元中的数据设置CS,中断类型码*4字单元中的数据设置IP,如此⼀来,便能正确的跳转对应的中断处理程序。中断处理过程

  虽然已经说明了CPU是如何根据中断信息中的类型码跳转执⾏指定的中断处理程序。但实际上,在CPU执⾏完中断处理程序后,还需要能够返回中断处理之前的程序,并接着执⾏之前的程序。

  因此,CPU在跳转中断处理程序前,需要和跳转⼦程序时进⾏同样的操作,将当前的CS:IP压⼊栈中,以便中断处理程序返回时,恢复现场。

中断过程⼤致有以下步骤:

  1.从中断信息中取得中断类型码

  2.pushf 标志寄存器flag⼊栈(第三步中断过程会修改flag的值,因此需要保护当前程序下flag的内容,便于返回后还原)  3.将标志寄存器中关于中断的TF、IF设置为0(TF=0,IF=0)  4.CS⼊栈(push CS)  5.IP⼊栈(push IP)

  6.以中断类型码*4+2的字单元中的数据设置CS,中断类型码*4的字单元中的数据设置IP(CS=N*4+2,IP=N*4)  7.执⾏编写好的中断处理程序  8.IP出栈  9.CS出栈

  10.popf 标志寄存器flag出栈

  纵观整个中断处理过程,8086CPU的中断跳转指令将1/2/3/4/5/6整合为了⼀个由硬件⾃动执⾏的完整操作,⽤于跳转⾄中断处理程序,开发⼈员⽆法直接⼲预这⼀过程。⽽对于8/9/10三个步骤,8086汇编的设计者则提供了指令iret(interrupt return中断返回)指令,将中断返回时必须的出栈操作合⽽为⼀,简化了中断返回时的步骤,降低了出错的可能性。  要想使⽤8086CPU提供的中断处理功能,有⼏点需要注意:

  1.将中断类型码对应的中断处理程序⼊⼝地址存放安装在中断向量表中正确的位置。

  2.中断处理程序和编写⼦程序类似,需要将⽤到的寄存器预先压⼊栈中保存,并在返回前按顺序弹出恢复,避免寄存器冲突。

  3.中断处理程序返回时,需要和中断跳转时的相关寄存器压栈顺序相反,将IP、CS、Flag按顺序出栈(使⽤iret指令),以跳转回中断处理前的程序,恢复现场。

中断向量表初始化

  中断向量表的建⽴和初始化⼯作是由 BIOS 在计算机启动时负责完成的。BIOS 为每个中断号填写⼊⼝地址,因为它不知道多数中断处理程序的位置,所以,⼀律它们指向⼀个相同的程序⼊⼝地址,在那⾥,只有⼀条指令:iret。 

  也就是说,当这些中断发⽣时,只做⼀件事,就是⽴即返回。当计算机启动后,操作系统和⽤户程序再根据⾃⼰的需要,来修改某些中断的⼊⼝地址,使它指向⾃⼰的程序代码。

中断来源类型

  中断信息从来源上可以分为内中断和外中断两种。

内中断

  内中断,便是指来⾃CPU内部的中断信息。8086的内中断⼤致可以分为以下四种:  1.除法错误(例如除数为0),中断类型码为0  2.单步执⾏,中断类型码为1  3.执⾏into指令,中断类型码为4

  4.执⾏int指令,指令的格式为int n(byte类型 idata⽴即数),n表⽰中断类型码。例如在DOS下,⽤于返回DOS操作系统的int 21h。  内中断的存在允许开发⼈员在程序中主动地引发中断,控制CPU执⾏中断处理程序。

外中断

  CPU除了能够执⾏程序指令外,还能对所连接的外设实施控制,接收外设的输⼊数据、向外设输出数据(I/O)。

  以CPU获取外设的输⼊为例分析,CPU应该如何处理外设输⼊事件呢?键盘、⿏标或是触屏等⽤户操作;磁盘、⽹卡的输⼊都是随时随地可能发⽣的,CPU需要及时的获取到这⼀消息,并做出相应的处理。

  从CPU到外设这数据接受和发送的双⽅看来,对是否有数据需要读取的检测⽅式⽆⾮是推与拉两种。CPU可以不断的对所有的外设端⼝进⾏轮询,判断是否存在数据的输⼊,并进⾏处理(CPU主动拉取数据)。另⼀⽅⾯,外设也可以在有数据需要CPU处理时,主动的推送通知给CPU,CPU收到通知后再来读取对应外设的数据,可以避免⼤量⽆效的轮询(外设主动推送通知)。

  由于CPU连接的外设可能会很多,且⼤多数外设在⼀次轮询周期内可能并没有数据需要处理。周期性的轮询会⼀定程度上占⽤CPU资源,降低CPU的执⾏效率。因⽽在CPU硬件层⾯,由外设推送数据的⽅案效率更⾼,更有效。

  8086CPU提供了外中断这⼀机制,允许外设以外中断的形式通知CPU,与之交互。外中断可以分为两⼤类:可屏蔽中断、不可屏蔽中断。

可屏蔽中断

  可屏蔽中断指的是CPU可以选择不响应的中断。8086CPU是否响应中断,是根据当前标志寄存器中IF的值判断,若IF=1,CPU在处理当前指令后⽴即对中断指令做出响应;若IF=0,则CPU不响应可屏蔽中断。

  ⼏乎所有的外设引发的外中断,都是可屏蔽中断。典型的可屏蔽中断源的例⼦是打印机中断,CPU对打印机中断请求的响应可以快⼀些,也可以慢⼀些。在被屏蔽中断期间,打印机会反复的发送中断信号,这期间让打印机等待⼀会是可以接受的。

不可屏蔽中断

  不可屏蔽中断指的是CPU必须做出响应的中断。⽆论IF的值是多少,都必须在收到不可屏蔽中断后,⽴即做出相应。在8086CPU中,不可屏蔽中断的中断类型码固定为2。    

  典型的⾮屏蔽中断源的例⼦是CPU电源断电,⼀旦出现,必须⽴即⽆条件地响应。

为什么进⾏中断处理时,需要先将IF、TF都设置为0?

  将IF设置为0的原因主要是因为8086CPU的设计者认为中断处理程序⼀般是不需要对其它中断做出响应的。

  因此默认的将IF设置为0,禁⽌CPU处理可屏蔽中断。当然,如果有的中断处理程序确实需要处理可屏蔽中断,也可以在中断处理程序中开中断,将IF重新设置为1。指令sti,设置IF=1;指令cti,设置IF=0。  将TF单步调试功能关闭的原因则是为了避免出现单步中断的死循环。

  试想如果开启了单步调试功能,那么在进⼊中断处理程序,并执⾏完第⼀条指令后,便会引发单步中断,进⽽跳转到单步中断处理程序中。⽽在执⾏了单步中断处理程序的第⼀条指令后,⼜会再度引发单步中断,这成为了⼀个死循环。因此,在进⼊中断处理程序之前,必须⾸先把TF置为0,关闭单步调试功能,以避免上述情况产⽣。

总结

  学习8086汇编的主要⽬的是为了更好的学习操作系统,⽽中断这⼀概念在操作系统中是⼗分重要的,操作系统中许多功能都依赖硬件所提供的中断能⼒。

  例如,通过8086中断的学习,我想通了⼀个困扰我很久的问题:在单核CPU机器上,操作系统是如何从当前正在运⾏的应⽤程序⼿中夺回控制权,进⾏应⽤进程调度的?虽然之前了解过时钟中断这⼀概念,但是却⼀直没有彻底的将这些知识逻辑⾃洽的串联起来(好菜啊>_<)。

  我⽬前给出的回答是:这依赖于时钟外设周期性发出的时钟中断信号。当CPU正在运⾏应⽤程序时,时钟中断会使得CPU停⽌执⾏当前应⽤程序的指令,转⽽去执⾏时钟中断处理程序。⽽时钟中断处理程序由操作系统提供,因此此

时CPU的控制权便⼜回到了操作系统程序⼿中。操作系统程序便可以按照⼀定的规则,对运⾏中并发的应⽤程序进⾏相应的调度。通过时钟中断这⼀机制,操作系统得以始终拥有CPU的主导权。

  尽管不同CPU硬件的结构不同,实现中断处理的细节也不尽相同,但⼀些核⼼的概念是不会发⽣太⼤变化的。理解了较为简单的8086CPU中断,能为理解更复杂的硬件及操作系统层⾯的中断机制打下⼀个好的基础。  

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- niushuan.com 版权所有 赣ICP备2024042780号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务