![]() |
#2
gyx25459652007-12-08 13:52
一个从子程序程序进,中断出的程序
DATAS SEGMENT
tmp 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好像卡死一样,什么反应也没有了 |
如题,为什么我用cli不能禁止时间中断呢?