单步中断在学习基本的8086指令和程序设计时基本很少被提及,以至于很多人对其都不太了解。
本博文简单介绍少单步中断的执行过程以及用途。
调用单步中断一般是设置标志寄存器的内容,使得TF=1,则会在下一条指令执行完成后进入单步
中断服务程序。单步中断的服务程序与其他中断服务程序没有区别。程序员可以设置其中想写的
内容。如果TF=1一直没有被清零,那么以后一直会单步执行程序,也就是说每执行一条指令后就
进入单步服务程序,直至程序执行完毕。
这里也提下,为什么在进行中断响应时会使TF=0?
看下单步中断响应过程,硬件自动完成:
1、标志寄存器FLAGS进栈
2、置IF=0,TF=0
3、返回地址(CS:IP)进栈
4、根据中断号n,从地址0:n*4取出4字节的中断向量
5、转去执行中断服务程序
硬件自动完成的过程中,不希望有单步中断,否则可能会使得不能正常执行中断服务程序!
提供一个改写1号中断的中断服务程序。执行完后,屏幕显示4个Y
initint equ 1h
data segment
addr dw ?,?
data ends
sseg segment stack
dw 512 dup (?)
sseg ends
code segment
assume cs:code,ds:data,ss:sseg
start:
mov ax,data
mov ds,ax
mov ax,sseg
mov ss,ax
mov ax,0
mov es,ax
;保存1h中断的原始地址
mov ax,es:[initint*4]
mov addr,ax
mov ax,es:[initint*4+2]
mov addr[2],ax
;加入新中断服务程序地址
cli
lea ax,isr
mov es:[initint*4],ax
mov ax,seg isr
mov es:[initint*4+2],ax
sti
pushf
mov bp,sp
or word ptr [bp],0100h ;TF置1
popf
mov ax,0
mov bx,0
;恢复原中断地址
exit:
cli
mov ax,addr
mov es:[initint*4],ax
mov ax,addr[2]
mov es:[initint*4+2],ax
sti
mov ah,4ch
int 21h
isr proc far
push ax
push dx
mov ah,2
mov dl,'Y'
int 21h
pop dx
pop ax
iret
isr endp
code ends
end start
614



被折叠的 条评论
为什么被折叠?



