【汇编语言】中断

中断的定义就不再叙述了,自行百度

中断向量号:

中断向量:

中断向量表:

中断服务程序:

sti,cli的作用以及什么时候用?

中断的过程,到底干了什么事?

(理解)中断向量的存放的内存地址在哪里、中断向量的值、中断向量值的含义。

中断向量存放在地址为0000:0000h~0000:03ffh的内存空间中。

中断向量号为n,则中断向量就存放在地址为0000:4n,0000:4n+1,0000:4n+2,0000:4n+3中。
中断向量就是cs:ip的值,
中断向量号为n,则中断向量的ip = 0000:[4n],cs = 0000:[4n+2]

每个中断都有自己的作用,所以要明确int n的作用就好了。

mov dl,'?'
mov ah 02h
int 21h

ah设置参数,不同的参数,执行int 21h有不同的作用,如01h,09h,0Ah
int 21h中断向量号是21h
该中断的作用是将dl中ASCLL码对应的字符输出到屏幕中

mov al,1ch
mov ah,35h
int 21h

该向量的功能是:将al对应的中断向量号送至es:bx中

内部中断服务程序:

修改中断服务程序
在向量表里找到你想修改的向量的入口地址
改成你程序的地址

①获取原来中断向量号n的对应的中断向量的值,并保存

第一种方法:

 INTNO EQU 1CH	;设中断向量号为1CH
 DATA SEGMENT
 OLDISR DW ?,?
 DATA ENDS
 ;代码段
 MOV AL, INTNO
 MOV AH,35H
 INT 21H
 ;ES:BX
 MOV OLDISR[0], BX
 MOV AX,ES
 MOV OLDISR[2], AX

第二种方法:

INTNO EQU 1CH	;设中断向量号为1CH
 DATA SEGMENT
 OLDISR DW ?,?
 DATA ENDS
 ;代码段
 MOV AX,0
 MOV ES,AX
 CLI
 MOV AX, ES:[INTNO*4]
 MOV OLDISR[0],AX
 MOV AX,ES:[INTNO*4+2]
 MOV OLDISR[2], AX
 STI

②将你写好的子程序的段地址:偏移地址赋值给原中断向量

③调用新中断向量,int n

④将现在中断向量的值修改为刚开始保存原中断向量的值。

int 1ch作用:每秒18.2次时钟中断所调用的子程序,没修改之前,它只有iret这样一句。

理解下面两个程序,中断就学会了!。

    INTNO EQU 1CH
    USEINT = 0

    DATA SEGMENT
      STRING DB '  1CH IS HOOKED!',0DH,0AH,'$'
      OLDISR DW ?,?
      TIMER DB 0
    DATA ENDS
    
    CODE SEGMENT
      ASSUME CS:CODE,DS:DATA
START:
      MOV AX,DATA
      MOV DS,AX
      
      MOV AX,0
      MOV ES,AX
      
      ;PROTECT
    IF USEINT
      MOV AL, INTNO
      MOV AH,35H
      INT 21H
      ;ES:BX
      MOV OLDISR[0], BX
      MOV AX,ES
      MOV OLDISR[2], AX
    ELSE  
      CLI
      MOV AX, ES:[INTNO*4]
      MOV OLDISR[0],AX
      MOV AX,ES:[INTNO*4+2]
      MOV OLDISR[2], AX
      STI
    ENDIF
    
      ;SET NEW ISR
    IF USEINT
      PUSH DS
      MOV AX, SEG ISR
      MOV DS,AX
      MOV DX, OFFSET ISR
      MOV AL, INTNO
      MOV AH, 25H
      INT 21H
      POP DS
    ELSE  
      CLI
      MOV WORD PTR ES:[INTNO*4], OFFSET ISR
      MOV WORD PTR ES:[INTNO*4+2],SEG ISR
      STI
    ENDIF

    ;COUNT HERE
AGAIN:
      CMP TIMER, 10
      JAE EXIT
      JMP AGAIN      

EXIT:     
    ;RESTORE
   IF USEINT
      PUSH DS
      MOV DX,OLDISR[0]
      MOV AX,OLDISR[2]
      MOV DS,AX
      MOV AL, INTNO
      MOV AH, 25H
      INT 21H
      POP DS
    ELSE  
      CLI
      MOV AX,OLDISR[0]
      MOV ES:[INTNO*4],AX
      MOV AX,OLDISR[2]
      MOV ES:[INTNO*4+2],AX
      STI
    ENDIF
        
      MOV AX,4C00H
      INT 21H
      
ISR PROC FAR
        PUSH DX
        PUSH AX
        
        MOV AX,DATA
        MOV DS,AX

        STI               ;便于中断嵌套

        MOV AH,2
        MOV DL,TIMER
        ADD DL,30H
        INT 21H
        LEA DX,STRING
        MOV AH,9
        INT 21H

        INC TIMER
        
DONE:
        PUSHF
        CALL DWORD PTR OLDISR

        CLI
        POP AX
        POP DX
        IRET             ;中断返回
ISR ENDP


CODE ENDS
      END START

    INTNO EQU 1CH
    USEINT = 1

    DATA SEGMENT
      OLDISR DW ?,?
      TIMER DB 100
      COUNTER DW 30
      ISDONE DB 0
    DATA ENDS
    
    CODE SEGMENT
      ASSUME CS:CODE,DS:DATA
START:
      MOV AX,DATA
      MOV DS,AX
      
      MOV AX,0
      MOV ES,AX
      
      ;PROTECT
    IF USEINT
      MOV AL, INTNO
      MOV AH,35H
      INT 21H
      ;ES:BX
      MOV OLDISR[0], BX
      MOV AX,ES
      MOV OLDISR[2], AX
    ELSE  
      CLI
      MOV AX, ES:[INTNO*4]
      MOV OLDISR[0],AX
      MOV AX,ES:[INTNO*4+2]
      MOV OLDISR[2], AX
      STI
    ENDIF
    
      ;SET NEW ISR
    IF USEINT
      PUSH DS
      MOV AX, SEG ISR
      MOV DS,AX
      MOV DX, OFFSET ISR
      MOV AL, INTNO
      MOV AH, 25H
      INT 21H
      POP DS
    ELSE  
      CLI
      MOV WORD PTR ES:[INTNO*4], OFFSET ISR
      MOV WORD PTR ES:[INTNO*4+2],SEG ISR
      STI
    ENDIF

    ;WAIT HERE
WAITHERE:
    CMP ISDONE,1
    JNZ WAITHERE
  
  
EXIT:     
    ;RESTORE
   IF USEINT
      PUSH DS
      MOV DX,OLDISR[0]
      MOV AX,OLDISR[2]
      MOV DS,AX
      MOV AL, INTNO
      MOV AH, 25H
      INT 21H
      POP DS
    ELSE  
      CLI
      MOV AX,OLDISR[0]
      MOV ES:[INTNO*4],AX
      MOV AX,OLDISR[2]
      MOV ES:[INTNO*4+2],AX
      STI
    ENDIF
        
      MOV AX,4C00H
      INT 21H
      
ISR PROC FAR
        PUSH DX
        PUSH AX
        
        MOV AX,DATA
        MOV DS,AX

        STI               ;便于中断嵌套

       ;COUNT HERE
        INC TIMER
AGAIN:
        CMP TIMER, 1000/55  ;18
        JB DONE
        MOV TIMER,0


        ;carriage
        MOV AH,2
        MOV DL,13
        INT 21H

        ;print time
        MOV AX,COUNTER

        MOV DL,10
        DIV DL
        MOV DH,AH
        MOV DL,AL
        MOV AH,2
        ADD DL,30H
        INT 21H
        MOV DL,DH
        ADD DL,30H
        INT 21H
        
        DEC COUNTER
        JGE DONE
        MOV ISDONE,1
        
DONE:
        PUSHF
        CALL DWORD PTR OLDISR

        CLI
        POP AX
        POP DX
        IRET             ;中断返回
ISR ENDP


CODE ENDS
      END START

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值