8259中断实验的关键代码片段
时间: 2024-11-13 12:26:29 浏览: 40
以下是8259中断实验的关键代码片段:
### 初始化8259芯片
```assembly
START0:
CLD ; 设置方向标志为递增
CALL BUF1 ; 写显示缓冲初值
CALL WRINTVER ; 写中断向量
MOV AL, 13H ; ICW1: 边沿触发,单片模式,需要ICW4
MOV DX, INTPORT1
OUT DX, AL
MOV AL, 08H ; ICW2: 中断向量基址08H
MOV DX, INTPORT2
OUT DX, AL
MOV AL, 09H ; ICW4: 非缓冲模式,正常EOI,8086模式
OUT DX, AL
MOV AL, 0F7H ; OCW1: 允许所有中断
OUT DX, AL
MOV intcnt, 01H ; 中断计数初值
STI ; 开中断
```
### 主循环
```assembly
WATING:
CALL DISP ; 显示 "8259-1"
JMP WATING ; 循环显示
```
### 写中断向量
```assembly
WRINTVER:
MOV AX, 0H
MOV ES, AX
MOV DI, 002CH ; IR3中断向量地址
LEA AX, INTQ3 ; IR3中断服务地址
STOSW ; 写中断服务地址偏移量
MOV AX, 0000h ; 写中断服务段地址
STOSW
MOV DI, 003CH ; IR7中断向量地址
LEA AX, INTQ7 ; IR7中断服务地址
STOSW ; 写中断服务地址偏移量
MOV AX, 0000h ; 写中断服务段地址
STOSW
RET
```
### IR3中断服务例程
```assembly
INTREEUP3:
CLI ; 关中断
PUSH AX ; 压栈保护现场
PUSH BX
PUSH CX
PUSH DX
MOV AL, INTCNT ; 获取当前中断计数值
CALL CONVERS ; 将中断计数值转换为显示字符
MOV BX, OFFSET BUF ; 077BH
MOV AL, 10H
MOV CX, 05H
INTRE0:
MOV [BX], AL ; 高五位缓冲区送熄灭码
INC BX
LOOP INTRE0
MOV AL, 20H ; 中断返回码
MOV DX, INTPORT1
OUT DX, AL
ADD INTCNT, 01H
CMP INTCNT, 06H
JNA INTRE2 ; 中断次数小于5次继续
CALL BUF2 ; 中断次数结束,显示 "good"
CALL DISP
INTRE1:
CALL DISP
JMP INTRE1
```
### 显示子程序
```assembly
DISP:
MOV AL, 0FFH ; 5ms
MOV DX, PA
OUT DX, AL
MOV CL, 0DFH ; 20H
MOV BX, OFFSET BUF
DIS1:
MOV AL, [BX]
MOV AH, 00H
PUSH BX
MOV BX, OFFSET DATA1
ADD BX, AX
MOV AL, [BX]
POP BX
MOV DX, PB
OUT DX, AL
MOV AL, CL
MOV DX, PA
OUT DX, AL
PUSH CX
DIS2:
MOV CX, 00A0H
LOOP $
POP CX
CMP CL, 0FEH ; 01H
JZ LX1
INC BX
ROR CL, 1 ; SHR CL, 1
JMP DIS1
LX1:
MOV AL, 0FFH
MOV DX, PB
OUT DX, AL
RET
```
这些代码片段展示了如何初始化8259中断控制器、设置中断向量、处理中断请求以及显示相关信息。
阅读全文