⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interrupt2.txt

📁 中断处理说明
💻 TXT
字号:
mode    equ   82h          ; 8255 工作方式port a方式0输出,port b方式0输入
PA8255  equ   8000h        ; 8255 PA口输出地址
CTL8255 equ   8003h

ICW1    equ   00010011b     ; 单片8259, 上升沿中断, 要写ICW4
ICW2    equ   00100000b     ; 中断号为20H
ICW21   equ   00100001b     ; 中断号为21H
ICW4    equ   00000001b     ; 工作在8086/88 方式
OCW1    equ   11111101b     ; 只响应INT1 中断
OCW11   equ   11111100b     ; 响应INT0、INT1中断
CS8259A equ   09000h        ; 8259地址只有两个
CS8259B equ   09001h

data   segment
CNT     db    1
RCNT    db    0
data   ends

code   segment
       assume cs:code, ds: data

IEnter0 proc  near     
       push  ax              ;入栈保护数据
       push  dx

       
       inc cx
       cmp cx,1000
       JNZ cycle0       ;cx是1000则zf=1不转移,不是1000转移
       inc RCNT
       mov cx,0
       mov   al, RCNT
       out   dx, al          ; 输出计数值

cycle0:
       mov   dx, CS8259A
       mov   al, 20h         ; 中断服务程序结束指令
       out   dx, al

       pop   dx
       pop   ax
       iret
IEnter0 endp

IEnter1 proc  near
       push  ax
       push  dx

       add CNT,0
       JNP cycle1     ;奇时跳转
       mov al,OCW1
       jmp cycle2
cycle1:
       mov al,OCW11
cycle2:
       mov   dx, CS8259B
       out   dx, al

    
       mov   dx, CS8259A
       mov   al, 20h         ; 中断服务程序结束指令
       out   dx, al
       not   CNT             
       inc   CNT             ;改变上次操作
       
       pop   dx
       pop   ax
       iret
IEnter1 endp

IInit  proc
       mov   dx, CS8259A
       mov   al, ICW1
       out   dx, al

       mov   dx, CS8259B
       mov   al, ICW2
       out   dx, al

       mov   al, ICW4
       out   dx, al

       mov   al, OCW1     ;开始时只响应中断int1
       out   dx, al
       ret
IInit  endp

start  proc  near
       mov   dx, CTL8255    
       mov   al, mode
       out   dx, al

       cli                       ;关中断允许
       push  ds                   ;设置中断向量
       mov   ax, 0
       mov   ds, ax
       mov   bx, 4*ICW21         ; 中断号
;直接写入法
mov word ptr [bx], offset IEnter ;写入偏移地址
mov word ptr [bx], seg    IEnter ;写入段基址


       mov   ax, code                 

 
       shl   ax, 4               ; x 16
       add   ax, offset IEnter1   ; 中断入口1地址(段地址为0)
       mov   [bx], ax

       mov   bx, 4*ICW2          ; 中断号

       mov   ax, code
       shl   ax, 4               ; x 16
       add   ax, offset IEnter0   ; 中断入口0地址(段地址为0)
       mov   [bx], ax

       mov   ax, 0
       inc   bx
       inc   bx
       mov   [bx], ax            ; 代码段地址为0

       call  IInit

       mov   ax, data             ;数据段初始化
       mov   ds, ax
       mov   RCNT, 0              ; 计数值初始为0
       mov   al, RCNT
       mov   dx, PA8255
       out   dx, al
       sti
LP:                              ; 等待中断,并计数。
       nop
       jmp   LP

start  endp

code   ends

       end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -