这是个红绿灯模拟里面的中断程序。我把它的主程序设为空程序了。没了绿色字体的部分,中断程序作为主程序运行时正常,但作为中断总是数码管显示残缺。本来四个数码管显示器,有三个显示就不错了。是不是因为没有什么中断现场保护??不懂
DAT SEGMENT;
TABLE DB 00H,67H, 7FH, 07H, 7DH, 6DH, 66H, 4FH, 5BH,06H,3FH;9876543210
DAT ENDS
STACK SEGMENT 'STACK'
STA DB 1000 DUP(?)
PP EQU LENGTH STA
STACK ENDS
CODE SEGMENT ;PUBLIC 'CODE'
ASSUME CS:CODE, DS:DAT ,SS:STACK
START:
MOV AX,DAT
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV AX, PP
MOV SP, AX ;设置SP值
PUSH DS
MOV AX,0
MOV DS,AX
MOV AX,CODE
MOV CL,4
SHL AX,CL
ADD AX,OFFSET IRQ0
MOV SI,80H
MOV [SI],AX
MOV AX,0
MOV [SI+2],AX
POP DS
MOV DX,8020H ; 8259地址
MOV AL,00010011B ; 单片8259, 上升沿中断, 要写ICW4
OUT DX,AL
MOV DX,8022H
MOV AL,20H ; 中断号为20H
OUT DX,AL
MOV AL,01H ; 工作在8086/88 方式
OUT DX,AL
IN AL,DX
AND AL,0FEH
OUT DX,AL
MOV DX,8006H ;8255控制
MOV AL,80H ;模式设置
OUT DX,AL
MOV DX,8016H
OUT DX,AL
MOV BL,0
LP: STI ;开中断
NOP
JMP LP
IRQ0:
CLI
MOV AL,80H
MOV DX,8006H
OUT DX,AL
MOV DX,8016H
OUT DX,AL;两个芯片方式字设置
SSET1:LEADI,TABLE+7;读取3的地址
SSET2:MOV BP,DI;读取3的地址
SSET3:LEADI,TABLE+5;读取5的地址
SSET4:LEABX,TABLE+6;读取4的地址
SSET5:LEA SI,TABLE+10;读取0的地址
TTW:
MOV AL,[BP]
MOV DX,8012H
OUT DX,AL;高位初始化为3
MOV AL,[DI]
MOV DX,8002H
OUT DX,AL;高位初始化为5
L1W:MOV AL,[BX]
MOV DX,8004H
OUT DX,AL
CMP AL,3FH;判断移位
JE KK1W
B1W:MOV AL,[SI]
MOV DX,8014H
OUT DX,AL
CMP AL,3FH;判断移位
JE KK2W
B2W:INC BX;
INC SI
MOV DX,60000
LOPW:NOP
NOP
NOP
DEC DX
JNZ LOPW
MOV AL,[SI]
CMP AL,3FH
JE CHANGEW;交换循环判断1
JMPTTW
KK1W:INC DI
MOV AL,[DI]
CMP AL,3FH
JE SS1W
PP1W:LEA BX,TABLE
JMP B1W
KK2W:INC BP
MOV AL,[BP]
CMP AL,3FH
JE SS2W;低位为0时调整低位起始值地址和高位地址
PP2W:LEA SI,TABLE
JMP B2W
SS1W:LEA DI,TABLE
JMP PP1W
SS2W:LEA BP,TABLE
JMPPP2W;只有个位数值时高位不显示0
MOVDX,8020H;
MOVAL,20H
OUTDX,AL
STI
IRET
CHANGEW:
CMP BP,0000H
JMP TTW
CODE ENDS
END START
这是个红绿灯模拟里面的中断程序。我把它的主程序设为空程序了。没了绿色字体的部分,中断程序作为主程序运行时正常,但作为中断总是数码管显示残缺。本来四个数码管显示器,有三个显示就不错了。是不是因为没有什么中断现场保护??不懂
|