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

中断向量表

介绍

在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

猜你喜欢

转载自blog.csdn.net/qq_45931661/article/details/120576061