系统中一故障源存在瞬时故障和永久故障两种可能。当故障发生时,CPU响应中断请求转入中断服务程序。首先采用延时1秒的方法判断是哪种故障(调用自行编写的延时子程序DELAY,紧接着检查故障是否还在。在即永久故障,否则瞬时故障),若为瞬时故障不做任何处理直接返回,否则置FAULT字节单元为全1。故障源寄存器AL(用输入指令IN AL, 20H,其中20H为故障源端口地址)最高位(第7位)为故障记录位,该位为1表明故障发生。 要求编写完成上述故障判断的中断服务程序完整代码
时间: 2024-02-05 12:11:46 浏览: 223
一种面向瞬时故障的容错技术的形式化方法
以下是中断服务程序的完整代码:
```assembly
ORG 0
JMP START ;跳转到主程序
ORG 20H ;故障源端口地址
DB 0 ;故障源寄存器AL
START:
MOV AX, @DATA ;将数据段地址存入AX
MOV DS, AX ;将DS寄存器存入AX
MOV AH, 35H ;设置中断向量为35H
MOV AL, 0 ;将中断类型存入AL
MOV DX, OFFSET INT21H ;将中断服务程序的偏移地址存入DX
INT 21H ;设置中断向量
MOV AH, 25H ;允许中断
MOV AL, 20H ;将中断号存入AL
INT 21H ;设置中断属性
MOV AH, 4CH ;结束程序
INT 21H
INT21H:
PUSH AX ;保存AX寄存器
CALL DELAY ;调用延时子程序
IN AL, 20H ;读取故障源寄存器AL
TEST AL, 80H ;检查最高位是否为1
JZ NOFAULT ;如果最高位不为1,跳转到NOFAULT
MOV BYTE PTR FAULT, 0FFH ;如果最高位为1,将FAULT字节单元置为全1
NOFAULT:
POP AX ;恢复AX寄存器
IRET ;中断返回
DELAY:
PUSH CX ;保存CX寄存器
MOV CX, 0FFFFH ;设置循环次数
L1:
LOOP L1 ;循环延时
POP CX ;恢复CX寄存器
RET ;返回
FAULT DB 0 ;故障记录位
```
在主程序中,我们需要定义数据段(使用`@DATA`伪指令将数据段地址保存到AX寄存器中,再将其存入DS寄存器中),并设置中断向量(使用`INT 21H`调用中断服务程序,并使用`INT 21H`设置中断属性)。然后,我们使用`INT 21H`结束程序。
在中断服务程序中,我们首先保存AX寄存器,然后调用延时子程序。接着,我们读取故障源寄存器AL并检查最高位是否为1。如果最高位为1,将FAULT字节单元置为全1,表示故障已经发生。最后,我们恢复AX寄存器并使用`IRET`指令返回。在延时子程序中,我们使用循环进行延时。
在代码的最后,我们定义了FAULT字节单元,用于记录故障是否发生。
阅读全文