?? 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 + -