first commit
This commit is contained in:
BIN
Lab/Lab5/material/1.1.png
Executable file
BIN
Lab/Lab5/material/1.1.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 58 KiB |
BIN
Lab/Lab5/material/1.3.png
Executable file
BIN
Lab/Lab5/material/1.3.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 21 KiB |
BIN
Lab/Lab5/material/2.1.jpg
Executable file
BIN
Lab/Lab5/material/2.1.jpg
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 402 KiB |
229
Lab/Lab5/material/21281280_柯劲帆_第5次实验_8259中断实验.md
Executable file
229
Lab/Lab5/material/21281280_柯劲帆_第5次实验_8259中断实验.md
Executable file
@@ -0,0 +1,229 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<h1><center><strong>实验五 8259中断实验</strong></center></h1>
|
||||
|
||||
### 一、实验目的
|
||||
|
||||
该实验使学生掌握$8259$向量中断方式的硬件连接和软件编程的方法,同时使同学掌握中断和其它接口芯片配合来完成某一特定任务的方法。
|
||||
|
||||
|
||||
|
||||
### 二、实验内容
|
||||
|
||||
手动产生单脉冲作为中断请求信号连接到$\rm {MIRQ}_3$(对应中断号$\rm 0BH$)上和$\rm {SIRQ}_{10}$(对应中断号$\rm 72H$)上。每按一次开关产生一次中断,某$\rm LED$灯就亮或灭一次(上次亮,当前就灭;上次灭,当前就亮),中断$10$次后程序退出。其中,主$8259$的端口地址为$\rm 20H$,从片$8259$的端口地址为$\rm 0A0H$。
|
||||
|
||||
<img src="1.1.png" alt="1.1" style="zoom: 25%;" />
|
||||
|
||||
连线:总线$\rm {MIRQ}_x$接单脉冲$1$正脉冲,总线$\rm {SIRQ}_x$接单脉冲$2$正脉冲。
|
||||
|
||||
|
||||
|
||||
### 三、流程图
|
||||
|
||||
<img src="graph.drawio.svg" alt="graph" style="zoom: 60%;" />
|
||||
|
||||
|
||||
|
||||
### 四、实验过程与分析
|
||||
|
||||
首先连好接线,如图4-1所示。单脉冲$1$连$\rm {MIRQ}_{3}$,单脉冲$2$连$\rm {SIRQ}_{10}$,$8255$芯片连$\rm 280H$,$8255$的$\rm {PC}_0$连$\rm {LED}_7$。
|
||||
|
||||
<img src="2.1.jpg" alt="4-1" style="zoom: 20%;" />
|
||||
|
||||
<center>图4-1 硬件连接图</center>
|
||||
|
||||
按动任意的单脉冲$1/2$,就会触发中断程序,$\rm LED$就会将当前状态取反,并将触发计数加$1$。
|
||||
|
||||
主程序不断检测触发计数,当触发计数超过$10$时,退出程序。
|
||||
|
||||
因此按单脉冲$10$次之后,$\rm LED$不会再有任何变化。
|
||||
|
||||
|
||||
|
||||
### 五、实验总结
|
||||
|
||||
通过本实验,我掌握$8259$向量中断方式的硬件连接和软件编程的方法,同时掌握了中断和其它接口芯片(如$8255$芯片)配合来完成某一特定任务的方法。
|
||||
|
||||
|
||||
|
||||
### 六、思考题
|
||||
|
||||
> 如何理解采用中断方式进行实时控制,请举一些可能的应用例子。
|
||||
|
||||
如图6-1所示,当中断引脚检测到触发信号时,若中断屏蔽开放,$\rm CPU$会从当前主程序或中断服务中跳出,立即执行相应的中断服务程序,因此实现了实时控制。如果没有中断系统,CPU就只能按照原来的程序编写的先后顺序,对各个外设进行查询和处理,这样实际工作效率很低,不能及时响应紧急事件。
|
||||
|
||||
<img src="1.3.png" alt="6-1" style="zoom:25%;" />
|
||||
|
||||
<center>图6-1 中断程序运行流程图</center>
|
||||
|
||||
应用例子:
|
||||
|
||||
1. 当出现一些不合法的、可能会损害计算机的程序时,可以立即跳转到中断程序进行修复或是终止程序,以免计算机损坏。比如除$0$操作。
|
||||
2. 进行系统调用,如从键盘获取信息等。
|
||||
|
||||
|
||||
|
||||
### 源代码附录
|
||||
|
||||
```assembly
|
||||
DATA SEGMENT
|
||||
INT_OFF1 DW 0 ; 存储主片原来中断向量的偏移地址
|
||||
INT_SEG1 DW 0 ; 存储主片原来中断向量的段地址
|
||||
INT_OFF2 DW 0 ; 存储从片原来中断向量的偏移地址
|
||||
INT_SEG2 DW 0 ; 存储从片原来中断向量的段地址
|
||||
LED_STATE DW 00000001B ; 0|xxx|0(B组0方式)|000(指定PC0引脚)|1(置位)
|
||||
DATA ENDS
|
||||
|
||||
STACK SEGMENT
|
||||
DW 100 DUP (0) ; 定义堆栈段,大小为100字节
|
||||
STACK ENDS
|
||||
|
||||
CODE SEGMENT
|
||||
ASSUME CS:CODE, DS:DATA, SS:STACK
|
||||
START:
|
||||
MOV AX, DATA ; 将数据段地址存入AX寄存器
|
||||
MOV DS, AX ; 将AX中的值装载到DS寄存器
|
||||
MOV ES, AX ; 将AX中的值装载到ES寄存器
|
||||
MOV AX, STACK ; 将堆栈段地址存入AX寄存器
|
||||
MOV SS, AX ; 将AX中的值装载到SS寄存器
|
||||
|
||||
CLI ; 清除中断标志,禁止中断,防止在修改中断向量表过程中有中断触发
|
||||
; 保存主片原来的中断向量
|
||||
MOV AX, 350BH ; 获取原来的中断号为0BH的中断向量
|
||||
INT 21H ; 将中断向量的偏移地址存在BX,段地址存在ES
|
||||
MOV INT_OFF1, BX ; 分别将原来中断向量的偏移地址和段地址保存
|
||||
MOV BX, ES
|
||||
MOV INT_SEG1, BX
|
||||
|
||||
; 向主片装填新的中断向量
|
||||
MOV DX, SEG SW_INT ; 将主片新中断向量的段地址存入DX
|
||||
MOV DS, DX ; 再装到DS
|
||||
MOV DX, OFFSET SW_INT ; 将主片新中断向量的偏移地址存入DX
|
||||
MOV AX, 250BH ; 装填到中断向量表里中断号为0BH的中断向量
|
||||
INT 21H
|
||||
MOV AX, DATA ; 重新加载数据段地址
|
||||
MOV DS, AX
|
||||
|
||||
; 保存从片原来的中断向量
|
||||
MOV AX, 3572H ; 获取原来的中断号为72H的中断向量
|
||||
INT 21H ; 将中断向量的偏移地址存在BX,段地址存在ES
|
||||
MOV INT_OFF2, BX ; 分别将原来中断向量的偏移地址和段地址保存
|
||||
MOV BX, ES
|
||||
MOV INT_SEG2, BX
|
||||
|
||||
; 向从片装填新的中断向量
|
||||
MOV DX, SEG SW_INT ; 将从片新中断向量的段地址存入DX
|
||||
MOV DS, DX ; 再装到DS
|
||||
MOV DX, OFFSET SW_INT ; 将从片新中断向量的偏移地址存入DX
|
||||
MOV AX, 2572H ; 装填到中断向量表里中断号为72H的中断向量
|
||||
INT 21H
|
||||
MOV AX, DATA ; 重新加载数据段地址
|
||||
MOV DS, AX
|
||||
|
||||
; 取消主片MIRQ3的中断屏蔽
|
||||
IN AL, 21H ; 读取主片中断屏蔽寄存器
|
||||
AND AL, 11110111B ; 将第3位设置为0
|
||||
OUT 21H, AL ; 将修改后的值写入主片中断屏蔽寄存器
|
||||
|
||||
; 取消从片SIRQ10的中断屏蔽
|
||||
IN AL, 0A1H ; 读取从片中断屏蔽寄存器
|
||||
AND AL, 11111011B ; 将第2位设置为0
|
||||
OUT 0A1H, AL ; 将修改后的值写入从片中断屏蔽寄存器
|
||||
|
||||
; 主程序
|
||||
MOV DX, 283H ; 8255芯片的命令口
|
||||
MOV AL, 10000000B ; 1|00(A组0方式)|0(PA输出)|0(PC4-7输出)|0(B组0方式)|0(PB输出)|0(PC0-3输出)
|
||||
OUT DX, AL
|
||||
MOV DX, 283H ; 8255芯片的命令口
|
||||
MOV AX, LED_STATE ; 输出控制LED的状态
|
||||
OUT DX, AL
|
||||
|
||||
XOR DX, DX ; 将DX置0
|
||||
L1: STI ; 设置中断标志
|
||||
CMP DX, 10 ; 判断中断是否已触发了10次
|
||||
JNE L1
|
||||
|
||||
CLI ; 清除中断标志,禁止中断,防止在修改中断向量表过程中有中断触发
|
||||
; 恢复主片原来的中断向量
|
||||
MOV DX, INT_SEG1 ; 将主片原中断向量的段地址存入DX
|
||||
MOV DS, DX ; 再装到DS
|
||||
MOV DX, INT_OFF1 ; 将主片原中断向量的偏移地址存入DX
|
||||
MOV AX, 250BH ; 装填到中断向量表里中断号为0BH的中断向量
|
||||
INT 21H
|
||||
MOV AX, DATA ; 重新加载数据段地址
|
||||
MOV DS, AX
|
||||
|
||||
; 恢复从片原来的中断向量
|
||||
MOV DX, INT_SEG2 ; 将从片原中断向量的段地址存入DX
|
||||
MOV DS, DX ; 再装到DS
|
||||
MOV DX, INT_OFF2 ; 将从片原中断向量的偏移地址存入DX
|
||||
MOV AX, 2572H ; 装填到中断向量表里中断号为72H的中断向量
|
||||
INT 21H
|
||||
MOV AX, DATA ; 重新加载数据段地址
|
||||
MOV DS, AX
|
||||
|
||||
; 设置主片的中断屏蔽
|
||||
IN AL, 21H ; 读取主片中断屏蔽寄存器
|
||||
OR AL, 00001000B ; 将第3位设置为1
|
||||
OUT 21H, AL ; 将修改后的值写入主片中断屏蔽寄存器
|
||||
|
||||
; 设置从片的中断屏蔽
|
||||
IN AL, 0A1H ; 读取从片中断屏蔽寄存器
|
||||
OR AL, 00000100B ; 将第2位设置为1
|
||||
OUT 0A1H, AL ; 将修改后的值写入从片中断屏蔽寄存器
|
||||
STI ; 设置中断标志
|
||||
|
||||
; 返回DOS
|
||||
MOV AX, 4C00H
|
||||
INT 21H
|
||||
|
||||
; 中断服务程序
|
||||
SW_INT PROC NEAR
|
||||
PUSH AX ; 保护主程序运行状态
|
||||
CLI ; 清除中断标志,禁止中断程序执行过程中跳转到其他中断程序
|
||||
INC DX ; 触发计数加1
|
||||
|
||||
PUSH DX ; 保护DX
|
||||
MOV AX, LED_STATE
|
||||
ADD AX, DX ; DX的末位会随着其增加交替为0和1
|
||||
AND AX, 00000001B ; 取末位控制PC0为0或1
|
||||
MOV DX, 283H ; 从而实现灯的亮灭交替
|
||||
OUT DX, AL
|
||||
POP DX ; 恢复DX
|
||||
|
||||
MOV AL, 20H ; 向主片发送EOI指令
|
||||
OUT 20H, AL
|
||||
MOV AL, 62H ; 向从片发送EOI指令
|
||||
OUT 0A0H, AL
|
||||
STI ; 设置中断标志,允许跳转到中断程序
|
||||
POP AX ; 恢复主程序运行状态
|
||||
IRET
|
||||
SW_INT ENDP
|
||||
|
||||
CODE ENDS
|
||||
END START
|
||||
```
|
||||
BIN
Lab/Lab5/material/21281280_柯劲帆_第5次实验_8259中断实验.pdf
Executable file
BIN
Lab/Lab5/material/21281280_柯劲帆_第5次实验_8259中断实验.pdf
Executable file
Binary file not shown.
BIN
Lab/Lab5/material/code.EXE
Executable file
BIN
Lab/Lab5/material/code.EXE
Executable file
Binary file not shown.
192
Lab/Lab5/material/code.LST
Executable file
192
Lab/Lab5/material/code.LST
Executable file
@@ -0,0 +1,192 @@
|
||||
Turbo Assembler Version 5.3 06-02-23 10:20:14 Page 1
|
||||
code.asm
|
||||
|
||||
|
||||
|
||||
1 0000 DATA SEGMENT
|
||||
2 0000 0000 INT_OFF1 DW 0
|
||||
3 0002 0000 INT_SEG1 DW 0
|
||||
4 0004 0000 INT_OFF2 DW 0
|
||||
5 0006 0000 INT_SEG2 DW 0
|
||||
6 0008 0001 LED_STATE DW 00000001B
|
||||
7 000A DATA ENDS
|
||||
8
|
||||
9 0000 STACK SEGMENT
|
||||
*Warning* code.asm(9) Reserved word used as symbol: STACK
|
||||
10 0000 64*(0000) DW 100 DUP (0)
|
||||
11 00C8 STACK ENDS
|
||||
12
|
||||
13 0000 CODE SEGMENT
|
||||
14 ASSUME CS:CODE, DS:DATA, SS:STACK
|
||||
15 0000 START:
|
||||
16 0000 B8 0000s MOV AX, DATA
|
||||
17 0003 8E D8 MOV DS, AX
|
||||
18 0005 8E C0 MOV ES, AX
|
||||
19 0007 B8 0000s MOV AX, STACK
|
||||
20 000A 8E D0 MOV SS, AX
|
||||
21
|
||||
22 ; save main chip's original interruption vector
|
||||
23 000C B8 350B MOV AX, 350BH
|
||||
24 000F CD 21 INT 21H
|
||||
25 0011 89 1E 0000r MOV INT_OFF1, BX
|
||||
26 0015 8C C3 MOV BX, ES
|
||||
27 0017 89 1E 0002r MOV INT_SEG1, BX
|
||||
28
|
||||
29 ; load main chip's new interruption vector
|
||||
30 001B FA CLI
|
||||
31 001C BA 0000s MOV DX, SEG SW_INT
|
||||
32 001F 8E DA MOV DS, DX
|
||||
33 0021 BA 00ADr MOV DX, OFFSET SW_INT
|
||||
34 0024 B8 250B MOV AX, 250BH
|
||||
35 0027 CD 21 INT 21H
|
||||
36 0029 B8 0000s MOV AX, DATA
|
||||
37 002C 8E D8 MOV DS, AX
|
||||
38
|
||||
39 ; save slave chip's original interruption vector
|
||||
40 002E B8 3572 MOV AX, 3572H
|
||||
41 0031 CD 21 INT 21H
|
||||
42 0033 89 1E 0004r MOV INT_OFF2, BX
|
||||
43 0037 8C C3 MOV BX, ES
|
||||
44 0039 89 1E 0006r MOV INT_SEG2, BX
|
||||
45
|
||||
46 ; load slave chip's new interruption vector
|
||||
47 003D FA CLI
|
||||
48 003E BA 0000s MOV DX, SEG SW_INT
|
||||
49 0041 8E DA MOV DS, DX
|
||||
50 0043 BA 00ADr MOV DX, OFFSET SW_INT
|
||||
51 0046 B8 2572 MOV AX, 2572H
|
||||
52 0049 CD 21 INT 21H
|
||||
53 004B B8 0000s MOV AX, DATA
|
||||
54 004E 8E D8 MOV DS, AX
|
||||
55
|
||||
56 ; open main chip's interruption mask
|
||||
Turbo Assembler Version 5.3 06-02-23 10:20:14 Page 2
|
||||
code.asm
|
||||
|
||||
|
||||
|
||||
57 0050 E4 21 IN AL, 21H
|
||||
58 0052 24 F7 AND AL, 11110111B
|
||||
59 0054 E6 21 OUT 21H, AL
|
||||
60
|
||||
61 ; open slave chip's interruption mask
|
||||
62 0056 E4 A1 IN AL, 0A1H
|
||||
63 0058 24 FB AND AL, 11111011B
|
||||
64 005A E6 A1 OUT 0A1H, AL
|
||||
65
|
||||
66 ; main code
|
||||
67 005C BA 0283 MOV DX, 283H
|
||||
68 005F B0 80 MOV AL, 10000000B
|
||||
69 0061 EE OUT DX, AL
|
||||
70 0062 BA 0283 MOV DX, 283H
|
||||
71 0065 A1 0008r MOV AX, LED_STATE
|
||||
72 0068 EE OUT DX, AL
|
||||
73
|
||||
74 0069 33 D2 XOR DX,DX
|
||||
75 006B FB L1: STI
|
||||
76 006C 83 FA 0A CMP DX, 10
|
||||
77 006F 75 FA JNZ L1
|
||||
78
|
||||
79 ; reload main chip's original interruption vector
|
||||
80 0071 FA CLI
|
||||
81 0072 8B 16 0002r MOV DX,INT_SEG1
|
||||
82 0076 8E DA MOV DS,DX
|
||||
83 0078 8B 16 0000r MOV DX,INT_OFF1
|
||||
84 007C B8 2572 MOV AX,2572H
|
||||
85 007F CD 21 INT 21H
|
||||
86 0081 B8 0000s MOV AX,DATA
|
||||
87 0084 8E D8 MOV DS,AX
|
||||
88
|
||||
89 ; reload slave chip's original interruption vector
|
||||
90 0086 FA CLI
|
||||
91 0087 8B 16 0006r MOV DX,INT_SEG2
|
||||
92 008B 8E DA MOV DS,DX
|
||||
93 008D 8B 16 0004r MOV DX,INT_OFF2
|
||||
94 0091 B8 2572 MOV AX,2572H
|
||||
95 0094 CD 21 INT 21H
|
||||
96 0096 B8 0000s MOV AX,DATA
|
||||
97 0099 8E D8 MOV DS,AX
|
||||
98
|
||||
99 ; close main chip's interruption mask
|
||||
100 009B E4 21 IN AL, 21H
|
||||
101 009D 0C 08 OR AL, 00001000B
|
||||
102 009F E6 21 OUT 21H, AL
|
||||
103
|
||||
104 ; close slave chip's interruption mask
|
||||
105 00A1 E4 A1 IN AL, 0A1H
|
||||
106 00A3 0C 04 OR AL, 00000100B
|
||||
107 00A5 E6 A1 OUT 0A1H, AL
|
||||
108 00A7 FB STI
|
||||
109
|
||||
110 ; return to DOS
|
||||
111 00A8 B8 4C00 MOV AX,4C00H
|
||||
112 00AB CD 21 INT 21H
|
||||
113
|
||||
Turbo Assembler Version 5.3 06-02-23 10:20:14 Page 3
|
||||
code.asm
|
||||
|
||||
|
||||
|
||||
114 ; interruption service proccess
|
||||
115 00AD SW_INT PROC NEAR
|
||||
116 00AD 50 PUSH AX
|
||||
117 00AE FA CLI
|
||||
118 00AF 42 INC DX
|
||||
119
|
||||
120 00B0 52 PUSH DX
|
||||
121 00B1 A1 0008r MOV AX, LED_STATE
|
||||
122 00B4 03 C2 ADD AX, DX
|
||||
123 00B6 25 0001 AND AX, 00000001B
|
||||
124 00B9 BA 0283 MOV DX, 283H
|
||||
125 00BC EE OUT DX, AL
|
||||
126 00BD 5A POP DX
|
||||
127
|
||||
128 00BE B0 20 MOV AL, 20H
|
||||
129 00C0 E6 20 OUT 20H, AL
|
||||
130 00C2 B0 62 MOV AL, 62H
|
||||
131 00C4 E6 A0 OUT 0A0H, AL
|
||||
132 00C6 FB STI
|
||||
133 00C7 58 POP AX
|
||||
134 00C8 CF IRET
|
||||
135 00C9 SW_INT ENDP
|
||||
136
|
||||
137
|
||||
138 00C9 CODE ENDS
|
||||
139 END START
|
||||
Turbo Assembler Version 5.3 06-02-23 10:20:14 Page 4
|
||||
Symbol Table
|
||||
|
||||
|
||||
|
||||
|
||||
Symbol Name Type Value
|
||||
|
||||
??DATE Text "06-02-23"
|
||||
??FILENAME Text "code "
|
||||
??TIME Text "10:20:14"
|
||||
??VERSION Number 0503
|
||||
@CPU Text 0101H
|
||||
@CURSEG Text CODE
|
||||
@FILENAME Text CODE
|
||||
@WORDSIZE Text 2
|
||||
INT_OFF1 Word DATA:0000
|
||||
INT_OFF2 Word DATA:0004
|
||||
INT_SEG1 Word DATA:0002
|
||||
INT_SEG2 Word DATA:0006
|
||||
L1 Near16 CODE:006B
|
||||
LED_STATE Word DATA:0008
|
||||
START Near16 CODE:0000
|
||||
SW_INT Near16 CODE:00AD
|
||||
|
||||
Groups & Segments Bit Size Align Combine Class
|
||||
|
||||
CODE 16 00C9 Para none
|
||||
DATA 16 000A Para none
|
||||
STACK 16 00C8 Para none
|
||||
Turbo Assembler Version 5.3 06-02-23 10:20:14 Page 5
|
||||
Error Summary
|
||||
|
||||
|
||||
|
||||
*Warning* code.asm(9) Reserved word used as symbol: STACK
|
||||
|
||||
8
Lab/Lab5/material/code.MAP
Executable file
8
Lab/Lab5/material/code.MAP
Executable file
@@ -0,0 +1,8 @@
|
||||
LINK : warning L4021: no stack segment
|
||||
|
||||
Start Stop Length Name Class
|
||||
00000H 00009H 0000AH DATA
|
||||
00010H 000D7H 000C8H STACK
|
||||
000E0H 001A8H 000C9H CODE
|
||||
|
||||
Program entry point at 000E:0000
|
||||
BIN
Lab/Lab5/material/code.OBJ
Executable file
BIN
Lab/Lab5/material/code.OBJ
Executable file
Binary file not shown.
136
Lab/Lab5/material/code.asm
Executable file
136
Lab/Lab5/material/code.asm
Executable file
@@ -0,0 +1,136 @@
|
||||
DATA SEGMENT
|
||||
INT_OFF1 DW 0 ; 存储主片原来中断向量的偏移地址
|
||||
INT_SEG1 DW 0 ; 存储主片原来中断向量的段地址
|
||||
INT_OFF2 DW 0 ; 存储从片原来中断向量的偏移地址
|
||||
INT_SEG2 DW 0 ; 存储从片原来中断向量的段地址
|
||||
LED_STATE DW 00000001B ; 0|xxx|0(B组0方式)|000(指定PC0引脚)|1(置位)
|
||||
DATA ENDS
|
||||
|
||||
STACK SEGMENT
|
||||
DW 100 DUP (0) ; 定义堆栈段,大小为100字节
|
||||
STACK ENDS
|
||||
|
||||
CODE SEGMENT
|
||||
ASSUME CS:CODE, DS:DATA, SS:STACK
|
||||
START:
|
||||
MOV AX, DATA ; 将数据段地址存入AX寄存器
|
||||
MOV DS, AX ; 将AX中的值装载到DS寄存器
|
||||
MOV ES, AX ; 将AX中的值装载到ES寄存器
|
||||
MOV AX, STACK ; 将堆栈段地址存入AX寄存器
|
||||
MOV SS, AX ; 将AX中的值装载到SS寄存器
|
||||
|
||||
CLI ; 清除中断标志,禁止中断,防止在修改中断向量表过程中有中断触发
|
||||
; 保存主片原来的中断向量
|
||||
MOV AX, 350BH ; 获取原来的中断号为0BH的中断向量
|
||||
INT 21H ; 将中断向量的偏移地址存在BX,段地址存在ES
|
||||
MOV INT_OFF1, BX ; 分别将原来中断向量的偏移地址和段地址保存
|
||||
MOV BX, ES
|
||||
MOV INT_SEG1, BX
|
||||
|
||||
; 向主片装填新的中断向量
|
||||
MOV DX, SEG SW_INT ; 将主片新中断向量的段地址存入DX
|
||||
MOV DS, DX ; 再装到DS
|
||||
MOV DX, OFFSET SW_INT ; 将主片新中断向量的偏移地址存入DX
|
||||
MOV AX, 250BH ; 装填到中断向量表里中断号为0BH的中断向量
|
||||
INT 21H
|
||||
MOV AX, DATA ; 重新加载数据段地址
|
||||
MOV DS, AX
|
||||
|
||||
; 保存从片原来的中断向量
|
||||
MOV AX, 3572H ; 获取原来的中断号为72H的中断向量
|
||||
INT 21H ; 将中断向量的偏移地址存在BX,段地址存在ES
|
||||
MOV INT_OFF2, BX ; 分别将原来中断向量的偏移地址和段地址保存
|
||||
MOV BX, ES
|
||||
MOV INT_SEG2, BX
|
||||
|
||||
; 向从片装填新的中断向量
|
||||
MOV DX, SEG SW_INT ; 将从片新中断向量的段地址存入DX
|
||||
MOV DS, DX ; 再装到DS
|
||||
MOV DX, OFFSET SW_INT ; 将从片新中断向量的偏移地址存入DX
|
||||
MOV AX, 2572H ; 装填到中断向量表里中断号为72H的中断向量
|
||||
INT 21H
|
||||
MOV AX, DATA ; 重新加载数据段地址
|
||||
MOV DS, AX
|
||||
|
||||
; 取消主片MIRQ3的中断屏蔽
|
||||
IN AL, 21H ; 读取主片中断屏蔽寄存器
|
||||
AND AL, 11110111B ; 将第3位设置为0
|
||||
OUT 21H, AL ; 将修改后的值写入主片中断屏蔽寄存器
|
||||
|
||||
; 取消从片SIRQ10的中断屏蔽
|
||||
IN AL, 0A1H ; 读取从片中断屏蔽寄存器
|
||||
AND AL, 11111011B ; 将第2位设置为0
|
||||
OUT 0A1H, AL ; 将修改后的值写入从片中断屏蔽寄存器
|
||||
|
||||
; 主程序
|
||||
MOV DX, 283H ; 8255芯片的命令口
|
||||
MOV AL, 10000000B ; 1|00(A组0方式)|0(PA输出)|0(PC4-7输出)|0(B组0方式)|0(PB输出)|0(PC0-3输出)
|
||||
OUT DX, AL
|
||||
MOV DX, 283H ; 8255芯片的命令口
|
||||
MOV AX, LED_STATE ; 输出控制LED的状态
|
||||
OUT DX, AL
|
||||
|
||||
XOR DX, DX ; 将DX置0
|
||||
L1: STI ; 设置中断标志
|
||||
CMP DX, 10 ; 判断中断是否已触发了10次
|
||||
JNE L1
|
||||
|
||||
CLI ; 清除中断标志,禁止中断,防止在修改中断向量表过程中有中断触发
|
||||
; 恢复主片原来的中断向量
|
||||
MOV DX, INT_SEG1 ; 将主片原中断向量的段地址存入DX
|
||||
MOV DS, DX ; 再装到DS
|
||||
MOV DX, INT_OFF1 ; 将主片原中断向量的偏移地址存入DX
|
||||
MOV AX, 250BH ; 装填到中断向量表里中断号为0BH的中断向量
|
||||
INT 21H
|
||||
MOV AX, DATA ; 重新加载数据段地址
|
||||
MOV DS, AX
|
||||
|
||||
; 恢复从片原来的中断向量
|
||||
MOV DX, INT_SEG2 ; 将从片原中断向量的段地址存入DX
|
||||
MOV DS, DX ; 再装到DS
|
||||
MOV DX, INT_OFF2 ; 将从片原中断向量的偏移地址存入DX
|
||||
MOV AX, 2572H ; 装填到中断向量表里中断号为72H的中断向量
|
||||
INT 21H
|
||||
MOV AX, DATA ; 重新加载数据段地址
|
||||
MOV DS, AX
|
||||
|
||||
; 设置主片的中断屏蔽
|
||||
IN AL, 21H ; 读取主片中断屏蔽寄存器
|
||||
OR AL, 00001000B ; 将第3位设置为1
|
||||
OUT 21H, AL ; 将修改后的值写入主片中断屏蔽寄存器
|
||||
|
||||
; 设置从片的中断屏蔽
|
||||
IN AL, 0A1H ; 读取从片中断屏蔽寄存器
|
||||
OR AL, 00000100B ; 将第2位设置为1
|
||||
OUT 0A1H, AL ; 将修改后的值写入从片中断屏蔽寄存器
|
||||
STI ; 设置中断标志
|
||||
|
||||
; 返回DOS
|
||||
MOV AX, 4C00H
|
||||
INT 21H
|
||||
|
||||
; 中断服务程序
|
||||
SW_INT PROC NEAR
|
||||
PUSH AX ; 保护主程序运行状态
|
||||
CLI ; 清除中断标志,禁止中断程序执行过程中跳转到其他中断程序
|
||||
INC DX ; 触发计数加1
|
||||
|
||||
PUSH DX ; 保护DX
|
||||
MOV AX, LED_STATE
|
||||
ADD AX, DX ; DX的末位会随着其增加交替为0和1
|
||||
AND AX, 00000001B ; 取末位控制PC0为0或1
|
||||
MOV DX, 283H ; 从而实现灯的亮灭交替
|
||||
OUT DX, AL
|
||||
POP DX ; 恢复DX
|
||||
|
||||
MOV AL, 20H ; 向主片发送EOI指令
|
||||
OUT 20H, AL
|
||||
MOV AL, 62H ; 向从片发送EOI指令
|
||||
OUT 0A0H, AL
|
||||
STI ; 设置中断标志,允许跳转到中断程序
|
||||
POP AX ; 恢复主程序运行状态
|
||||
IRET
|
||||
SW_INT ENDP
|
||||
|
||||
CODE ENDS
|
||||
END START
|
||||
BIN
Lab/Lab5/material/cover.png
Executable file
BIN
Lab/Lab5/material/cover.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 173 KiB |
109
Lab/Lab5/material/graph.drawio
Executable file
109
Lab/Lab5/material/graph.drawio
Executable file
@@ -0,0 +1,109 @@
|
||||
<mxfile host="Electron" modified="2023-06-02T12:55:25.933Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.2.8 Chrome/112.0.5615.165 Electron/24.2.0 Safari/537.36" etag="95Rm5XCTjJJJ0MgO01JQ" version="21.2.8" type="device">
|
||||
<diagram name="第 1 页" id="Ghm6eOXCY3Oxz9aPBUkc">
|
||||
<mxGraphModel dx="1241" dy="744" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0" />
|
||||
<mxCell id="1" parent="0" />
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-1" target="PA3ascb84F3rLPraz_4V-3" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-1" value="程序开始" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="320" y="80" width="200" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-2" target="PA3ascb84F3rLPraz_4V-4" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-2" value="将新的中断程序的地址<br>写入主片和从片的对应的中断号" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="320" y="240" width="200" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-3" target="PA3ascb84F3rLPraz_4V-2" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-3" value="获取并保存主片和从片的原中断向量" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="320" y="160" width="200" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-4" target="PA3ascb84F3rLPraz_4V-5" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-4" value="打开主片和从片相应的中断屏蔽" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="320" y="320" width="200" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-5" target="PA3ascb84F3rLPraz_4V-6" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-5" value="初始化8255芯片" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="320" y="400" width="200" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-6" target="PA3ascb84F3rLPraz_4V-9" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-6" value="开中断" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="320" y="480" width="200" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-18" value="Y" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-9" target="FDWMo__iFbWUBXxNi3Jb-6" edge="1">
|
||||
<mxGeometry x="-0.5" y="10" relative="1" as="geometry">
|
||||
<mxPoint as="offset" />
|
||||
<mxPoint x="340" y="620" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-19" value="N" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-9" edge="1">
|
||||
<mxGeometry x="-0.8889" y="-10" relative="1" as="geometry">
|
||||
<mxPoint x="420" y="540" as="targetPoint" />
|
||||
<mxPoint as="offset" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-9" value="判断计数是否达到10次" style="rhombus;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="320" y="560" width="200" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-11" value="程序结束" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="320" y="800" width="200" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-26" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-20" target="PA3ascb84F3rLPraz_4V-22" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-20" value="收到高脉冲,中断程序开始" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="600" y="320" width="200" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-29" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-21" target="PA3ascb84F3rLPraz_4V-24" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-21" value="将LED灯状态取反" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="600" y="560" width="200" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-27" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-22" target="PA3ascb84F3rLPraz_4V-23" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-22" value="状态压栈,关中断" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="600" y="400" width="200" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-28" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-23" target="PA3ascb84F3rLPraz_4V-21" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-23" value="计数加1" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="600" y="480" width="200" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-30" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="PA3ascb84F3rLPraz_4V-24" target="PA3ascb84F3rLPraz_4V-25" edge="1">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-24" value="向主从、片发送EOI命令,开中断,状态退栈" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="600" y="640" width="200" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="PA3ascb84F3rLPraz_4V-25" value="中断程序结束" style="ellipse;whiteSpace=wrap;html=1;" parent="1" vertex="1">
|
||||
<mxGeometry x="600" y="720" width="200" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="FDWMo__iFbWUBXxNi3Jb-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="FDWMo__iFbWUBXxNi3Jb-6" target="FDWMo__iFbWUBXxNi3Jb-7">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="FDWMo__iFbWUBXxNi3Jb-6" value="恢复主片和从片的原中断向量" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="320" y="640" width="200" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="FDWMo__iFbWUBXxNi3Jb-8" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="FDWMo__iFbWUBXxNi3Jb-7" target="PA3ascb84F3rLPraz_4V-11">
|
||||
<mxGeometry relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="FDWMo__iFbWUBXxNi3Jb-7" value="关闭主片和从片相应的中断屏蔽" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="320" y="720" width="200" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
||||
4
Lab/Lab5/material/graph.drawio.svg
Executable file
4
Lab/Lab5/material/graph.drawio.svg
Executable file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 25 KiB |
Reference in New Issue
Block a user