什么是中断向量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是中断向量相关的知识,希望对你有一定的参考价值。

中 断 向 量   
中断向量即中断源的识别标志,可用来存放中断服务程序的入口地址或跳转到中断服务程序的入口地址。   
(1)存放中断服务程序的入口地址   在PC/AT机中,中断向量是指中断服务程序的入口地址,每个中断向量分配4个连续的字节单元,两个高字节单元存放入口的段地址CS,两个低字节单元存放入口的段内偏移量IP。在PC/AT中,规定内存储器的最低1 KB用来存放中断向量(共256个),称这一片内存区为中断向量表,地址范围是0~3FFH,如图所示。   在PC/AT中由硬件产生的中断标识码被称为中断类型号(当然,中断类型号还有其他的产生方法,如指令中直接给出、CPU自动形成等),即在中断响应期间8259A产生的是当前请求中断的最高优先级的中断源的中断类型号。中断类型号和中断向量之间有下面的关系:   中断类型号×4=存放中断子程序的首地址=中断向量   有了存放中断向量的首地址,从该地址开始的4个存储单元中取出的就是中断服务程序的入口。   
(2)跳转到中断服务程序的入口地址   在AVR或ARM微处理器中,中断向量的大小也是4个字节,但其中存放的不是中断程服务程序的入口地址,而是可执行的代码。当响应中断时,硬件自动执行相应中断向量处的跳转代码,然后跳转到具体的中断服务程序的入口地址。  

中断向量地址和中断向量  
 中断向量:中断服务程序的入口地址  
 中断向量地址:内存中存放中断服务程序入口地址的地址

参考资料:http://baike.baidu.com/view/993996.htm

参考技术A 就是中断矢量,也叫中断类型号,比如8086有256个中断向量,即0~255号。 参考技术B 中断有很多类型,例如 除法错误中断,溢出中断 等等也就是说你要用到什么的时候就写那个响亮号
通俗的说中断向量就相当于一个门牌号,当你要找张三的话你找到张三门牌号,找李四找李四门牌号,

汇编_修改中断向量表_自定义中断

中断向量表

介绍

在dos系统中,总共设计了256种中断,每个中断都有一个中断号,通过中断号来映射中断程序的地址。为了实现映射的功能,引入中断向量表。规定中断向量表的起始地址为0000h,结束地址为03FF,即(0000000000)b~(1111111111)b,总共占用了前1024个字节。
注:0200h~02FFh地址空闲,还没有给定中断向量地址

索引方式:

中断向量表的索引地址由两部分构成,分别是CS和IP,其低地址存放IP,高地址存放CS。当触发中断号x时,操作系统先保存PSW和PC到核心栈中,然后设置IP=[0000:[x*2]],CS=[0000:[x*2+2]],然后进行中断调用。
例如:
当触发21h号中断时,系统先保存PSW和PC,然后将IP设置为[0000:[42h]],CS设置为[0000:[44h]],然后执行中断调用。

修改中断向量表

修改中断向量表,其实就是修改目标中断的CS和IP的值,让中断发生时,CS:IP指向我们自定义的中断。
比如修改0号中断的中断向量表。

    mov ax, 0
    mov es, ax

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

自定义中断

思路

前面我们已经说到,0200h~02FFh这个地址空间是空闲的,可以用来存放程序。而中断向量表的作用是用于索引中断向量,于是,我们可以利用修改中断向量表,使其指向我们自定义的中断程序,便可以实现自定义中断的效果。

实现效果:

0号中断为除数为0中断,将其自定义为:在屏幕的正中央输出heppen 0 interrupt。

实现代码

伪码描述:
1.根据中断号找到中断向量地址。
2.修改中断向量地址为我们自定义的中断向量地址。
3.运行设置程序do0.exe
4.运行测试程序test.exe
汇编代码

;do0.asm

assume cs:codesg

codesg segment
start: 
    mov ax, cs
    mov ds, ax;源段地址
    mov si, offset do0;源地址偏移

    mov ax, 0
    mov es, ax;目标段地址
    mov di, 200h;目标地址偏移
    
    mov cx, offset do0end - offset do0;目标地址长度

    cld;设置传输方向为正
    rep movsb;ds:[si]->es:[di] 循环cx次

    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 "happen 0 interrupt";中断后显示的数据
do0start:
    mov ax, 0h
    mov ds, ax
    mov si, 202h;数据的起始地址

    mov ax, 0B800h
    mov es, ax
    mov di, 12*160+36*2;设置显示位置
    mov cx, 18

s:  mov al,[si];将数据放入显存
    mov ah,0FFh
    mov es:[di], ax
    inc si
    add di, 2
    loop s

    mov ax, 4c00h
    int 21h

do0end:
    nop
codesg ends

end start
;test.asm

assume cs:codesg

codesg segment
start:
    mov ax, 12h
    mov dx, 0h
    div dx

    mov ax, 4c00h
    int 21h
codesg ends
end start

执行步骤

1.ml do0.asm
2.do0.exe
3.ml test.asm
4.do0.exe
也可以逐步编译,连接
1.masm do0.asm
2.link do0.obj
3.do0.exe
4.masm test.asm
5.link test.obj
6.test.exe

以上是关于什么是中断向量的主要内容,如果未能解决你的问题,请参考以下文章

什么是中断向量

什么叫中断向量?它放在哪里?

中断向量表的作用是啥?如何设置中断向量表

中断向量是指啥?

中断向量是啥意思

中断向量表是队列吗?