修改int 13h的中断向量后如何返回

wsnake 2007-04-23 09:34:15
我在汇编程序中将int 13h的中断向量修改后,在执行了新的中断程序后,如何让程序返回原来的中断向量继续执行?
...全文
436 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
paullbm 2007-04-24
  • 打赏
  • 举报
回复
;將7C00開始的512B內容移到0600處
;即將7C00開始處512B內容備份
;可將此段代碼放至‘;保存原来的13h中断向量’處
xor ax,ax
mov ds,ax
mov es,ax
mov si,7c00h
mov di,600h
mov cx,200h
cld
rep movsb

;將7C00開始處512B內容還原
;可將此段代碼放至mov ax,4ch指令之前
xor ax,ax
mov ds,ax
mov es,ax
mov di,7c00h
mov si,600h
mov cx,200h
cld
rep movsb
paullbm 2007-04-23
  • 打赏
  • 举报
回复
哦。上述的13改为13h
paullbm 2007-04-23
  • 打赏
  • 举报
回复
mov ax,0
mov es,ax

push es:[13*4]

pop es:[200h]

push es:[13*4+2]

pop es:[202h] ;保存原中断向量在200h处的双字单元中

cli ;屏蔽中断

mov word ptr es:[13*4],204h

mov word ptr es:[13*4+2],0 ;设置自定义的中断向量

sti ;允许中断


;要还原原中断向量时就去取200h处的双字内存单元
;举了个例子,你自己参考一下。注意存放中断向量的内存单元!!
paullbm 2007-04-23
  • 打赏
  • 举报
回复
如果在 ;读取0柱面0磁道2扇区的内容到7C00h
的那一段代码中将mov dx,0080h换成mov dx,0
也就是读取软盘(最好是一个DOS启动盘)效果更明显!!!
记得读软盘时要插入进去哦!!
paullbm 2007-04-23
  • 打赏
  • 举报
回复
帮你改了下程序,如下:

stack segment
db 128 dup(0)
stack ends

code segment
assume cs:code,ss:stack
start: mov ax,stack
mov ss,ax
mov sp,128 ;设置堆栈

;为安装自定义中断例程做准备
mov ax,cs
mov ds,ax
mov ax,0
mov es,ax

;设置串传送的源地址、目的地址及长度及方向(为正)
mov si,offset int13h
mov di,204h
mov cx,offset int13hend-offset int13h
cld
rep movsb

;保存原来的13h中断向量
push es:[13h*4]
pop es:[200h]
push es:[13h*4+2]
pop es:[202h]

cli
;设置自定义13h中断向量
mov word ptr es:[13h*4],204h
mov word ptr es:[13h*4+2],0
sti

;读取0柱面0磁道2扇区的内容到7C00h
mov ax,0201h
mov cx,0002h
mov dx,0080h
xor bx,bx
mov es,bx
mov bx,7c00h ;es:bx==0:7c00
int 13h ;调用自定义13h中断

mov ah,4ch
int 21h


int13h: 自定义13h中断
push cx
push dx
pushf
cmp ch,0 ;是否在0道
jnz int13ret
cmp dh,0 ;是否在0面
jnz int13ret
cmp cl,2 ;是否在起始扇区号为2的扇区处
jnz int13ret
cmp ah,2 ;是否是读操作
jnz int13ret
call dword ptr cs:[200h] ;调用原始的13h中断(原始中断自带返回)
int13ret:
pop dx
pop cx
iret ;返回
int13hend:
nop


code ends
end start



==================说明:
程序运行时会出现一个提示“应用程序已试着直接访问硬盘”提示对话框,点“忽略”即可!
读取的内容自己可以去DEBUG查看!!!
wsnake 2007-04-23
  • 打赏
  • 举报
回复
code segment
assume cs:code
start:
;初始化代码
xor ax,ax
mov ss,ax
mov sp,7c00h
mov es,ax
mov ds,ax
;;;;;;;;;;;;;;;;;;;
sti
cld
;将7C00开始的内容移到0600处
mov si,7c00h
mov di,0600h
mov cx,0200h
repz movsb

;执行Startload
xor ax,ax
push ax
mov ax,offset startload+0600h
push ax
retf
;;;;;;;;;;;;;;;;;;;

startload:
;读取0柱面0磁道2扇区的内容到7C00
mov ax,0201h
mov cx,0002h
mov dx,0080h
mov bx,0000h
mov es,bx
mov bx,7c00h
int 13h

;抢先截获int 13h的中断向量地址,放到07fah和07fch中
mov ax,ds:[004ch]
mov ds:[07fah],ax
mov ax,ds:[004eh]
mov ds:[07fch],ax

;计算新的中断向量地址,并改写int 13h的中断向量地址
mov ax,ds:[0413h]
dec ax
mov ds:[0413h],ax
mov cl,06h
shl ax,cl
mov es,ax

xor ax,ax
mov ds,ax
mov si,offset exchange+0600h
mov di,0000h
mov cx,0050h
repz movsb

mov ax,0000h
mov ds:[004ch],ax
mov ax,es
mov ds:[004eh],ax

;返回7c00处继续执行
xor ax,ax
push ax
mov ax,7c00h
push ax
retf

exchange:
;自己的中断处理程序,判断是否读0柱面0磁道1扇区,如果是,则读0柱面0磁道2扇区
pushf
cmp dx,0080h
jnz A0167
cmp cx,+01h
jnz A0167
mov cx,0002h
A0167 : popf

;跳转执行旧的int 13h程序
push ds:[07fah]
push ds:[07fch]
retf

code ends
end start
paullbm 2007-04-23
  • 打赏
  • 举报
回复
不加注釋沒時間看!!
wsnake 2007-04-23
  • 打赏
  • 举报
回复
code segment
assume cs:code
start:
xor ax,ax
mov ss,ax
mov sp,7c00h
mov es,ax
mov ds,ax
;;;;;;;;;;;;;;;;;;;
sti
cld
mov si,7c00h
mov di,0600h
mov cx,0200h
repz movsb

xor ax,ax
push ax
mov ax,offset startload+0600h
push ax
retf
;;;;;;;;;;;;;;;;;;;

startload:
mov ax,0201h
mov cx,0002h
mov dx,0080h
mov bx,0000h
mov es,bx
mov bx,7c00h
int 13h

mov ax,ds:[004ch]
mov ds:[03fah],ax
mov ax,ds:[004eh]
mov ds:[03fch],ax

mov ax,ds:[0413h]
dec ax
mov ds:[0413h],ax
mov cl,06h
shl ax,cl
mov es,ax

xor ax,ax
mov ds,ax
mov si,offset exchange+0600h
mov di,0000h
mov cx,0050h
repz movsb

mov ax,0000h
mov ds:[004ch],ax
mov ax,es
mov ds:[004eh],ax

;mov ax,0301h
;mov cx,0001h
;mov dx,0080h
;mov bx,0000h
;mov es,bx
;mov bx,7c00h
;int 13h
;;;;;;;;;;;;;;;;;;;

;MOV SI,BP
;DB 0EAH,0,7CH,0,0 ;JMP 0000:7C00h
;mov cx,0001h
xor ax,ax
push ax
mov ax,7c00h
push ax
retf

exchange:
pushf
cmp dx,0080h
jnz A0167
cmp cx,+01h
jnz A0167
mov cx,0002h
A0167 : popf

push ds:[03fah]
push ds:[03fch]
retf

code ends
end start
paullbm 2007-04-23
  • 打赏
  • 举报
回复
建議你把全部代碼貼出來,并且記得加注釋。。。
wsnake 2007-04-23
  • 打赏
  • 举报
回复
这是我的程序,帮忙看一下那里不对,执行后没有效果,好像没有返回到原来的中断向量的地址。
mov ax,ds:[004ch]
mov ds:[03fah],ax
mov ax,ds:[004eh]
mov ds:[03fch],ax

mov ax,ds:[0413h]
dec ax
mov ds:[0413h],ax
mov cl,06h
shl ax,cl
mov es,ax

xor ax,ax
mov ds,ax
mov si,offset exchange+0600h
mov di,0000h
mov cx,0050h
repz movsb

mov ax,0000h
mov ds:[004ch],ax
mov ax,es
mov ds:[004eh],ax

;mov ax,0301h
;mov cx,0001h
;mov dx,0080h
;mov bx,0000h
;mov es,bx
;mov bx,7c00h
;int 13h
;;;;;;;;;;;;;;;;;;;

;MOV SI,BP
;DB 0EAH,0,7CH,0,0 ;JMP 0000:7C00h
;mov cx,0001h
xor ax,ax
push ax
mov ax,7c00h
push ax
retf

exchange:
cli
pushf
cmp dx,0080h
jnz A0167
cmp ax,0201h
jnz A0167
cmp cx,+01h
jnz A0167
mov cx,0002h
A0167 : popf
sti

push ds:[03fah]
push ds:[03fch]
retf
paullbm 2007-04-23
  • 打赏
  • 举报
回复
你在修改int 13h的中断向量時應該先將它的入口地址保存起來(最好是保存至堆棧中),在程序使用完自己所修改的13號中斷後。再將先前本身的13號中斷的入口地址恢復就OK了!
  • 打赏
  • 举报
回复
startload:
;读取0柱面0磁道2扇区的内容到7C00
mov ax,0201h
mov cx,0002h
mov dx,0080h
mov bx,0000h
mov es,bx
mov bx,7c00h
int 13h
这儿都把0000:7c00覆盖了,还怎么返回呀?:)
wsnake 2007-04-23
  • 打赏
  • 举报
回复
修改没有问题,主要是修改以后返回时的问题

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧