学习型 ASP/PHP/ASP.NET 主机 30元/年全能 ASP/PHP/ASP.NET 主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付
发新话题
打印

请问如何禁止中断?

请问如何禁止中断?

如题,为什么我用cli不能禁止时间中断呢?

TOP

一个从子程序程序进,中断出的程序

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好像卡死一样,什么反应也没有了

TOP

自己在顶一下

TOP

时钟 是可屏蔽的吗??

TOP

帮你顶顶~林下先~

TOP

是NMI

TOP

发新话题