文章目录
- 中断向量表
- 介绍
- 索引方式:
- 修改中断向量表
- 自定义中断
- 思路
- 实现效果:
- 实现代码
- 执行步骤
中断向量表
介绍
在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, 0mov es, axmov word ptr es:[0*4], 200hmov word ptr es:[0*4+2],0;设置中断向量表
自定义中断
思路
前面我们已经说到,0200h~02FFh这个地址空间是空闲的,可以用来存放程序。而中断向量表的作用是用于索引中断向量,于是,我们可以利用修改中断向量表,使其指向我们自定义的中断程序,便可以实现自定义中断的效果。
实现效果:
0号中断为除数为0中断,将其自定义为:在屏幕的正中央输出heppen 0 interrupt。
实现代码
伪码描述:
1.根据中断号找到中断向量地址。
2.修改中断向量地址为我们自定义的中断向量地址。
3.运行设置程序do0.exe
4.运行测试程序test.exe
汇编代码
;do0.asmassume cs:codesgcodesg segment
start: mov ax, csmov ds, ax;源段地址mov si, offset do0;源地址偏移mov ax, 0mov es, ax;目标段地址mov di, 200h;目标地址偏移mov cx, offset do0end - offset do0;目标地址长度cld;设置传输方向为正rep movsb;ds:[si]->es:[di] 循环cx次mov ax, 0mov es, axmov word ptr es:[0*4], 200hmov word ptr es:[0*4+2],0;设置中断向量表mov ax, 4c00hint 21h;
do0:jmp short do0startdb "happen 0 interrupt";中断后显示的数据
do0start:mov ax, 0hmov ds, axmov si, 202h;数据的起始地址mov ax, 0B800hmov es, axmov di, 12*160+36*2;设置显示位置mov cx, 18s: mov al,[si];将数据放入显存mov ah,0FFhmov es:[di], axinc siadd di, 2loop smov ax, 4c00hint 21hdo0end:nop
codesg endsend start
;test.asmassume cs:codesgcodesg segment
start:mov ax, 12hmov dx, 0hdiv dxmov ax, 4c00hint 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