首页 > 编程知识 正文

中断向量表地址范围,什么指令可以放在中断向量表

时间:2023-05-05 15:52:34 阅读:136974 作者:1648

计算机结构9中断和异常9.2中断向量表的结构

我现在知道,如果在运算中遇到异常情况,就翻遍第一页第一行中写入的这些操作的指示,开始下一次执行。 开始执行后,这就解决了问题。 但是,问题是通过这个操作,解决了我的运算结果不能填入空格的问题。 但是,我遇到新问题该怎么办? 我们可能会面临很多其他的问题。 此时,本手册的制造商实际上需要进行一些改进。

手册的第一页不能只写一个解决情况。 他写表格。 本表分一二三四五条,填写不同情况。 我们遇到了不知道的操作符号,请看第一页的第二条; 如果这个地方有虫子,我看不清楚你的数字了,请参考第1页的第6条。 这样我们就可以解决不同的情况。

那么,首先让我们回顾一下UNIVAC处理异常的方法。 当算术运算溢出时,UNIVAC会朝着地址0取出指令。 在那里执行两个修复命令。 这个处理方式已经很灵活了。 不过,还有几点需要改进。 例如,在存储器中,为了从地址0修复指令,只确保了2个指令的空间时。 之后,要改变修复的方法,需要添加一些命令。 这里预约的空间有可能不够吗? 另外,需要处理的异常事态增多时,需要根据异常事态执行不同的异常处理命令。 发生异常也只能转移到地址0时,无法应对多个不同的异常。 因此,在两个方面都需要改进。

之后,看看8086是怎么了吗?

8086是16位处理器。 内部有4个16位通用寄存器,外部有16条数据线。 但那条地址线更多,共有20条。 这样可以寻址的内存空间是2的20次方,也就是1兆个Byte。

由于内部寄存器和运算器都是16位宽,生成20位宽的地址必须采用一定的转换方法。 886采用的是在段上加偏的方式。

而且,这一兆空间并不都是可以自由使用的,两个区域被留作专用用途。 在这1M字节的内存空间中,至少1K字节保留为中断向量表空间,最多16字节保留为初始化程序空间。

结合图标进行说明。 这里用颜色填充的方形表示这1兆字节的内存。 在8086CPU复位之后,第一个取令操作发出的地址是四个f的0(ffff0h )。 这个地址位于这1万亿内存空间最高的16字节的这个位置。 这个区域实际上很小,只能放少量的命令。 通常这里放置的是无条件的传送指令,传送到存储器空间的另一个地方。 那个地方保管着后续的系统程序。

那个CPU复位后,为什么不从完全0(00000h )的地址中取地址呢? 那样看起来更自然吧。 那是因为从0开始的地址空间也已经被占用了。 1k(0000h~003ffh )的字节用作中断向量表空间,存储共计256个中断向量,每个中断向量占4字节。 这样正好是1k(256*4=() )2^{10}=1k ) )字节。 除了这两个专用区域外,其他区域可用于存储一般程序指令和数据。 该区域(0000H~003FFH )中还有用于进行中断处理的程序,这些程序称为中断服务程序。 这些程序代码的起始地址称为中断服务程序的入口地址。

这就是中断向量的定义。

现在的CPU可以处理各种类型的中断。

每个中断类型对应一个中断向量,共4个字节。 这4个字节中,前2个字节(06H和30H )用于存储中断服务程序条目的偏移,低位字节(06H )位于高位字节(30H )位于低位字节(30H )位于低位字节。 因此,对于该中断向量,这两个字节[06h]和30h]存储在指令指针寄存器[IP]中,前一个字节[06h]是寄存器中的低位字节,后一个字节[30h]是寄存器中的低位字节在中,中断向量中的低2字节(00H和40H )用于存储与中断服务程序的入口地址对应的段基础值到代码mmydxb (即CS寄存器)。 类似地,前一字节(00H )对应于寄存器中的较低字节,而最后一字节(40H )对应于寄存器中的较高字节。 在8086和X86处理器后续的实模式下,必须在名为CS和IP的寄存器对中指定内存地址。

该地址的生成方法称为段加偏移。 CS寄存器是mmydxb,16位。 刚才的IP寄存器与偏移量相对应,也是16位。 这两个16位地址构成逻辑地址。 通常的表示法是用冒号分隔这两个16位(CS:IP )。 而且,当CPU产生地址时,通过使mmydxb(cs )的数目向左偏移4个比特并且加上偏移,相加结果为20比特的物理地址。 这就是逻辑地址生成物理地址的方式。 实际上,将段基值乘以16并加上偏移量。 对二进制文件来说,向左移动4位就是乘以16。 向二进制左移4位,将向十六进制左移1位。

这样,各中断向量由2个段基值和2个向量的偏移地址构成。 由于各个中断向量占用了4个字节,所以中断向量表整体中有256个中断向量,分别命名为0号、1号、255号为止的中断。 此中断向量表在系统内启动时初始化。 假设1号向量的初始值是这样的。 cpu接收到中断时,注意到的话就中断1号。 由于各中断向量所在的地址是固定的,所以cpu不执行命令,可以直接通过硬件电路的设定进行发送

出内存访问来读取这四个字节的内容。然后将其中高两个字节送到CS寄存器当中去,低两个字节送到IP寄存器当中去。

对于8086来说,这两个寄存器(CS和IP)的功能就相当于我们在之前介绍处理器内部结构时提到的PC寄存器。所以,这两个寄存器的值一旦发生改变,下一个周期cpu就会从这个新的地址(CS:IP)开始取下一条指令,根据段加偏移的计算方法,cpu发出的地址就是43006。因此,也就是说在遇到1号中断时,cpu就会转到43006这个地址开始执行程序。当然,需要事先把1号中断的服务程序存放在这里(存储器内)。

与此类似,我们还会把0号中断的服务程序放在存储器的另一个地方,然后将0号中断程序的起始地址分解成段基值和偏移地址,存放在0号中断向量所在的位置。当cpu遇到中断时,如果发现是0号中断,则会将0号中断向量对应的内容取出,分别填到CS和IP寄存器当中去。这样cpu就会从0号中断服务程序的起始地址开始取出指令进行执行。

我们注意到,这些中断服务程序在内存当中的存放顺序并没有要求。并不需要按照中断类型的顺序,先放0号中断服务程序,再放1号中断服务程序,而是可以随意放置。只需要把它的起始地址存放在中断向量表的对应位置就可以了。这样做就比UNIVAC的方式要灵活的多,一来中断服务程序就可以可长可短,不用担心在从0开始的地址到底要预留多少的空间才够;二来中断服务程序的存放位置如果发生改变,也没有关系,不需要修改cpu的硬件设计,而只需要修改中断向量表中对应的中断向量就可以了。这样只用初始化好中断向量表,并在存储器当中准备好对应的中断服务程序,cpu在遇到中断时就可以自动的跳到对应的中断服务程序进行处理。

关于中断向量的相关的计算,我们来看几个简单的练习。

第一,如果中断类型码,也就叫做中断类型号为20H。那中断向量起始的逻辑地址应该是什么呢?首先,我们知道中断向量表是从地址0开始的,一共256个中断向量顺序存放,而每个中断向量占四个字节。所以,中断向量存放的位置就是它的中断类型号乘以4,那这个中断地址就是0000:0080。如果这个中断向量中四个字节的内容分别是10H、20H、30H和40H,那中断服务程序的入口地址应该是什么呢?

按我们刚才介绍的情况。这四个字节单元低两个字节对应了IP寄存器,高两个字节对应了CS寄存器。而且地址较低的这个字节是放在寄存器当中较低的位置。所以,这中断服务程序的入口地址应该是4030:2010。这两个练习就是说明了cpu在遇到了中断之后,硬件完成的工作。如果cpu现在遇到的中断类型号是20H,则会通过硬件进行乘4的操作,从而得到这个逻辑地址(0000:0080)。然后将这个逻辑地址发到存储器中,读回了这四个字节(10H、20H、30H 和 40H)的内容。然后,按照我们刚才规定的原则拼接出了这样两个16位数(4030:2010),并且把这两个16位数分别存放到CS和IP寄存器当中去。这样在下一个时钟周期就会将新的地址发送到存储器去取下一条指令了。

然后我们再来看另一个练习。

如果我们现在要为17H号中断新写了一段中断服务程序,而且把这段中断服务程序放到了存储器的某一个地方,地址是2340H:7890H。

那现在我们就需要去更新中断向量表。现在问题就是,我们要更新中断向量表中的哪四个字节?而且更新成什么样的内容?那我们可以一起来算一下。因为中断类型号是17H,那对应中断向量的地址就应该是它乘以4(17*4 = 5C (mod 16))。由这个地址(0000:005C)开始,向高地址增长,一共4个字节。所以,这四个字节的逻辑地址是这样的(第一个空)。

这四个字节单元当中分别应该填写什么样的内容呢?那么还是要记住这个原则,如果把这个逻辑地址(2340:7890H)从右往左看。最右边的这个字节(90H)放在最低的地址,而最左边的这个字节(23H)放在最高的地址。这四个字节依次排放。所以,地址由低到高四个字节内容分别应该是90、78、40和23。

那这两个练习就分别展示了cpu硬件查找中断向量表的过程,和准备好中断服务程序去初始化或者修改中断向量表的过程。

对于8086的中断向量表cpu已经固定使用了前五个类型的中断,具体的功能我们后面会再介绍。之后的27个中断(5~31)也是保留给后续的cpu使用的。而除了前20个中断,之后的224个的中断则是交给使用cpu的用户自行定义。

我们现在知道了,原来我们的第一页制造者给我们列了一张表格。一共有256条。那我们在遇到异常情况的时候,就可以根据事先的约定对应不同的情况,去找对应的那一条表项。那条表项实际上是指一个页码。比如说第四条说翻到第十二页,这第十二页翻过来以后,写了具体的操作,我们应该做什么事情,操作还挺复杂,写了好几页,我们都放在一页纸是放不下的。所以,这就是我们现在要怎么处理异常情况的方法。

随着我们要做的运算任务的增加,这个表的内容可能还需要进一步的扩展。接下来我们就来看一看它是怎么扩展的。

转载于:https://www.cnblogs.com/houhaibushihai/p/9742806.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。