请问如何禁止中断?
如题,为什么我用cli不能禁止时间中断呢?
一个从子程序程序进,中断出的程序
DATAS SEGMENTtmp dw 0
DATAS ENDS
STACKS SEGMENT
dw 50 dup(?)
smain dw ?
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
mov ax,stacks
mov ss,ax
mov sp,smain ;堆栈顶指向smain
mov ah,35h ;获得原来旧的时钟中断向量
mov al,1ch
int 21h
push es ;进嶘保护
push bx
cli ;屏蔽中断
push ds
mov dx,offset ppp ;设置新的时钟中断向量
mov ax,cs
mov ds,ax
mov ah,25h
mov al,1ch
int 21h
pop ds
in al,21h ;设置掩码
and al,0feh
out 21h,al
mov ah,02 ;显示一个字符1
mov dl,'1'
int 21h
pushf ;标志和cs段进嶘,模拟中断过程
push cs
call sub2 ;调用子程序sub2, 此时应该是flag,cs,ip都进嶘了,和中断一直了!
mov ah,02 ;显示字符2,看看程序是否返回了!
mov dl,'2'
int 21h
pop dx ;恢复原来的中断向量
pop ds
mov ah,25h
mov al,1ch
int 21h
MOV AH,4CH ;返回到dos
INT 21H
ret
ppp proc near ;中断服务函数
mov ax,datas
mov ds,ax
mov ah,02 ;显示字符'y'
mov dl,'y'
int 21h
mov ax,tmp
mov sp,ax
iret
ppp endp
sub2 proc near
mov tmp,sp ;将此时的sp保存起来
mov ah,02 ;显示一个字符'g',看是否运行到了子函数
mov dl,'g'
int 21h
sti ;允许中断
jmp $ ;这里是死循环,代表sub2无法在返回主函数了,只能通过中断返回
ret
sub2 endp
CODES ENDS
end start
整个程序都能跑完,但最后dos好像卡死一样,什么反应也没有了