回 帖 发 新 帖 刷新版面

主题:如何实现将中断服务程序的入口地址填如中断矢量表中的编程

要求如下:
 某外部可屏蔽中断的类型码为08H,它的中断服务程序的入口地址为0020:0040H.请编程将该中断服务程序的入口地址填如中断矢量表中.
 我是这样想的,不知道正确与否:
    mov ax,20H
    mov [0020H],ax
    mov ax,40H
    mov [0022H],ax
请这方面的高手指导指导哟!

回复列表 (共26个回复)

11 楼

呵呵,谢谢,我明白了

12 楼

楼主,你说的直接把08h放到al中跟你后面说的中断类型号乘以四得到的中断向量表的地址有冲突吗?mov al,08h是在调用DOS 21H号中断25H功能重设08H 号功能的中断程序的中断向量时设置的

13 楼

要在自己的程序中使用中断,应设置中断向量,有两个办法:
1)将中断向量强行写入中断向量表。例如,要把自己的中断服务程序指定为61H号中断,则把中断服务程序的首地址(即中断向量)写入61H*4开始的两个字单元即可,偏移写入低字,段写入高字。设置好后,即可用INT 61H调用自己的中断服务程序。
2)用DOS功能25H也能设置:把中断向量的段放在DS中,偏移放在DX中,中断号放在AL寄存器中,然后下面的指令:
MOV AH,25H
INT 21H
即可设置好中断向量。 
楼主用的是第二种方法,楼主可否考虑一下第一种方法呢?

14 楼


要在自己的程序中使用中断,应设置中断向量,有两个办法:
1)将中断向量强行写入中断向量表。例如,要把自己的中断服务程序指定为61H号中断,则把中断服务程序的首地址(即中断向量)写入61H*4开始的两个字单元即可,偏移写入低字,段写入高字。设置好后,即可用INT 61H调用自己的中断服务程序。
2)用DOS功能25H也能设置:把中断向量的段放在DS中,偏移放在DX中,中断号放在AL寄存器中,然后下面的指令:
MOV AH,25H
INT 21H
即可设置好中断向量。 
楼主用的是第二种方法,楼主可否考虑用地一种方法呢?

15 楼

楼主,经证实,你的第一种 方法可以实现修改中断向量

16 楼


那么请问如何通过汇编编程实现呢?
我就是不知道如何编程.
我是这样想的
不知道对否?
请指点指点:
 mov ax,20H
    mov [0020H],ax
    mov ax,40H
    mov [0022H],ax

17 楼


那么请问如何通过汇编编程实现呢?
我就是不知道如何编程.
我是这样想的
不知道对否?
请指点指点:
 mov ax,20H
    mov [0020H],ax
    mov ax,40H
    mov [0022H],ax

18 楼

置换中断向量一般的步骤如下:

一、关中断
二、保存原中断向量
三、存入新中断向量
四、开中断

使用int 21h的25h功能(写中断向量)和35h功能(读中断向量)当然也可以,这是比较简单的方法,同时不需要手工关和开中断(int 21h替你做了)。要手工替换的话,下面是简化代码:


vector   dd    ?

         ........
         xor ax, ax
         mov es, ax
         mov bx, 8*4
         mov ax, es:[bx]
         mov word ptr vector, ax
         mov ax, es:[bx+2]
         mov word ptr vector+2, ax
         cli
         mov word ptr es:[bx], 40h
         mov word ptr es:[bx+2], 20h
         sti
         ...........

19 楼


谢了,高手能否给我讲解一下:这里为什么要用到es呢?

20 楼

这里用es并不是必须的,当然可以继续用ds,但通常在程序中ds已经用于数据段了,还用ds的话需要先把ds的值保存下来,这有点多余和麻烦,直接用es就得了,简单。

我来回复

您尚未登录,请登录后再回复。点此登录或注册