Skip to content

[微机实验/TD-PITE] 8259 中断优先级实验+选做实验

Published: at 16:16

ToC

实验内容

  1. 程序开始时 LEDD7-D0 全亮。
  2. 按下单脉冲开关 KK1,响应 IR6 中断请求,使绿灯(D3-D0)亮,红灯(D7-D4)灭。
  3. 按下单脉冲开关 KK2,响应 IR7 中断请求,使红灯(D7-D4)亮,绿灯(D3-D0)灭。

实验接线

LED 连接 8255B 口,KK1+ 连接 MIR6KK2+ 连接 MIR7。如下图所示:

代码

1
CODE SEGMENT
2
ASSUME CS:CODE
3
4
START:
5
MOV AX, 0
6
MOV DS, AX
7
8
;; INIT 8255
9
MOV DX, 0646H
10
MOV AL, 90H ;; 10010000B, INPUT FROM A & OUTPUT TO B
11
OUT DX, AL
12
13
;; MIR6
14
MOV AX, OFFSET MIR6 ;; PUT CS:IP TO INTERRUPT VECTOR ADDRESS
15
;; 6: 38H - 3BH
16
;; IP -> 38H
17
;; CS -> 3AH
18
MOV SI, 38H
19
MOV [SI], AX
20
MOV AX, CS
21
MOV SI, 3AH
22
MOV [SI], AX
23
24
;; MIR7
25
MOV AX, OFFSET MIR7 ;; 7: 3CH - 3FH
26
;; IP -> 3CH
27
;; CS -> 3AH
28
MOV SI, 3CH
29
MOV [SI], AX
30
MOV AX, CS
31
MOV SI, 3EH
32
MOV [SI], AX
33
34
;; --------------------------------------------------
35
;; INIT 8259
36
CLI ;; DISABLE INTERRUPT
37
MOV AL, 11H ;; ICW1 00010001B
38
;; ----A-BC
39
;; A: 1=HIGH, 0=UPPER EDGE
40
;; B: 1=SINGLE, 0=MULTIPLE
41
;; C: NEED ICW4
42
OUT 20H, AL
43
MOV AL, 08H ;; ICW2 00001000B
44
;;
45
OUT 21H, AL
46
MOV AL, 04H ;; ICW3 00000100B
47
;; -----AB-
48
;; A: 1 = INNER SUB 8259 CONNECTED TO IR2
49
;; 0 = NOT USED
50
;; B: ANY 8259 CONNECTED TO MAIN IR1
51
OUT 21H, AL
52
MOV AL, 07H ;; ICW4 00000111B
53
;; ----ABC-
54
;; A: 1 = BUFFERED
55
;; 0 = NOT BUFFERED
56
;; B: 1 = MAIN
57
;; 0 = SUB
58
;; C: 1 = AUTO INTERRUPT STOP
59
;; 0 = NOT AUTO
60
OUT 21H, AL
61
MOV AL, 2FH ;; OCW1 00101111B
62
;; M7 - M0
63
;; 0 = ALLOWED
64
;; 1 = DISABLED
65
;; IR4 IS USED TO COMMUNICATE WITH PC
66
OUT 21H, AL
67
STI ;; ALLOW INTERRUPT
68
;; --------------------------------------------------
69
70
AA1: ;; MAIN
71
MOV DX, 0642H
72
MOV AL, 0FFH
73
OUT DX, AL
74
JMP AA1
75
76
MIR6:
77
MOV DX, 0642H
78
MOV AL, 0FH ;; GREEN LIGHT
79
OUT DX, AL
80
CALL DELAY
81
IRET
82
83
MIR7:
84
MOV DX, 0642H
85
MOV AL, 0F0H
86
OUT DX, AL ;; RED LIGHT
87
CALL DELAY
88
IRET
89
90
DELAY PROC NEAR
91
MOV CX, 0FFFFH
92
LOOP $
93
MOV CX, 0FFFFH
94
LOOP $
95
MOV CX, 0FFFFH
96
LOOP $
97
MOV CX, 0FFFFH
98
LOOP $
99
RET
100
DELAY ENDP
101
102
CODE ENDS
103
END START

选做实验 1

描述

使用单脉冲开关控制 LED 的移动方向,初始状态仅点亮 D7

KK1 按下时,LED 灯向右移动;当 KK2 按下时,LED 灯向左移动;当 LED 灯移动到单侧边界时,停止移动。

分析

需要保存当前移动的状态,使得中断嵌套执行完后原中断不继续执行。

代码

1
CODE SEGMENT
2
ASSUME CS:CODE
3
4
START:
5
;; BH: MODIFIED
6
;; BL: STATUS
7
MOV BX, 0080H
8
9
;; INIT 8255
10
MOV DX, 0646H
11
MOV AL, 90H ;; 10010000B, INPUT FROM A & OUTPUT TO B
12
OUT DX, AL
13
14
;; MIR6
15
MOV AX, OFFSET MIR6 ;; PUT CS:IP TO INTERRUPT VECTOR ADDRESS
16
;; 6: 38H - 3BH
17
;; IP -> 38H
18
;; CS -> 3AH
19
MOV SI, 38H
20
MOV [SI], AX
21
MOV AX, CS
22
MOV SI, 3AH
23
MOV [SI], AX
24
25
;; MIR7
26
MOV AX, OFFSET MIR7 ;; 7: 3CH - 3FH
27
;; IP -> 3CH
28
;; CS -> 3AH
29
MOV SI, 3CH
30
MOV [SI], AX
31
MOV AX, CS
32
MOV SI, 3EH
33
MOV [SI], AX
34
35
;; --------------------------------------------------
36
;; INIT 8259
37
CLI ;; DISABLE INTERRUPT
38
MOV AL, 11H ;; ICW1 00010001B
39
;; ----A-BC
40
;; A: 1=HIGH, 0=UPPER EDGE
41
;; B: 1=SINGLE, 0=MULTIPLE
42
;; C: NEED ICW4
43
OUT 20H, AL
44
MOV AL, 08H ;; ICW2 00001000B
45
;;
46
OUT 21H, AL
47
MOV AL, 04H ;; ICW3 00000100B
48
;; -----AB-
49
;; A: 1 = INNER SUB 8259 CONNECTED TO IR2
50
;; 0 = NOT USED
51
;; B: ANY 8259 CONNECTED TO MAIN IR1
52
OUT 21H, AL
53
MOV AL, 07H ;; ICW4 00000111B
54
;; ----ABC-
55
;; A: 1 = BUFFERED
56
;; 0 = NOT BUFFERED
57
;; B: 1 = MAIN
58
;; 0 = SUB
59
;; C: 1 = AUTO INTERRUPT STOP
60
;; 0 = NOT AUTO
61
OUT 21H, AL
62
MOV AL, 2FH ;; OCW1 00101111B
63
;; M7 - M0
64
;; 0 = ALLOWED
65
;; 1 = DISABLED
66
;; IR4 IS USED TO COMMUNICATE WITH PC
67
OUT 21H, AL
68
STI ;; ALLOW INTERRUPT
69
;; --------------------------------------------------
70
71
AA1: ;; MAIN
72
MOV DX, 0642H
73
MOV AL, BL
74
OUT DX, AL
75
JMP AA1
76
77
MIR6:
78
STI
79
MOV BH, 1
80
MOV DX, 0642H
81
82
IR6_RIGHT:
83
CMP BL, 1 ;; MOST RIGHT
84
JE IR6_STOP
85
SHR BL, 1
86
MOV AL, BL
87
OUT DX, AL
88
CALL DELAY
89
CMP BH, 1 ;; CHECK WHETHER NESTED INTERRUPT HAPPENED
90
JNE IR6_STOP
91
JMP IR6_RIGHT
92
93
IR6_STOP:
94
MOV BH, 0
95
IRET
96
97
MIR7:
98
STI
99
MOV BH, 1
100
MOV DX, 0642H
101
102
IR7_LEFT:
103
CMP BL, 80H ;; MOST LEFT
104
JE IR7_STOP
105
SHL BL, 1
106
MOV AL, BL
107
OUT DX, AL
108
CALL DELAY
109
CMP BH, 1 ;; CHECK WHETHER NESTED INTERRUPT HAPPENED
110
JNE IR7_STOP
111
JMP IR7_LEFT
112
113
IR7_STOP:
114
MOV BH, 0
115
IRET
116
117
DELAY PROC NEAR
118
MOV CX, 0FFFFH
119
LOOP $
120
MOV CX, 0FFFFH
121
LOOP $
122
MOV CX, 0FFFFH
123
LOOP $
124
MOV CX, 0FFFFH
125
LOOP $
126
RET
127
DELAY ENDP
128
129
CODE ENDS
130
END START

选做实验 2

描述

在选做实验 1 的基础上,增加:

  1. 在向左移动过程中,如果要求其向右移动,则立即改变方向,向右移动。到最右侧后,向左移动到最左侧。
  2. 在向右移动中,如果要求其向左移动,不立即改变方向,等到移动到最右侧后再开始向左移动。

分析

在当前移动状态的基础上,增加是否需要向左移动的标志。在向右移动中断处理程序(MIR6)的最后,当需要向左移动时,则调用向左移动中断处理程序(MIR7)。

代码

1
CODE SEGMENT
2
ASSUME CS:CODE
3
4
START:
5
;; BH: MODIFIED
6
;; 00 = IDLE
7
;; 01 = GOING_LEFT
8
;; 10 = GOING_RIGHT
9
;; 11 = GOING_RIGHT(DEFER GO RIGHT)
10
;; BL: STATUS
11
MOV BX, 0080H
12
13
;; INIT 8255
14
MOV DX, 0646H
15
MOV AL, 90H ;; 10010000B, INPUT FROM A & OUTPUT TO B
16
OUT DX, AL
17
18
;; MIR6
19
MOV AX, OFFSET MIR6 ;; PUT CS:IP TO INTERRUPT VECTOR ADDRESS
20
;; 6: 38H - 3BH
21
;; IP -> 38H
22
;; CS -> 3AH
23
MOV SI, 38H
24
MOV [SI], AX
25
MOV AX, CS
26
MOV SI, 3AH
27
MOV [SI], AX
28
29
;; MIR7
30
MOV AX, OFFSET MIR7 ;; 7: 3CH - 3FH
31
;; IP -> 3CH
32
;; CS -> 3AH
33
MOV SI, 3CH
34
MOV [SI], AX
35
MOV AX, CS
36
MOV SI, 3EH
37
MOV [SI], AX
38
39
;; --------------------------------------------------
40
;; INIT 8259
41
CLI ;; DISABLE INTERRUPT
42
MOV AL, 11H ;; ICW1 00010001B
43
;; ----A-BC
44
;; A: 1=HIGH, 0=UPPER EDGE
45
;; B: 1=SINGLE, 0=MULTIPLE
46
;; C: NEED ICW4
47
OUT 20H, AL
48
MOV AL, 08H ;; ICW2 00001000B
49
;;
50
OUT 21H, AL
51
MOV AL, 04H ;; ICW3 00000100B
52
;; -----AB-
53
;; A: 1 = INNER SUB 8259 CONNECTED TO IR2
54
;; 0 = NOT USED
55
;; B: ANY 8259 CONNECTED TO MAIN IR1
56
OUT 21H, AL
57
MOV AL, 07H ;; ICW4 00000111B
58
;; ----ABC-
59
;; A: 1 = BUFFERED
60
;; 0 = NOT BUFFERED
61
;; B: 1 = MAIN
62
;; 0 = SUB
63
;; C: 1 = AUTO INTERRUPT STOP
64
;; 0 = NOT AUTO
65
OUT 21H, AL
66
MOV AL, 2FH ;; OCW1 00101111B
67
;; M7 - M0
68
;; 0 = ALLOWED
69
;; 1 = DISABLED
70
;; IR4 IS USED TO COMMUNICATE WITH PC
71
OUT 21H, AL
72
STI ;; ALLOW INTERRUPT
73
;; --------------------------------------------------
74
75
AA1: ;; MAIN
76
MOV DX, 0642H
77
MOV AL, BL
78
OUT DX, AL
79
JMP AA1
80
81
;; --------------------------------------------------
82
MIR6: ;; INTEND TO GO RIGHT
83
STI
84
MOV DX, 0642H
85
86
;; PRESS KK1 WHEN GOING RIGHT
87
TEST BH, 10B
88
JNZ IR6_EXIT_IRET
89
90
;; BH MUST BE 0 OR 1
91
;; BH = 0 ==> MOV BH, 10B
92
;; BH = 1 ==> MOV BH, 11B
93
OR BH, 10B
94
95
IR6_RIGHT:
96
CMP BL, 1 ;; MOST RIGHT
97
JE IR6_LEFT
98
SHR BL, 1
99
MOV AL, BL
100
OUT DX, AL
101
CALL DELAY
102
JMP IR6_RIGHT
103
104
IR6_LEFT:
105
TEST BH, 1 ;; NEED TO GO LEFT
106
JZ IR6_EXIT
107
MOV BH, 1 ;; SET MODE TO GOING_LEFT
108
JMP MIR7
109
IR6_EXIT: ;; NORMAL EXIT
110
MOV BH, 0
111
IR6_EXIT_IRET:
112
IRET
113
114
;; --------------------------------------------------
115
MIR7: ;; INTEND TO GO LEFT
116
STI
117
TEST BH, 10B ;; GOING TO RIGHT NOW
118
JNZ IR7_IRET ;; EXIT
119
MOV BH, 1
120
MOV DX, 0642H
121
122
IR7_LEFT:
123
CMP BL, 80H ;; MOST LEFT
124
JE IR7_STOP
125
SHL BL, 1
126
MOV AL, BL
127
OUT DX, AL
128
CALL DELAY
129
CMP BH, 1 ;; WHETHER TO CONTINUE GOING LEFT
130
JNE IR7_STOP
131
JMP IR7_LEFT
132
133
IR7_STOP:
134
MOV BH, 0 ;; BACK TO IDLE
135
IRET
136
IR7_IRET:
137
OR BH, 01B ;; GO TO LEFT AFTER RIGHT FINISHED
138
IRET
139
140
DELAY PROC NEAR
141
MOV CX, 0FFFFH
142
LOOP $
143
MOV CX, 0FFFFH
144
LOOP $
145
MOV CX, 0FFFFH
146
LOOP $
147
MOV CX, 0FFFFH
148
LOOP $
149
RET
150
DELAY ENDP
151
152
CODE ENDS
153
END START