📄 interrupt2.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 + -