21,500
社区成员
发帖
与我相关
我的任务
分享STACK SEGMENT STACK
DW 64 DUP (?)
STACK ENDS
DATA SEGMENT
MESS DB 'WELCOME YOU!',0AH,0DH,'$'
LIGHT DB '87654321',0AH,0DH,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX ; 保留DATA段地址
PUSH DS
MOV AX,0000H
MOV DS,AX ; 数据段清零
MOV AX,OFFSETIRQ7 ; 取中断程序入口地址
ADD AX,2000H ; 加装载时IP=2000h地址
MOV SI,003CH ; 装8259中断7的中断失量
MOV [SI],AX ; 填偏移失量
MOV AX,0000H
MOV SI,003EH
MOV [SI],AX ; 填段地址矢量
CLI
POP DS
IN AL,21H
AND AL,7FH ; 开8259中断7
OUT 21H,AL
MOV AL,90H ; 8253控制字
OUT 43H,AL ; 8253 控制寄存器,工作在方式0,选择2号计数器,读/写低8位
MOV DX,0000H ;记录中断次数
A1: MOV AL,05H
OUT 42H,AL ; 8253 2#计数器
STI
MOV AH,06H ; 使welcome you! 输出
MOV BX,OFFSET MESS
INT 10H
HLT
JMP A1
DELAY: MOV CX, 77FFH ;延迟程序
A2: PUSH AX
POP AX
LOOP A2
RET
IRQ7: CLI
MOV AL,82H ; 8255控制字
OUT 63H,AL
;显示中断的次数以及中断的顺序
INC DX
CMP DX,000AH ; 当中断第10次时,跳转到EN结束
JMP EN
MOV AX,DX
INT 10H
MOV AH,06H ; 使87654321 输出
MOV BX,OFFSET LIGHT
INT 10H
;灯亮的顺序 87654321
IN AL,FE
OUT 60H,AL
CALL DELAY
IN AL,FD
OUT 60H,AL
CALL DELAY
IN AL,FB
OUT 60H,AL
CALL DELAY
IN AL,F7
OUT 60H,AL
CALL DELAY
IN AL,EF
OUT 60H,AL
CALL DELAY
IN AL,DF
OUT 60H,AL
CALL DELAY
IN AL,BF
OUT 60H,AL
CALL DELAY
IN AL,7F
OUT 60H,AL
CALL DELAY
MOV AX,0120H
INT 10H
MOV AL,20H
OUT 20H,AL
IRET
En: MOV AX,4CH
INT 21H
CODE ENDS
END START