系统中一故障源存在瞬时故障和永久故障两种可能。当故障发生时,CPU响应中断请求转入中断服务程序。首先采用延时1秒的方法判断是哪种故障(调用自行编写的延时子程序DELAY,紧接着检查故障是否还在。在即永久故障,否则瞬时故障),若为瞬时故障不做任何处理直接返回,否则置FAULT字节单元为全1。故障源寄存器AL(用输入指令IN AL, 20H,其中20H为故障源端口地址)最高位(第7位)为故障记录位,该位为1表明故障发生。 要求用emu8086编写完成上述故障判断的中断服务程序完整代码
时间: 2024-02-05 13:12:23 浏览: 26
下面是中断服务程序的完整代码:
```
ORG 0
JMP START
; 中断向量表
DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
DW ISR
START:
MOV AX, @DATA
MOV DS, AX
MOV AH, 35H ; 设置中断向量表
MOV AL, 80H ; 中断号为80H
MOV DX, OFFSET ISR ; ISR的入口地址
INT 21H
MOV AL, 20H ; 将故障源端口地址存入AL中
IN AL, AL ; 读取故障源寄存器AL的值
MOV BL, 80H ; 将BL设为10000000,即最高位为1
AND AL, BL ; 将AL的最高位与BL进行与运算
JZ NO_FAULT ; 如果最高位不为1,则说明没有故障,直接返回
CALL DELAY ; 调用延时子程序DELAY
IN AL, AL ; 再次读取故障源寄存器AL的值
AND AL, BL ; 将AL的最高位与BL进行与运算
JZ NO_FAULT ; 如果最高位不为1,则说明是瞬时故障,直接返回
MOV BYTE PTR FAULT, 255 ; 否则是永久故障,将FAULT字节单元置为全1
NO_FAULT:
IRET ; 中断服务程序结束,返回到主程序
; 延时子程序
DELAY PROC NEAR
PUSH AX
PUSH BX
MOV CX, 1000
L1: LOOP L1
POP BX
POP AX
RET
DELAY ENDP
ISR PROC
PUSH AX
PUSH BX
MOV AL, 20H
OUT 20H, AL
MOV AL, 0
OUT 20H, AL
POP BX
POP AX
IRET
ISR ENDP
FAULT DB 0 ; 定义FAULT字节单元,用于存储故障记录位
```
需要注意的几点:
1. 在定义中断向量表后,需要将程序的起始地址设置为START,否则中断服务程序无法被正确调用。
2. 在中断服务程序中,首先需要将中断控制器(8259A)的OCW1端口写入20H,才能继续执行读取故障源寄存器AL的操作。
3. 在DELAY子程序中,采用了简单的循环延时方式。实际上,延时时间可能会因为CPU的不同而有所差异。