主题:如何实现将中断服务程序的入口地址填如中断矢量表中的编程
pqf
[专家分:0] 发布于 2006-05-16 22:34:00
要求如下:
某外部可屏蔽中断的类型码为08H,它的中断服务程序的入口地址为0020:0040H.请编程将该中断服务程序的入口地址填如中断矢量表中.
我是这样想的,不知道正确与否:
mov ax,20H
mov [0020H],ax
mov ax,40H
mov [0022H],ax
请这方面的高手指导指导哟!
回复列表 (共26个回复)
沙发
tianya1223 [专家分:10] 发布于 2006-05-18 19:25:00
push ds
mov dx,oo40h
mov ds , 0020
mov ax , 0020h
int 21h
pop ds
板凳
llydd [专家分:200] 发布于 2006-05-19 12:53:00
mov ah,35h ;保存原先的中断向量
mov al,08h
int 21h
push es
push bx
mov ah,25h ;重设08H号中断向量
mov al,08h
mov ax,0020h
mov ds,ax
mov dx,0040h
int 21h
3 楼
pqf [专家分:0] 发布于 2006-05-19 13:20:00
谢谢你们的回复,但是我还是不很懂,比如说mov ax, 0020h具体是什么意思.由于每个中断类型号占四个字节,故将类型号08h 对应的地址为0020h,楼主llydd是不是没注意到这一点呢?
4 楼
llydd [专家分:200] 发布于 2006-05-19 18:22:00
你重设的08H号功能对应的段地址是0020H,偏移地址是0040H,调用DOS 21H号中断,25H号功能重设中断向量表时,要将预设的中断功能号08H的段地址送DS,偏移地址送DX,但是0020H是立即数,不能直接送段寄存器,所以要先mov ax,0020h然后再mov ds,ax
5 楼
llydd [专家分:200] 发布于 2006-05-19 18:23:00
我也希望高手指点
6 楼
pqf [专家分:0] 发布于 2006-05-19 21:04:00
呵呵,高手谈不上哦,你说的我明白了,但是不能直接将08h放到al中啊,因为中断类型号08h 乘以四后得到中断矢量表的地址指针是0020h.矢量号要乘以四才能得到中断矢量表的地址,然后把中断矢量表(4*8)d地址开始的两个低字节单元内容装入dx,(即,mov dx,0040h)再把两个高字节单元内容装入cs(mov ax,0020h
mov ds,ax)
7 楼
pqf [专家分:0] 发布于 2006-05-19 21:08:00
对了,我们课本上说是把中断功能号08H的段地址送CS,偏移地址送IP,我不知道是不是只要将段地址送到段寄存器就行,而不 管是cs段寄存器还是ds段寄存器呢?
8 楼
llydd [专家分:200] 发布于 2006-05-19 22:04:00
int 08h中断指令执行时会把08H号功能对应的中断向量表中的两个字内容分别送到IP寄存器和CS寄存器中,这是int 08h指令执行时自动处理的,并不是你人为的把它们送到IP和CS中的,这两个字是你通过:
mov ah,25h
mov al,08h
mov ax,0020h
mov ds,ax
mov dx,0040h
int 21h
存入08H号功能对应的中断向量表的地址中的
也就是说INT 08H会执行
IP=[4*08H,4*08H+1]
CS=[4*08H+2,4*08H+3]
[img]http://tk.files.storage.msn.com/x1pIuxx1VYmtQuzFQENYebLyCgB-p8K3jpA8Y1SEix9GBlXeRKoN_1FFeyQOsYYKldk5VYjqmVLbCaedQENZrK9zMv-WPL906A5mZv7FhrGJpqb45BfhDq_ygAO2RBvcPTfsEy__p8TpIU[/img]
9 楼
llydd [专家分:200] 发布于 2006-05-19 22:14:00
还有一点就是在设置中断处理程序时,数据段和代码段是同一个段
为什么会这样?我也不太清楚,不晓的说错没有
10 楼
pqf [专家分:0] 发布于 2006-05-19 22:15:00
呵呵,高手谈不上哦,你说的我明白了,但是不能直接将08h放到al中啊,因为中断类型号08h 乘以四后得到中断矢量表的地址指针是0020h.矢量号要乘以四才能得到中断矢量表的地址,然后把中断矢量表(4*8)d地址开始的两个低字节单元内容装入dx,(即,mov dx,0040h)再把两个高字节单元内容装入cs(mov ax,0020h
mov ds,ax)
我来回复