commit 2d22d07f60972a6a7156cb53b944636339769e61 Author: jingfanke Date: Tue May 27 16:03:52 2025 +0800 first commit diff --git a/Assignment/21281280 柯劲帆 第2章 第1次作业.docx b/Assignment/21281280 柯劲帆 第2章 第1次作业.docx new file mode 100755 index 0000000..bcc4e51 Binary files /dev/null and b/Assignment/21281280 柯劲帆 第2章 第1次作业.docx differ diff --git a/Assignment/21281280_柯劲帆_第3章_第2次作业.docx b/Assignment/21281280_柯劲帆_第3章_第2次作业.docx new file mode 100755 index 0000000..587d86c Binary files /dev/null and b/Assignment/21281280_柯劲帆_第3章_第2次作业.docx differ diff --git a/Assignment/21281280_柯劲帆_第3章_第3次作业.docx b/Assignment/21281280_柯劲帆_第3章_第3次作业.docx new file mode 100755 index 0000000..d050c88 Binary files /dev/null and b/Assignment/21281280_柯劲帆_第3章_第3次作业.docx differ diff --git a/Assignment/21281280_柯劲帆_第3章_第4次作业.docx b/Assignment/21281280_柯劲帆_第3章_第4次作业.docx new file mode 100755 index 0000000..40695ed Binary files /dev/null and b/Assignment/21281280_柯劲帆_第3章_第4次作业.docx differ diff --git a/Assignment/21281280_柯劲帆_第3章_第4次作业.md b/Assignment/21281280_柯劲帆_第3章_第4次作业.md new file mode 100755 index 0000000..fc205b0 --- /dev/null +++ b/Assignment/21281280_柯劲帆_第3章_第4次作业.md @@ -0,0 +1,57 @@ +# 1 + +1. 类型不匹配 +2. 不能同时为内存单元 +3. 寻址方式错误,\[变址][变址]是错误的,只能搭配\[基址][变址] + +4. AX寄存器不能用于寄存器间接寻址 +5. 不能使用MOV指令修改CS,CS只能用JMP指令修改 + +# 2 + +1. 非法 OPR1不能是立即数 +2. 合法 +3. OPR1和OPR2不能同时为存储器 +4. 合法 + +# 3 + +1. 非法 类型不匹配 +2. 合法 +3. 非法 DST和SRC不能同时为存储器寻址,因为不能确定两者位宽是否匹配 +4. 非法 DX寄存器不能用于寄存器间接寻址 +5. 非法 DS无变址与其搭配 +6. 合法 +7. 合法 + +# 4 + +1. MOV AX, OFFSET LNAME +2. MOV SI, WORD PTR CODE_LIST +3. CODE_LENGHT EQU $-CODE_LIST + +# 5 + +1. 不需要 +2. 需要 +3. 需要 +4. 需要 +5. 不需要 + +# 6 + +1. 1234H +2. 0032H + +# 7 + +| Instruction | AX | CF | SF | ZF | +| ------------- | ----- | ---- | ---- | ---- | +| MOV AX, 1234H | 1234H | | | | +| MOV CL, 4 | 1234H | | | | +| ROL AX, CL | 2341H | 1 | | | +| DEC AX | 2340H | 1 | 0 | 0 | +| MOV CX, 4 | 2340H | | | | +| MUL CX | 8D00H | | | | + +CX = 0004H diff --git a/Assignment/答案/1.1.png b/Assignment/答案/1.1.png new file mode 100755 index 0000000..1531caa Binary files /dev/null and b/Assignment/答案/1.1.png differ diff --git a/Assignment/答案/1.2.png b/Assignment/答案/1.2.png new file mode 100755 index 0000000..81cdf5b Binary files /dev/null and b/Assignment/答案/1.2.png differ diff --git a/Assignment/答案/1.3.png b/Assignment/答案/1.3.png new file mode 100755 index 0000000..1116939 Binary files /dev/null and b/Assignment/答案/1.3.png differ diff --git a/Assignment/答案/1.4.png b/Assignment/答案/1.4.png new file mode 100755 index 0000000..2a91dfe Binary files /dev/null and b/Assignment/答案/1.4.png differ diff --git a/Assignment/答案/2.1.png b/Assignment/答案/2.1.png new file mode 100755 index 0000000..2a91dfe Binary files /dev/null and b/Assignment/答案/2.1.png differ diff --git a/Assignment/答案/2.2.png b/Assignment/答案/2.2.png new file mode 100755 index 0000000..3a61ed7 Binary files /dev/null and b/Assignment/答案/2.2.png differ diff --git a/Assignment/答案/3.1.png b/Assignment/答案/3.1.png new file mode 100755 index 0000000..34de933 Binary files /dev/null and b/Assignment/答案/3.1.png differ diff --git a/Assignment/答案/3.2.png b/Assignment/答案/3.2.png new file mode 100755 index 0000000..baf1feb Binary files /dev/null and b/Assignment/答案/3.2.png differ diff --git a/Assignment/答案/3.3.png b/Assignment/答案/3.3.png new file mode 100755 index 0000000..d76e540 Binary files /dev/null and b/Assignment/答案/3.3.png differ diff --git a/Assignment/答案/4.1.png b/Assignment/答案/4.1.png new file mode 100755 index 0000000..d02cc5c Binary files /dev/null and b/Assignment/答案/4.1.png differ diff --git a/Assignment/答案/4.2.png b/Assignment/答案/4.2.png new file mode 100755 index 0000000..be1545a Binary files /dev/null and b/Assignment/答案/4.2.png differ diff --git a/Assignment/答案/4.3.png b/Assignment/答案/4.3.png new file mode 100755 index 0000000..dfaba34 Binary files /dev/null and b/Assignment/答案/4.3.png differ diff --git a/Assignment/答案/4.4.png b/Assignment/答案/4.4.png new file mode 100755 index 0000000..20baee0 Binary files /dev/null and b/Assignment/答案/4.4.png differ diff --git a/Assignment/答案/4.5.png b/Assignment/答案/4.5.png new file mode 100755 index 0000000..8bfc189 Binary files /dev/null and b/Assignment/答案/4.5.png differ diff --git a/Assignment/答案/4.6.png b/Assignment/答案/4.6.png new file mode 100755 index 0000000..6bc7495 Binary files /dev/null and b/Assignment/答案/4.6.png differ diff --git a/Assignment/答案/作业答案.pdf b/Assignment/答案/作业答案.pdf new file mode 100755 index 0000000..374a0be Binary files /dev/null and b/Assignment/答案/作业答案.pdf differ diff --git a/Assignment/答案/作业答案.pptx b/Assignment/答案/作业答案.pptx new file mode 100755 index 0000000..10a4ae8 Binary files /dev/null and b/Assignment/答案/作业答案.pptx differ diff --git a/Courseware/PDF/第10章 定时计数技术-4学时.pdf b/Courseware/PDF/第10章 定时计数技术-4学时.pdf new file mode 100755 index 0000000..5fe9bca Binary files /dev/null and b/Courseware/PDF/第10章 定时计数技术-4学时.pdf differ diff --git a/Courseware/PDF/第11章 中断技术2023.pdf b/Courseware/PDF/第11章 中断技术2023.pdf new file mode 100755 index 0000000..a7f3eab Binary files /dev/null and b/Courseware/PDF/第11章 中断技术2023.pdf differ diff --git a/Courseware/PDF/第12章 AD与DA转换器-3学时.pdf b/Courseware/PDF/第12章 AD与DA转换器-3学时.pdf new file mode 100755 index 0000000..3d4e4cc Binary files /dev/null and b/Courseware/PDF/第12章 AD与DA转换器-3学时.pdf differ diff --git a/Courseware/PDF/第13章 串口通信技术-3学时.pdf b/Courseware/PDF/第13章 串口通信技术-3学时.pdf new file mode 100755 index 0000000..211da0f Binary files /dev/null and b/Courseware/PDF/第13章 串口通信技术-3学时.pdf differ diff --git a/Courseware/PDF/第1章 基础知识-2学时.pdf b/Courseware/PDF/第1章 基础知识-2学时.pdf new file mode 100755 index 0000000..45103e6 Binary files /dev/null and b/Courseware/PDF/第1章 基础知识-2学时.pdf differ diff --git a/Courseware/PDF/第2章 80X86计算机组织-2学时.pdf b/Courseware/PDF/第2章 80X86计算机组织-2学时.pdf new file mode 100755 index 0000000..0fea2e6 Binary files /dev/null and b/Courseware/PDF/第2章 80X86计算机组织-2学时.pdf differ diff --git a/Courseware/PDF/第3-1章 寻址方式-2学时.pdf b/Courseware/PDF/第3-1章 寻址方式-2学时.pdf new file mode 100755 index 0000000..1b1b1bd Binary files /dev/null and b/Courseware/PDF/第3-1章 寻址方式-2学时.pdf differ diff --git a/Courseware/PDF/第3-2章 伪指令与程序格式-2学时.pdf b/Courseware/PDF/第3-2章 伪指令与程序格式-2学时.pdf new file mode 100755 index 0000000..68e634b Binary files /dev/null and b/Courseware/PDF/第3-2章 伪指令与程序格式-2学时.pdf differ diff --git a/Courseware/PDF/第3-3章 8086的指令系统-4学时.pdf b/Courseware/PDF/第3-3章 8086的指令系统-4学时.pdf new file mode 100755 index 0000000..c55b82d Binary files /dev/null and b/Courseware/PDF/第3-3章 8086的指令系统-4学时.pdf differ diff --git a/Courseware/PDF/第5章 循环结构程序设计-1学时.pdf b/Courseware/PDF/第5章 循环结构程序设计-1学时.pdf new file mode 100755 index 0000000..4a772aa Binary files /dev/null and b/Courseware/PDF/第5章 循环结构程序设计-1学时.pdf differ diff --git a/Courseware/PDF/第6章 子程序结构-1学时.pdf b/Courseware/PDF/第6章 子程序结构-1学时.pdf new file mode 100755 index 0000000..f2ab237 Binary files /dev/null and b/Courseware/PDF/第6章 子程序结构-1学时.pdf differ diff --git a/Courseware/PDF/第7章 BIOS和DOS中断-1学时.pdf b/Courseware/PDF/第7章 BIOS和DOS中断-1学时.pdf new file mode 100755 index 0000000..b32adaa Binary files /dev/null and b/Courseware/PDF/第7章 BIOS和DOS中断-1学时.pdf differ diff --git a/Courseware/PDF/第8章 IO端口地址译码技术-3学时.pdf b/Courseware/PDF/第8章 IO端口地址译码技术-3学时.pdf new file mode 100755 index 0000000..441ce98 Binary files /dev/null and b/Courseware/PDF/第8章 IO端口地址译码技术-3学时.pdf differ diff --git a/Courseware/PDF/第9章 并行接口技术-3学时.pdf b/Courseware/PDF/第9章 并行接口技术-3学时.pdf new file mode 100755 index 0000000..47c971d Binary files /dev/null and b/Courseware/PDF/第9章 并行接口技术-3学时.pdf differ diff --git a/Courseware/第10章 定时计数技术-4学时.pptx b/Courseware/第10章 定时计数技术-4学时.pptx new file mode 100755 index 0000000..430b176 Binary files /dev/null and b/Courseware/第10章 定时计数技术-4学时.pptx differ diff --git a/Courseware/第11章 中断技术2023.pptx b/Courseware/第11章 中断技术2023.pptx new file mode 100755 index 0000000..c2854e8 Binary files /dev/null and b/Courseware/第11章 中断技术2023.pptx differ diff --git a/Courseware/第12章 AD与DA转换器-3学时.pptx b/Courseware/第12章 AD与DA转换器-3学时.pptx new file mode 100755 index 0000000..5d28a7c Binary files /dev/null and b/Courseware/第12章 AD与DA转换器-3学时.pptx differ diff --git a/Courseware/第13章 串口通信技术-3学时.pptx b/Courseware/第13章 串口通信技术-3学时.pptx new file mode 100755 index 0000000..1b00770 Binary files /dev/null and b/Courseware/第13章 串口通信技术-3学时.pptx differ diff --git a/Courseware/第1章 基础知识-2学时.pptx b/Courseware/第1章 基础知识-2学时.pptx new file mode 100755 index 0000000..02ca0a3 Binary files /dev/null and b/Courseware/第1章 基础知识-2学时.pptx differ diff --git a/Courseware/第2章 80X86计算机组织-2学时.pptx b/Courseware/第2章 80X86计算机组织-2学时.pptx new file mode 100755 index 0000000..b97f08d Binary files /dev/null and b/Courseware/第2章 80X86计算机组织-2学时.pptx differ diff --git a/Courseware/第3-1章 寻址方式-2学时.pptx b/Courseware/第3-1章 寻址方式-2学时.pptx new file mode 100755 index 0000000..664af69 Binary files /dev/null and b/Courseware/第3-1章 寻址方式-2学时.pptx differ diff --git a/Courseware/第3-2章 伪指令与程序格式-2学时.pptx b/Courseware/第3-2章 伪指令与程序格式-2学时.pptx new file mode 100755 index 0000000..d59827d Binary files /dev/null and b/Courseware/第3-2章 伪指令与程序格式-2学时.pptx differ diff --git a/Courseware/第3-3章 8086的指令系统-4学时.pptx b/Courseware/第3-3章 8086的指令系统-4学时.pptx new file mode 100755 index 0000000..cee5492 Binary files /dev/null and b/Courseware/第3-3章 8086的指令系统-4学时.pptx differ diff --git a/Courseware/第4章 分支结构程序设计-1学时.pptx b/Courseware/第4章 分支结构程序设计-1学时.pptx new file mode 100755 index 0000000..51a0fb1 Binary files /dev/null and b/Courseware/第4章 分支结构程序设计-1学时.pptx differ diff --git a/Courseware/第5章 循环结构程序设计-1学时.pptx b/Courseware/第5章 循环结构程序设计-1学时.pptx new file mode 100755 index 0000000..5121ff9 Binary files /dev/null and b/Courseware/第5章 循环结构程序设计-1学时.pptx differ diff --git a/Courseware/第6章 子程序结构-1学时.pptx b/Courseware/第6章 子程序结构-1学时.pptx new file mode 100755 index 0000000..e6da648 Binary files /dev/null and b/Courseware/第6章 子程序结构-1学时.pptx differ diff --git a/Courseware/第7章 BIOS和DOS中断-1学时.pptx b/Courseware/第7章 BIOS和DOS中断-1学时.pptx new file mode 100755 index 0000000..6b985fb Binary files /dev/null and b/Courseware/第7章 BIOS和DOS中断-1学时.pptx differ diff --git a/Courseware/第8章 IO端口地址译码技术-3学时.pptx b/Courseware/第8章 IO端口地址译码技术-3学时.pptx new file mode 100755 index 0000000..4df45e0 Binary files /dev/null and b/Courseware/第8章 IO端口地址译码技术-3学时.pptx differ diff --git a/Courseware/第9章 并行接口技术-3学时.pptx b/Courseware/第9章 并行接口技术-3学时.pptx new file mode 100755 index 0000000..9da0616 Binary files /dev/null and b/Courseware/第9章 并行接口技术-3学时.pptx differ diff --git a/Lab/Lab1/21281280_柯劲帆_第1次实验.zip b/Lab/Lab1/21281280_柯劲帆_第1次实验.zip new file mode 100755 index 0000000..f8a4d6c Binary files /dev/null and b/Lab/Lab1/21281280_柯劲帆_第1次实验.zip differ diff --git a/Lab/Lab1/21281280_柯劲帆_第1次实验/1.asm b/Lab/Lab1/21281280_柯劲帆_第1次实验/1.asm new file mode 100755 index 0000000..39f0ad5 --- /dev/null +++ b/Lab/Lab1/21281280_柯劲帆_第1次实验/1.asm @@ -0,0 +1,23 @@ +DATA SEGMENT +NUM1 DD 11451400H +NUM2 DD 19198100H +SUM DD ? +DATA ENDS +CODE SEGMENT + ASSUME CS:CODE, DS:DATA +start: + MOV AX, DATA + MOV DS, AX + MOV AX, WORD PTR NUM1 + MOV WORD PTR SUM, AX + MOV BX, WORD PTR NUM2 + ADD WORD PTR SUM, AX + + MOV AX, WORD PTR NUM1+2 + ADC WORD PTR SUM+2, AX + MOV AX, WORD PTR NUM2+2 + ADD WORD PTR SUM+2, AX + MOV AH, 4CH + INT 21H +CODE ENDS +END start \ No newline at end of file diff --git a/Lab/Lab1/21281280_柯劲帆_第1次实验/2.asm b/Lab/Lab1/21281280_柯劲帆_第1次实验/2.asm new file mode 100755 index 0000000..64e3c3e --- /dev/null +++ b/Lab/Lab1/21281280_柯劲帆_第1次实验/2.asm @@ -0,0 +1,36 @@ +DSEG SEGMENT +XXX DW 1234H +YYY DW 5678H +ZZZ DD ? +DSEG ENDS + +CSEG SEGMENT + ASSUME CS:CSEG,DS:DSEG +START:MOV AX,DSEG + MOV DS,AX + + MOV AX,XXX + XOR DX,DX + + ADD AX,AX + ADC DX,0 + + ADD AX,AX + ADC DX,0 + + ADD AX,AX + ADC DX,0 + + ADD AX,AX + ADC DX,0 + + ADD AX,YYY + ADC DX,0 + + MOV WORD PTR ZZZ,AX + MOV WORD PTR ZZZ+2,DX + + MOV AH,4CH + INT 21H +CSEG ENDS + END START diff --git a/Lab/Lab1/21281280_柯劲帆_第1次实验/21281280_柯劲帆_第1次实验报告.pdf b/Lab/Lab1/21281280_柯劲帆_第1次实验/21281280_柯劲帆_第1次实验报告.pdf new file mode 100755 index 0000000..2be4610 Binary files /dev/null and b/Lab/Lab1/21281280_柯劲帆_第1次实验/21281280_柯劲帆_第1次实验报告.pdf differ diff --git a/Lab/Lab1/DOSBOX的安装与使用.docx b/Lab/Lab1/DOSBOX的安装与使用.docx new file mode 100755 index 0000000..cca623f Binary files /dev/null and b/Lab/Lab1/DOSBOX的安装与使用.docx differ diff --git a/Lab/Lab1/material/1-1.png b/Lab/Lab1/material/1-1.png new file mode 100755 index 0000000..2fa4850 Binary files /dev/null and b/Lab/Lab1/material/1-1.png differ diff --git a/Lab/Lab1/material/1-2.png b/Lab/Lab1/material/1-2.png new file mode 100755 index 0000000..02ebe5b Binary files /dev/null and b/Lab/Lab1/material/1-2.png differ diff --git a/Lab/Lab1/material/1-3.png b/Lab/Lab1/material/1-3.png new file mode 100755 index 0000000..99bd29e Binary files /dev/null and b/Lab/Lab1/material/1-3.png differ diff --git a/Lab/Lab1/material/1-4.png b/Lab/Lab1/material/1-4.png new file mode 100755 index 0000000..5f811ae Binary files /dev/null and b/Lab/Lab1/material/1-4.png differ diff --git a/Lab/Lab1/material/1.asm b/Lab/Lab1/material/1.asm new file mode 100755 index 0000000..44647b9 --- /dev/null +++ b/Lab/Lab1/material/1.asm @@ -0,0 +1,23 @@ +DATA SEGMENT + NUM1 DD 11451400H ; 被加数 + NUM2 DD 19198100H ; 加数 + SUM DD ? ; 结果 +DATA ENDS +CODE SEGMENT + ASSUME CS:CODE, DS:DATA + start: + MOV AX, DATA + MOV DS, AX + MOV AX, WORD PTR NUM1 ; 将NUM1低位赋给AX + MOV WORD PTR SUM, AX ; 将AX赋给SUM低位(MOV指令不能直接在两个内存单元间赋值) + MOV AX, WORD PTR NUM2 ; 将NUM2低位赋给AX + ADD WORD PTR SUM, AX ; 将AX加到SUM的低位上 + + MOV AX, WORD PTR NUM1+2 ; 将NUM1高位赋给AX + ADC WORD PTR SUM+2, AX ; ADC(Add with Carry)将AX加到SUM的高位(初始为零)上,再加上CF存着的低位进位 + MOV AX, WORD PTR NUM2+2 ; 将NUM2高位赋给AX + ADD WORD PTR SUM+2, AX ; 将AX加到SUM的高位上 + MOV AH, 4CH ; 退出程序 + INT 21H +CODE ENDS +END start \ No newline at end of file diff --git a/Lab/Lab1/material/2-1.png b/Lab/Lab1/material/2-1.png new file mode 100755 index 0000000..ab27355 Binary files /dev/null and b/Lab/Lab1/material/2-1.png differ diff --git a/Lab/Lab1/material/2-2.png b/Lab/Lab1/material/2-2.png new file mode 100755 index 0000000..dd4d8ba Binary files /dev/null and b/Lab/Lab1/material/2-2.png differ diff --git a/Lab/Lab1/material/2-3.png b/Lab/Lab1/material/2-3.png new file mode 100755 index 0000000..bdcedae Binary files /dev/null and b/Lab/Lab1/material/2-3.png differ diff --git a/Lab/Lab1/material/2.asm b/Lab/Lab1/material/2.asm new file mode 100755 index 0000000..161e21d --- /dev/null +++ b/Lab/Lab1/material/2.asm @@ -0,0 +1,37 @@ +DSEG SEGMENT + XXX DW 1234H + YYY DW 5678H + ZZZ DD ? +DSEG ENDS + +CSEG SEGMENT + ASSUME CS:CSEG, DS:DSEG + START: + MOV AX, DSEG + MOV DS, AX + + MOV AX, XXX ; 将XXX赋给AX + XOR DX, DX ; 异或DX和DX,即将DX置0 + + ADD AX, AX ; AX *= 2, AX = 2 * XXX + ADC DX, 0 ; 把进位保存在DX中 + + ADD AX, AX ; AX *= 2, AX = 4 * XXX + ADC DX, 0 ; 更新DX中的进位信息 + + ADD AX, AX ; AX *= 2, AX = 8 * XXX + ADC DX, 0 ; 更新DX中的进位信息 + + ADD AX, AX ; AX *= 2, AX = 16 * XXX + ADC DX, 0 ; 更新DX中的进位信息 + + ADD AX, YYY ; AX += YYY, AX = 16 * XXX + YYY + ADC DX, 0 ; 更新DX中的进位信息 + + MOV WORD PTR ZZZ, AX ; ZZZ的低位 = AX = 16 * XXX + YYY + MOV WORD PTR ZZZ+2, DX ; ZZZ的高位 = DX = 进位数, ZZZ = 16 * XXX + YYY(完整) + + MOV AH, 4CH + INT 21H +CSEG ENDS + END START diff --git a/Lab/Lab1/material/21281280_柯劲帆_第1次实验报告.docx b/Lab/Lab1/material/21281280_柯劲帆_第1次实验报告.docx new file mode 100755 index 0000000..73d2c32 Binary files /dev/null and b/Lab/Lab1/material/21281280_柯劲帆_第1次实验报告.docx differ diff --git a/Lab/Lab1/material/21281280_柯劲帆_第1次实验报告.md b/Lab/Lab1/material/21281280_柯劲帆_第1次实验报告.md new file mode 100755 index 0000000..6f23a3e --- /dev/null +++ b/Lab/Lab1/material/21281280_柯劲帆_第1次实验报告.md @@ -0,0 +1,178 @@ + + + + + + + + +![cover](cover.png) + + + + + + + + + + + + + + + +# 一、实验目的 + +1. 进一步学习汇编语言基本指令使用方法; +2. 学习DEBUG调试工具的基本使用方法;掌握debug调试命令a、u、r、d、t、g等; +3. 逐条观察程序指令的执行过程,理解指令的功能,理解程序自动、顺序地执行的概念,实践其过程(重点)。 + +# 二、实验内容 + +1. 编写、输入一个32位二进制数相加程序,逐条执行指令,观察指令执行情况。 +1. 使用已经过汇编和连接的小程序(t3-2.exe),将其装入内存,逐条执行指令,观察执行过程和结果。在实验过程中,使用E命令修改XXX和YYY单元中的数据,再重新计算其结果。 + +# 三、流程图 + +第一题: + + ![graph1.drawio](graph1.drawio.svg) + +# 四、实验过程与分析 + +第一题: + +进入调试, -U + + ![1-1](1-1.png) + +-T + +![1-2](1-2.png) + +载入数据段后: + +![1-3](1-3.png) + +程序执行完毕后: + +![1-4](1-4.png) + +第二题: + +2-1 + +修改后: + +2-2 + +最终: + +2-3 + +程序实际效果:计算a:b的物理地址。 + +# 五、实验总结 + + 熟练掌握了各种指令以及调试步骤,收获颇丰。 + +# 六、思考题 + +> 程序中的指令、数据是如何在存储器中存储的? + +分别在不同的段中按顺序存储 + +> 如何理解程序执行过程的顺序性? + +程序按指令在代码段内存储的顺序执行。如需人为改变执行顺序,可以指定ip为要执行的指令的地址。 + +> 如何理解标志位寄存器中的数据? + + 标志寄存器在CPU内部,用于存储算术逻辑运算后的结果特征和控制CPU的工作方式或工作状态。 + +| 位数 | 符号 | 含义 | +| :--: | :--: | :--------: | +| 0 | CF | 进位标志 | +| 2 | PF | 奇偶标志 | +| 4 | AF | 半进位标志 | +| 6 | ZF | 零标志 | +| 7 | SF | 符号标志 | +| 8 | TF | 溢出标志 | +| 9 | IF | 方向标志 | +| 10 | DF | 中断标志 | +| 11 | OF | 跟踪标志 | + +# 源代码附录 + +第一题: + +```assembly +DATA SEGMENT + NUM1 DD 11451400H ; 被加数 + NUM2 DD 19198100H ; 加数 + SUM DD ? ; 结果 +DATA ENDS +CODE SEGMENT + ASSUME CS:CODE, DS:DATA + start: + MOV AX, DATA + MOV DS, AX + MOV AX, WORD PTR NUM1 ; 将NUM1低位赋给AX + MOV WORD PTR SUM, AX ; 将AX赋给SUM低位(MOV指令不能直接在两个内存单元间赋值) + MOV AX, WORD PTR NUM2 ; 将NUM2低位赋给AX + ADD WORD PTR SUM, AX ; 将AX加到SUM的低位上 + + MOV AX, WORD PTR NUM1+2 ; 将NUM1高位赋给AX + ADC WORD PTR SUM+2, AX ; ADC(Add with Carry)将AX加到SUM的高位(初始为零)上,再加上CF存着的低位进位 + MOV AX, WORD PTR NUM2+2 ; 将NUM2高位赋给AX + ADD WORD PTR SUM+2, AX ; 将AX加到SUM的高位上 + MOV AH, 4CH ; 退出程序 + INT 21H +CODE ENDS +END start +``` + +第二题: + +```assembly +DSEG SEGMENT + XXX DW 1234H + YYY DW 5678H + ZZZ DD ? +DSEG ENDS + +CSEG SEGMENT + ASSUME CS:CSEG, DS:DSEG + START: + MOV AX, DSEG + MOV DS, AX + + MOV AX, XXX ; 将XXX赋给AX + XOR DX, DX ; 异或DX和DX,即将DX置0 + + ADD AX, AX ; AX *= 2, AX = 2 * XXX + ADC DX, 0 ; 把进位保存在DX中 + + ADD AX, AX ; AX *= 2, AX = 4 * XXX + ADC DX, 0 ; 更新DX中的进位信息 + + ADD AX, AX ; AX *= 2, AX = 8 * XXX + ADC DX, 0 ; 更新DX中的进位信息 + + ADD AX, AX ; AX *= 2, AX = 16 * XXX + ADC DX, 0 ; 更新DX中的进位信息 + + ADD AX, YYY ; AX += YYY, AX = 16 * XXX + YYY + ADC DX, 0 ; 更新DX中的进位信息 + + MOV WORD PTR ZZZ, AX ; ZZZ的低位 = AX = 16 * XXX + YYY + MOV WORD PTR ZZZ+2, DX ; ZZZ的高位 = DX = 进位数, ZZZ = 16 * XXX + YYY(完整) + + MOV AH, 4CH + INT 21H +CSEG ENDS + END START + +``` + diff --git a/Lab/Lab1/material/21281280_柯劲帆_第1次实验报告.pdf b/Lab/Lab1/material/21281280_柯劲帆_第1次实验报告.pdf new file mode 100755 index 0000000..07a0d96 Binary files /dev/null and b/Lab/Lab1/material/21281280_柯劲帆_第1次实验报告.pdf differ diff --git a/Lab/Lab1/material/cover.png b/Lab/Lab1/material/cover.png new file mode 100755 index 0000000..97b2eeb Binary files /dev/null and b/Lab/Lab1/material/cover.png differ diff --git a/Lab/Lab1/material/graph1.drawio b/Lab/Lab1/material/graph1.drawio new file mode 100755 index 0000000..3d940de --- /dev/null +++ b/Lab/Lab1/material/graph1.drawio @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Lab/Lab1/material/graph1.drawio.svg b/Lab/Lab1/material/graph1.drawio.svg new file mode 100755 index 0000000..75180b5 --- /dev/null +++ b/Lab/Lab1/material/graph1.drawio.svg @@ -0,0 +1,4 @@ + + + +
载入数据段
载入数据段
将NUM1和NUM2的低字段内容相加填入SUM的低字段
将NUM1和NUM2的低字段内容相加填入SUM的低字段
将NUM1的高字段内容与上次相加结果的进位相加填入SUM的高字段
将NUM1的高字段内容与上次相加结果的进位相加填入SUM的高字段
将NUM2的高字段内容与SUM的高字段内容相加填入SUM的高字段
将NUM2的高字段内容与SUM的高字段内容相加填入SUM的高字段
结束程序
结束程序
开始执行程序段
开始执行程序段
Text is not SVG - cannot display
\ No newline at end of file diff --git a/Lab/Lab1/实验1 debug调试环境.doc b/Lab/Lab1/实验1 debug调试环境.doc new file mode 100755 index 0000000..90a2449 Binary files /dev/null and b/Lab/Lab1/实验1 debug调试环境.doc differ diff --git a/Lab/Lab1/开发环境建立和DEBUG调试工具介绍.pdf b/Lab/Lab1/开发环境建立和DEBUG调试工具介绍.pdf new file mode 100755 index 0000000..db87154 Binary files /dev/null and b/Lab/Lab1/开发环境建立和DEBUG调试工具介绍.pdf differ diff --git a/Lab/Lab2/21281280_柯劲帆_第2次实验_查找字符.zip b/Lab/Lab2/21281280_柯劲帆_第2次实验_查找字符.zip new file mode 100755 index 0000000..3b0f680 Binary files /dev/null and b/Lab/Lab2/21281280_柯劲帆_第2次实验_查找字符.zip differ diff --git a/Lab/Lab2/21281280_柯劲帆_第2次实验_查找字符/21281280_柯劲帆_实验2报告.pdf b/Lab/Lab2/21281280_柯劲帆_第2次实验_查找字符/21281280_柯劲帆_实验2报告.pdf new file mode 100755 index 0000000..62c4b4d Binary files /dev/null and b/Lab/Lab2/21281280_柯劲帆_第2次实验_查找字符/21281280_柯劲帆_实验2报告.pdf differ diff --git a/Lab/Lab2/21281280_柯劲帆_第2次实验_查找字符/code.asm b/Lab/Lab2/21281280_柯劲帆_第2次实验_查找字符/code.asm new file mode 100755 index 0000000..4b31cf3 --- /dev/null +++ b/Lab/Lab2/21281280_柯劲帆_第2次实验_查找字符/code.asm @@ -0,0 +1,55 @@ +DATA SEGMENT +CHAR DB 'A' +HINT1 DB 'Please enter a string: $' +HINT2 DB 10, 27H, 'A', 27H, ' occured time: $' +TIMES DB 0 +MAXLEN DB 100 +LEN DB 0 +TABLE DB 100 DUP (0) +DATA ENDS + +CODE SEGMENT + ASSUME CS:CODE, DS:DATA + +START: + MOV AX, DATA + MOV DS, AX + MOV AH, 9 + MOV DX, OFFSET HINT1 + INT 21H + + LEA DX, MAXLEN + MOV AH, 0AH + INT 21H + + CALL CNT + MOV AH, 9 + MOV DX, OFFSET HINT2 + INT 21H + + MOV AL, TIMES + ADD AL, '0' + MOV DL, AL + MOV AH, 02 + INT 21H + + MOV AH,4CH + INT 21H + +CNT PROC NEAR + MOV CX, 0 + MOV CL, LEN + MOV SI, -1 + MOV AL, CHAR +LP: + INC SI + CMP AL, TABLE[SI] + JNZ BACK + INC TIMES +BACK: + LOOP LP + RET +CNT ENDP + +CODE ENDS +END START diff --git a/Lab/Lab2/material/.$graph.drawio.bkp b/Lab/Lab2/material/.$graph.drawio.bkp new file mode 100755 index 0000000..f64fc42 --- /dev/null +++ b/Lab/Lab2/material/.$graph.drawio.bkp @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Lab/Lab2/material/.$graph.drawio.dtmp b/Lab/Lab2/material/.$graph.drawio.dtmp new file mode 100755 index 0000000..2be106d --- /dev/null +++ b/Lab/Lab2/material/.$graph.drawio.dtmp @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Lab/Lab2/material/1.png b/Lab/Lab2/material/1.png new file mode 100755 index 0000000..9848b74 Binary files /dev/null and b/Lab/Lab2/material/1.png differ diff --git a/Lab/Lab2/material/2.png b/Lab/Lab2/material/2.png new file mode 100755 index 0000000..ca499c8 Binary files /dev/null and b/Lab/Lab2/material/2.png differ diff --git a/Lab/Lab2/material/21281280_柯劲帆_实验2报告.md b/Lab/Lab2/material/21281280_柯劲帆_实验2报告.md new file mode 100755 index 0000000..d3bac13 --- /dev/null +++ b/Lab/Lab2/material/21281280_柯劲帆_实验2报告.md @@ -0,0 +1,155 @@ +![cover](cover.png) + + + + + + + + + + + + + + + +# 一、实验目的 + +1. 了解汇编语言子程序的概念。 +2. 掌握汇编语言子程序的定义、调用和返回。 +3. 掌握设计汇编语言子程序及过程的基本方法。 +4. 清楚调用指令CALL及返回指令RET执行时堆栈内容及指针的变化。 +5. 掌握子程序和主程序间的参数传递方法。 + +# 二、实验内容 + +试编写一个有主程序和子程序结构的程序模块。 + +主程序:要求从键盘接收一串字符并存于字节数组TABLE中,显示字符CHAR出现的次数。 + +子程序:在以TABLE为首地址的字节数组中查找CHAR,统计出现的次数。 + +# 三、流程图 + +![graph](graph.drawio.svg) + +# 四、实验过程与分析 + +![1](1.png) + +将源代码放入MASM路径下,编译。 + +没有警告和报错。 + +![2](2.png) + +LINK链接程序。 + +![3](3.png) + +出现提示信息。 + +![4](4.png) + +输入字符串,按下回车。 + +程序打印出指定字符“**A**”出现的次数。 + +# 五、实验总结 + +在本实验中,我了解了汇编语言子程序的概念,掌握了汇编语言子程序的定义、调用和返回,以及设计汇编语言子程序及过程的基本方法。 + +# 六、思考题 + +> 子程序和主程序之间的参数传递是通过什么方式实现的? + +通常情况下,主、子程序之间传递参数可以通过以下四种方式实现: + +1. 寄存器传送参数 +2. 存储单元传送参数 +3. 堆栈传送参数或参数地址 +4. 多模块之间的参数传递 + +**本实验程序使用寄存器传递参数。** + +> 在DEBUG环境下观察执行CALL指令时CS、IP寄存器是否变化。 + +![5](5.png) + +执行CALL指令的时候 + +- 如果是段内近调用,不会改变CS,但是IP会改变。(本实验程序是这种情况,如图所示可见CS不变,IP变) +- 如果是远调用,CS和IP都会改变。 + +> 在DEBUG环境下观察执行CALL、RET时堆栈的变化。 + +![6](6.png) + +![7](7.png) + +由执行CALL前后SP值的变化和对应地址记录的值,可知由于是近调用,将IP压入栈中记录,SP记录了要返回的IP=0017H。 + +(由于DEBUG环境无法输入字符串,很难观测RET指令执行时的情况。实际上RET时,SP会回退,原来CS和IP的值会退栈,然后赋值给当前的CS和IP。) + +# 源代码附录 + +```assembly +DATA SEGMENT + CHAR DB 'A' + HINT1 DB 'Please enter a string: $' + HINT2 DB 10, 27H, 'A', 27H, ' occured time: $' + TIMES DB 0 + MAXLEN DB 100 + LEN DB 0 + TABLE DB 100 DUP (0) +DATA ENDS + +CODE SEGMENT + ASSUME CS:CODE, DS:DATA + + START: + MOV AX, DATA + MOV DS, AX + + MOV DX, OFFSET HINT1 ; 将HINT1的偏移地址赋给DX准备输出 + MOV AH, 9 ; 输出 + INT 21H + + LEA DX, MAXLEN ; 0AH功能会获取DS:[DX](已定义为MAXLEN)作为输入缓冲区最大容量 + MOV AH, 0AH ; 调用0AH功能,将输入的字符串长度存入DS:[DX+1](已定义为LEN) + INT 21H ; 将字符串存入从DS:DX+2开始的空间(已定义为TABLE) + + CALL CNT ; 统计字符“A”的数量,结果在TIMES中 + MOV DX, OFFSET HINT2 ; 将HINT2的偏移地址赋给DX准备输出 + MOV AH, 9 ; 输出 + INT 21H + + MOV AL, TIMES + ADD AL, '0' ; TIMES += '0' (将数字信息转换成字符) + MOV DL, AL + MOV AH, 02H ; 显示单个字符 + INT 21H + + MOV AH,4CH + INT 21H + +CNT PROC NEAR + MOV CX, 0 + MOV CL, LEN + MOV SI, -1 ; SI是遍历TABLE的下标 + MOV AL, CHAR ; 要比较的字符移到AL中(CMP不能比较两个内存单元) + LP: + INC SI + CMP AL, TABLE[SI] + JNE BACK ; 不相等则跳过INC TIMES,重新循环 + INC TIMES + BACK: + LOOP LP ; LOOP先将CX -= 1,然后判断是否为0,为0就退出循环 + RET +CNT ENDP + +CODE ENDS +END START +``` + diff --git a/Lab/Lab2/material/21281280_柯劲帆_实验2报告.pdf b/Lab/Lab2/material/21281280_柯劲帆_实验2报告.pdf new file mode 100755 index 0000000..5025b77 Binary files /dev/null and b/Lab/Lab2/material/21281280_柯劲帆_实验2报告.pdf differ diff --git a/Lab/Lab2/material/3.png b/Lab/Lab2/material/3.png new file mode 100755 index 0000000..d0d4fe2 Binary files /dev/null and b/Lab/Lab2/material/3.png differ diff --git a/Lab/Lab2/material/4.png b/Lab/Lab2/material/4.png new file mode 100755 index 0000000..25d148c Binary files /dev/null and b/Lab/Lab2/material/4.png differ diff --git a/Lab/Lab2/material/5.png b/Lab/Lab2/material/5.png new file mode 100755 index 0000000..9fa15b4 Binary files /dev/null and b/Lab/Lab2/material/5.png differ diff --git a/Lab/Lab2/material/6.png b/Lab/Lab2/material/6.png new file mode 100755 index 0000000..15858a6 Binary files /dev/null and b/Lab/Lab2/material/6.png differ diff --git a/Lab/Lab2/material/7.png b/Lab/Lab2/material/7.png new file mode 100755 index 0000000..625f4c5 Binary files /dev/null and b/Lab/Lab2/material/7.png differ diff --git a/Lab/Lab2/material/code.asm b/Lab/Lab2/material/code.asm new file mode 100755 index 0000000..2fcbe22 --- /dev/null +++ b/Lab/Lab2/material/code.asm @@ -0,0 +1,56 @@ +DATA SEGMENT + CHAR DB 'A' + HINT1 DB 'Please enter a string: $' + HINT2 DB 10, 27H, 'A', 27H, ' occured time: $' + TIMES DB 0 + MAXLEN DB 100 + LEN DB 0 + TABLE DB 100 DUP (0) +DATA ENDS + +CODE SEGMENT + ASSUME CS:CODE, DS:DATA + + START: + MOV AX, DATA + MOV DS, AX + + MOV DX, OFFSET HINT1 ; 将HINT1的偏移地址赋给DX准备输出 + MOV AH, 9 ; 输出 + INT 21H + + LEA DX, MAXLEN ; 0AH功能会获取DS:[DX](已定义为MAXLEN)作为输入缓冲区最大容量 + MOV AH, 0AH ; 调用0AH功能,将输入的字符串长度存入DS:[DX+1](已定义为LEN) + INT 21H ; 将字符串存入从DS:DX+2开始的空间(已定义为TABLE) + + CALL CNT ; 统计字符“A”的数量,结果在TIMES中 + MOV DX, OFFSET HINT2 ; 将HINT2的偏移地址赋给DX准备输出 + MOV AH, 9 ; 输出 + INT 21H + + MOV AL, TIMES + ADD AL, '0' ; TIMES += '0' (将数字信息转换成字符) + MOV DL, AL + MOV AH, 02H ; 显示单个字符 + INT 21H + + MOV AH,4CH + INT 21H + +CNT PROC NEAR + MOV CX, 0 + MOV CL, LEN + MOV SI, -1 ; SI是遍历TABLE的下标 + MOV AL, CHAR ; 要比较的字符移到AL中(CMP不能比较两个内存单元) + LP: + INC SI + CMP AL, TABLE[SI] + JNE BACK ; 不相等则跳过INC TIMES,重新循环 + INC TIMES + BACK: + LOOP LP ; LOOP先将CX -= 1,然后判断是否为0,为0就退出循环 + RET +CNT ENDP + +CODE ENDS +END START diff --git a/Lab/Lab2/material/cover.png b/Lab/Lab2/material/cover.png new file mode 100755 index 0000000..2272373 Binary files /dev/null and b/Lab/Lab2/material/cover.png differ diff --git a/Lab/Lab2/material/graph.drawio b/Lab/Lab2/material/graph.drawio new file mode 100755 index 0000000..ad3ed83 --- /dev/null +++ b/Lab/Lab2/material/graph.drawio @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Lab/Lab2/material/graph.drawio.svg b/Lab/Lab2/material/graph.drawio.svg new file mode 100755 index 0000000..c639862 --- /dev/null +++ b/Lab/Lab2/material/graph.drawio.svg @@ -0,0 +1,4 @@ + + + +
程序开始
程序开始
载入数据段
载入数据段
输出提示信息
输出提示信息
读取字符串
读取字符串
将字符串当前位数加1
将字符串当前位数加1
N
N
Y
Y
循环次数是否用尽?
循环次数是否用尽?
Y
Y
N
N
字符串的当前位与指定字符比较是否一样
字符串的当前位与指定字符比较是否一样
结果加1
结果加1
输出答案
输出答案
程序结束
程序结束
指定循环次数为字符串长度
指定循环次数为字符串长度
调用CNT子程序
调用CNT子程序
Text is not SVG - cannot display
\ No newline at end of file diff --git a/Lab/Lab2/实验2 查找字符.doc b/Lab/Lab2/实验2 查找字符.doc new file mode 100755 index 0000000..68dad73 Binary files /dev/null and b/Lab/Lab2/实验2 查找字符.doc differ diff --git a/Lab/Lab3/21281280_柯劲帆_第3次实验_8255A实验.zip b/Lab/Lab3/21281280_柯劲帆_第3次实验_8255A实验.zip new file mode 100755 index 0000000..2b676c1 Binary files /dev/null and b/Lab/Lab3/21281280_柯劲帆_第3次实验_8255A实验.zip differ diff --git a/Lab/Lab3/21281280_柯劲帆_第3次实验_8255A实验/21281280_柯劲帆_第3次实验_8255A实验.pdf b/Lab/Lab3/21281280_柯劲帆_第3次实验_8255A实验/21281280_柯劲帆_第3次实验_8255A实验.pdf new file mode 100755 index 0000000..6bf1ed7 Binary files /dev/null and b/Lab/Lab3/21281280_柯劲帆_第3次实验_8255A实验/21281280_柯劲帆_第3次实验_8255A实验.pdf differ diff --git a/Lab/Lab3/21281280_柯劲帆_第3次实验_8255A实验/任务一演示.mp4 b/Lab/Lab3/21281280_柯劲帆_第3次实验_8255A实验/任务一演示.mp4 new file mode 100755 index 0000000..de6b75d Binary files /dev/null and b/Lab/Lab3/21281280_柯劲帆_第3次实验_8255A实验/任务一演示.mp4 differ diff --git a/Lab/Lab3/material/.$task1.drawio.bkp b/Lab/Lab3/material/.$task1.drawio.bkp new file mode 100755 index 0000000..763e23f --- /dev/null +++ b/Lab/Lab3/material/.$task1.drawio.bkp @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Lab/Lab3/material/.$task1.drawio.dtmp b/Lab/Lab3/material/.$task1.drawio.dtmp new file mode 100755 index 0000000..4dc2eae --- /dev/null +++ b/Lab/Lab3/material/.$task1.drawio.dtmp @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Lab/Lab3/material/21281280_柯劲帆_第3次实验_8255A实验.md b/Lab/Lab3/material/21281280_柯劲帆_第3次实验_8255A实验.md new file mode 100755 index 0000000..abb7f0c --- /dev/null +++ b/Lab/Lab3/material/21281280_柯劲帆_第3次实验_8255A实验.md @@ -0,0 +1,240 @@ + + + + + + + + + + +![cover](cover.png) + + + + + + + + + + + +

实验二 利用8255A实现LED的流水点亮实验

+ +### 一、实验目的 + +该实验的目的在于掌握8255A和微机接口的连接方法,了解8255A的基本的工作原理和编程方法。 + +### 二、实验内容 + +**任务一:**PA口接8个拨动开关K1-K8,PB口接8个LED。初始由开关K1-K8设定8位不同的值,当执行程序后LED按K1-K8初始设定的值点亮,并向右流动(8255A工作在0方式)。 + +**任务二:**在数码管上显示“8255-A”。 + +### 三、流程图 + +**任务一:** + +![task1.drawio](task1.drawio.svg) + +**任务二:** + +![task2.drawio](task2.drawio.svg) + +### 四、实验过程与分析 + +**任务一:** + +首先在实验箱中将接线连好。将8255A芯片的CS连到280H地址。因此命令口为283H,PA口为280H,PB口为281H,PC口为282H。 + +将PA口连到开关上,PB口连到LED灯上。 + +然后设置好开关。将代码编译后运行。运行效果如视频所示。 + +**任务二:** + +首先在实验箱中将接线连好。将8255A芯片的CS连到280H地址。将PA口连到位码接口上,PB口连到段码接口上。 + +task2 + +将代码编译后运行。运行效果如图所示。 + +### 五、实验总结 + +在本实验中,我掌握了8255A和微机接口的连接方法,了解了8255A的基本的工作原理和编程方法,收获颇丰。 + +### 六、思考题 + +> 在本实验的硬件电路中,能使用C口对LED指示灯控制码?如果可以写出2种控制方法(编程方法)。 + +**控制方法一:**使用命令口直接将PC口置位。 + +```assembly +MOV DX, 283H ; 设置命令口 +MOV AL, 00000101B ; 0|xxx|010(指定PC2引脚)|1(置位) +OUT DX, AL ; 输出 +``` + +**控制方法二:**使用方式0,将PC口置为数据输出口。 + +```assembly +MOV DX, 283H +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, 282H +MOV AL, 00000001B ; PC1为高电平 +OUT DX, AL +``` + +### 源代码附录 + +**任务一:** + +```assembly +DATA SEGMENT + T DW 0FFH +DATA ENDS + +CODE SEGMENT + ASSUME CS:CODE, DS:DATA + + START: + MOV AX, DATA + MOV DS, AX + + MOV DX, 283H ; 命令口 + MOV AL, 10010000B ; 1|00(A组0方式)|1(PA输入)|0(PC4-7输出)|0(B组0方式)|0(PB输出)|0(PC0-3输出) + OUT DX, AL + + MOV DX, 281H ; B口 + MOV AL, 00H ; LED全置0 + OUT DX, AL + + MOV DX, 280H ; A口 + IN AL, DX ; 读入到AL + + MOV DX, 281H ; B口 + LP: + OUT DX, AL ; 从B口输出AL + CALL DELAY ; 延时 + ROR AL, 1 ; ROR(Rotate Right)把AL向右移1位,移出的位补到左边,实现走马灯 + JMP LP ; 无限循环 + +DELAY PROC + PUSH BX + PUSH AX + MOV BX, T + MOV AX, T + DL1: + DL2: + DEC BX + JNZ DL1 + DEC AX + JNZ DL2 + POP AX + POP BX + RET +DELAY ENDP + +CODE ENDS +END START +``` + +**任务二:** + +```assembly +DATA SEGMENT + EIGHT DB 7FH + TWO DB 5BH + FIVE DB 6DH + BAR DB 40H + A DB 77H + T DW 0FFH +DATA ENDS + +CODE SEGMENT + ASSUME CS:CODE, DS:DATA + + START: + MOV AX, DATA + MOV DS, AX + + MOV DX, 283H ; 命令口 + MOV AL, 10000000B ; 1|00(A组0方式)|0(PA输出)|0(PC4-7输出)|0(B组0方式)|0(PB输出)|0(PC0-3输出) + OUT DX, AL + + + LP: + MOV DX, 280H ; A口,控制位码 + MOV AL, 10000000B ; 第1位,PA1置1 + OUT DX, AL + MOV DX, 281H ; B口,控制段码 + MOV AL, EIGHT ; 输出数据段定义的字符“8” + OUT DX, AL + CALL DELAY ; 延时后清零 + + MOV DX, 280H + MOV AL, 01000000B ; 第2位,PA2置1 + OUT DX, AL + MOV DX, 281H + MOV AL, TWO ; 输出数据段定义的字符“2” + OUT DX, AL + CALL DELAY + + MOV DX, 280H + MOV AL, 00100000B ; 第3位,PA3置1 + OUT DX, AL + MOV DX, 281H + MOV AL, FIVE ; 输出数据段定义的字符“5” + OUT DX, AL + CALL DELAY + + MOV DX, 280H + MOV AL, 00010000B ; 第4位,PA4置1 + OUT DX, AL + MOV DX, 281H + MOV AL, FIVE ; 输出数据段定义的字符“5” + OUT DX, AL + CALL DELAY + + MOV DX, 280H + MOV AL, 00001000B ; 第5位,PA5置1 + OUT DX, AL + MOV DX, 281H + MOV AL, BAR ; 输出数据段定义的字符“-” + OUT DX, AL + CALL DELAY + + MOV DX, 280H + MOV AL, 00000100B ; 第6位,PA6置1 + OUT DX, AL + MOV DX, 281H + MOV AL, A ; 输出数据段定义的字符“A” + OUT DX, AL + CALL DELAY + + JMP LP ; 无限循环 + +DELAY PROC + PUSH BX + MOV BX, T + DL1: + DEC BX + JNZ DL1 + POP BX + ; 将位码段码都置0,否则前一位显示的字符会在显示下一位字符显示前在该位上显示 + MOV DX, 280H + MOV AL, 00000000B + OUT DX, AL + MOV DX, 281H + MOV AL, 0 + OUT DX, AL + + RET +DELAY ENDP + +CODE ENDS +END START +``` \ No newline at end of file diff --git a/Lab/Lab3/material/21281280_柯劲帆_第3次实验_8255实验.pdf b/Lab/Lab3/material/21281280_柯劲帆_第3次实验_8255实验.pdf new file mode 100755 index 0000000..26bd014 Binary files /dev/null and b/Lab/Lab3/material/21281280_柯劲帆_第3次实验_8255实验.pdf differ diff --git a/Lab/Lab3/material/cover.png b/Lab/Lab3/material/cover.png new file mode 100755 index 0000000..89b5c73 Binary files /dev/null and b/Lab/Lab3/material/cover.png differ diff --git a/Lab/Lab3/material/task1.drawio b/Lab/Lab3/material/task1.drawio new file mode 100755 index 0000000..74a6d5b --- /dev/null +++ b/Lab/Lab3/material/task1.drawio @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Lab/Lab3/material/task1.drawio.svg b/Lab/Lab3/material/task1.drawio.svg new file mode 100755 index 0000000..faa29c5 --- /dev/null +++ b/Lab/Lab3/material/task1.drawio.svg @@ -0,0 +1,4 @@ + + + +
程序开始
程序开始
向命令口发送命令,将PA口置为0方式输入,PB口置为0方式输出
向命令口发送命令,将PA口置为0方式输入,PB口置为0方式输出
将PB口输出全零,灭掉所有LED灯
将PB口输出全零,灭掉所有LED灯
通过PA口获取各个开关状态到AL
通过PA口获取各个开关状态到AL
向PB口输出AL
向PB口输出AL
进入延时子程序,延时一小段时间
进入延时子程序,延时一小段时间
使用ROR指令AL向右移一位
使用ROR指令AL向右移一位
Text is not SVG - cannot display
\ No newline at end of file diff --git a/Lab/Lab3/material/task1.jpg b/Lab/Lab3/material/task1.jpg new file mode 100755 index 0000000..2dd25dc Binary files /dev/null and b/Lab/Lab3/material/task1.jpg differ diff --git a/Lab/Lab3/material/task1/code.EXE b/Lab/Lab3/material/task1/code.EXE new file mode 100755 index 0000000..916fb36 Binary files /dev/null and b/Lab/Lab3/material/task1/code.EXE differ diff --git a/Lab/Lab3/material/task1/code.LST b/Lab/Lab3/material/task1/code.LST new file mode 100755 index 0000000..723763b --- /dev/null +++ b/Lab/Lab3/material/task1/code.LST @@ -0,0 +1,80 @@ +Turbo Assembler Version 5.3 05-06-23 19:07:51 Page 1 +code.asm + + + + 1 0000 DATA SEGMENT + 2 0000 00FF T DW 0FFH + 3 0002 DATA ENDS + 4 + 5 0000 CODE SEGMENT + 6 ASSUME CS:CODE,DS:DATA + 7 + 8 0000 START: + 9 0000 B8 0000s MOV AX,DATA + 10 0003 8E D8 MOV DS,AX + 11 + 12 0005 BA 0283 MOV DX, 283H + 13 0008 B0 B1 MOV AL, 0B1H + 14 000A EE OUT DX, AL + 15 + 16 000B BA 0281 MOV DX, 281H + 17 000E B0 00 MOV AL, 00H + 18 0010 EE OUT DX, AL + 19 + 20 0011 BA 0280 MOV DX, 280H + 21 0014 EC IN AL, DX + 22 + 23 0015 BA 0281 MOV DX, 281H + 24 0018 LP: + 25 0018 EE OUT DX, AL + 26 0019 E8 0004 CALL DELAY + 27 001C D0 C8 ROR AL, 1 + 28 001E EB F8 JMP LP + 29 + 30 0020 DELAY PROC + 31 0020 53 PUSH BX + 32 0021 50 PUSH AX + 33 0022 8B 1E 0000r MOV BX, T + 34 0026 A1 0000r MOV AX, T + 35 0029 DL1: + 36 0029 DL2: + 37 0029 4B DEC BX + 38 002A 75 FD JNZ DL1 + 39 002C 48 DEC AX + 40 002D 75 FA JNZ DL2 + 41 002F 58 POP AX + 42 0030 5B POP BX + 43 0031 C3 RET + 44 0032 DELAY ENDP + 45 + 46 0032 CODE ENDS + 47 END START + Turbo Assembler Version 5.3 05-06-23 19:07:51 Page 2 +Symbol Table + + + + +Symbol Name Type Value + +??DATE Text "05-06-23" +??FILENAME Text "code " +??TIME Text "19:07:51" +??VERSION Number 0503 +@CPU Text 0101H +@CURSEG Text CODE +@FILENAME Text CODE +@WORDSIZE Text 2 +DELAY Near16 CODE:0020 +DL1 Near16 CODE:0029 +DL2 Near16 CODE:0029 +LP Near16 CODE:0018 +START Near16 CODE:0000 +T Word DATA:0000 + +Groups & Segments Bit Size Align Combine Class + +CODE 16 0032 Para none +DATA 16 0002 Para none + \ No newline at end of file diff --git a/Lab/Lab3/material/task1/code.MAP b/Lab/Lab3/material/task1/code.MAP new file mode 100755 index 0000000..4934528 --- /dev/null +++ b/Lab/Lab3/material/task1/code.MAP @@ -0,0 +1,7 @@ +LINK : warning L4021: no stack segment + + Start Stop Length Name Class + 00000H 00001H 00002H DATA + 00010H 00041H 00032H CODE + +Program entry point at 0001:0000 diff --git a/Lab/Lab3/material/task1/code.OBJ b/Lab/Lab3/material/task1/code.OBJ new file mode 100755 index 0000000..ea462e8 Binary files /dev/null and b/Lab/Lab3/material/task1/code.OBJ differ diff --git a/Lab/Lab3/material/task1/code.asm b/Lab/Lab3/material/task1/code.asm new file mode 100755 index 0000000..4c5486f --- /dev/null +++ b/Lab/Lab3/material/task1/code.asm @@ -0,0 +1,47 @@ +DATA SEGMENT + T DW 0FFH +DATA ENDS + +CODE SEGMENT + ASSUME CS:CODE, DS:DATA + + START: + MOV AX, DATA + MOV DS, AX + + MOV DX, 283H ; 命令口 + MOV AL, 10010000B ; 1|00(A组0方式)|1(PA输入)|0(PC4-7输出)|0(B组0方式)|0(PB输出)|0(PC0-3输出) + OUT DX, AL + + MOV DX, 281H ; B口 + MOV AL, 00H ; LED全置0 + OUT DX, AL + + MOV DX, 280H ; A口 + IN AL, DX ; 读入到AL + + MOV DX, 281H ; B口 + LP: + OUT DX, AL ; 从B口输出AL + CALL DELAY ; 延时 + ROR AL, 1 ; ROR(Rotate Right)把AL向右移1位,移出的位补到左边,实现走马灯 + JMP LP ; 无限循环 + +DELAY PROC + PUSH BX + PUSH AX + MOV BX, T + MOV AX, T + DL1: + DL2: + DEC BX + JNZ DL1 + DEC AX + JNZ DL2 + POP AX + POP BX + RET +DELAY ENDP + +CODE ENDS +END START \ No newline at end of file diff --git a/Lab/Lab3/material/task2.drawio b/Lab/Lab3/material/task2.drawio new file mode 100755 index 0000000..f9a54da --- /dev/null +++ b/Lab/Lab3/material/task2.drawio @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Lab/Lab3/material/task2.drawio.svg b/Lab/Lab3/material/task2.drawio.svg new file mode 100755 index 0000000..ac80c97 --- /dev/null +++ b/Lab/Lab3/material/task2.drawio.svg @@ -0,0 +1,4 @@ + + + +
程序开始
程序开始
向命令口发送命令,将PA口和PB口全部置为0方式输出
向命令口发送命令,将PA口和PB口全部置为0方式输出
从PA口输出位码10000000B控制数码管第1位显示字符
从PA口输出位码10000000B控制数码管第1位显示字符
从PB口输出段码控制数码管显示字符“8”
从PB口输出段码控制数码管显示字符“8”
进入延时子程序
进入延时子程序
循环延时
循环延时
从PA口输出,将位码置0,控制数码管不显示
从PA口输出,将位码置0,控制数码管不显示
从PB口输出,将段码置0,控制数码管不显示字符
从PB口输出,将段码置0,控制数码管不显示字符
从PA口输出位码00000100B控制数码管第6位显示字符
从PA口输出位码00000100B控制数码管第6位显示字符
从PB口输出段码控制数码管显示字符“A”
从PB口输出段码控制数码管显示字符“A”
进入延时子程序
进入延时子程序
Text is not SVG - cannot display
\ No newline at end of file diff --git a/Lab/Lab3/material/task2.jpg b/Lab/Lab3/material/task2.jpg new file mode 100755 index 0000000..b7febab Binary files /dev/null and b/Lab/Lab3/material/task2.jpg differ diff --git a/Lab/Lab3/material/task2/code.EXE b/Lab/Lab3/material/task2/code.EXE new file mode 100755 index 0000000..1802a72 Binary files /dev/null and b/Lab/Lab3/material/task2/code.EXE differ diff --git a/Lab/Lab3/material/task2/code.LST b/Lab/Lab3/material/task2/code.LST new file mode 100755 index 0000000..7bb4708 --- /dev/null +++ b/Lab/Lab3/material/task2/code.LST @@ -0,0 +1,134 @@ +Turbo Assembler Version 5.3 05-06-23 19:11:34 Page 1 +code.asm + + + + 1 0000 DATA SEGMENT + 2 0000 7F EIGHT DB 7FH + 3 0001 5B TWO DB 5BH + 4 0002 6D FIVE DB 6DH + 5 0003 40 BAR DB 40H + 6 0004 77 A DB 77H + 7 0005 00FF T DW 0FFH + 8 0007 DATA ENDS + 9 + 10 0000 CODE SEGMENT + 11 ASSUME CS:CODE, DS:DATA + 12 + 13 0000 START: + 14 0000 B8 0000s MOV AX, DATA + 15 0003 8E D8 MOV DS, AX + 16 + 17 0005 BA 0283 MOV DX, 283H + 18 0008 B0 80 MOV AL, 10000000B + 19 000A EE OUT DX, AL + 20 + 21 + 22 000B LP: + 23 000B BA 0280 MOV DX, 280H + 24 000E B0 80 MOV AL, 10000000B + 25 0010 EE OUT DX, AL + 26 0011 BA 0281 MOV DX, 281H + 27 0014 A0 0000r MOV AL, EIGHT + 28 0017 EE OUT DX, AL + 29 0018 E8 0051 CALL DELAY + 30 + 31 001B BA 0280 MOV DX, 280H + 32 001E B0 40 MOV AL, 01000000B + 33 0020 EE OUT DX, AL + 34 0021 BA 0281 MOV DX, 281H + 35 0024 A0 0001r MOV AL, TWO + 36 0027 EE OUT DX, AL + 37 0028 E8 0041 CALL DELAY + 38 + 39 002B BA 0280 MOV DX, 280H + 40 002E B0 20 MOV AL, 00100000B + 41 0030 EE OUT DX, AL + 42 0031 BA 0281 MOV DX, 281H + 43 0034 B0 6D MOV AL, 6DH + 44 0036 EE OUT DX, AL + 45 0037 E8 0032 CALL DELAY + 46 + 47 003A BA 0280 MOV DX, 280H + 48 003D B0 10 MOV AL, 00010000B + 49 003F EE OUT DX, AL + 50 0040 BA 0281 MOV DX, 281H + 51 0043 A0 0002r MOV AL, FIVE + 52 0046 EE OUT DX, AL + 53 0047 E8 0022 CALL DELAY + 54 + 55 004A BA 0280 MOV DX, 280H + 56 004D B0 08 MOV AL, 00001000B + 57 004F EE OUT DX, AL + Turbo Assembler Version 5.3 05-06-23 19:11:34 Page 2 +code.asm + + + + 58 0050 BA 0281 MOV DX, 281H + 59 0053 A0 0003r MOV AL, BAR + 60 0056 EE OUT DX, AL + 61 0057 E8 0012 CALL DELAY + 62 + 63 005A BA 0280 MOV DX, 280H + 64 005D B0 04 MOV AL, 00000100B + 65 005F EE OUT DX, AL + 66 0060 BA 0281 MOV DX, 281H + 67 0063 A0 0004r MOV AL, A + 68 0066 EE OUT DX, AL + 69 0067 E8 0002 CALL DELAY + 70 + 71 006A EB 9F JMP LP + 72 + 73 006C DELAY PROC + 74 006C 53 PUSH BX + 75 006D 8B 1E 0005r MOV BX, T + 76 0071 DL1: + 77 0071 4B DEC BX + 78 0072 75 FD JNZ DL1 + 79 0074 5B POP BX + 80 + 81 0075 BA 0280 MOV DX, 280H + 82 0078 B0 00 MOV AL, 00000000B + 83 007A EE OUT DX, AL + 84 007B BA 0281 MOV DX, 281H + 85 007E B0 00 MOV AL, 0 + 86 0080 EE OUT DX, AL + 87 + 88 0081 C3 RET + 89 0082 DELAY ENDP + 90 + 91 0082 CODE ENDS + 92 END START + Turbo Assembler Version 5.3 05-06-23 19:11:34 Page 3 +Symbol Table + + + + +Symbol Name Type Value + +??DATE Text "05-06-23" +??FILENAME Text "code " +??TIME Text "19:11:34" +??VERSION Number 0503 +@CPU Text 0101H +@CURSEG Text CODE +@FILENAME Text CODE +@WORDSIZE Text 2 +A Byte DATA:0004 +BAR Byte DATA:0003 +DELAY Near16 CODE:006C +DL1 Near16 CODE:0071 +EIGHT Byte DATA:0000 +FIVE Byte DATA:0002 +LP Near16 CODE:000B +START Near16 CODE:0000 +T Word DATA:0005 +TWO Byte DATA:0001 + +Groups & Segments Bit Size Align Combine Class + +CODE 16 0082 Para none +DATA 16 0007 Para none + \ No newline at end of file diff --git a/Lab/Lab3/material/task2/code.MAP b/Lab/Lab3/material/task2/code.MAP new file mode 100755 index 0000000..48e9e8f --- /dev/null +++ b/Lab/Lab3/material/task2/code.MAP @@ -0,0 +1,7 @@ +LINK : warning L4021: no stack segment + + Start Stop Length Name Class + 00000H 00006H 00007H DATA + 00010H 00091H 00082H CODE + +Program entry point at 0001:0000 diff --git a/Lab/Lab3/material/task2/code.OBJ b/Lab/Lab3/material/task2/code.OBJ new file mode 100755 index 0000000..efba61b Binary files /dev/null and b/Lab/Lab3/material/task2/code.OBJ differ diff --git a/Lab/Lab3/material/task2/code.asm b/Lab/Lab3/material/task2/code.asm new file mode 100755 index 0000000..f43e396 --- /dev/null +++ b/Lab/Lab3/material/task2/code.asm @@ -0,0 +1,92 @@ +DATA SEGMENT + EIGHT DB 7FH + TWO DB 5BH + FIVE DB 6DH + BAR DB 40H + A DB 77H + T DW 0FFH +DATA ENDS + +CODE SEGMENT + ASSUME CS:CODE, DS:DATA + + START: + MOV AX, DATA + MOV DS, AX + + MOV DX, 283H ; 命令口 + MOV AL, 10000000B ; 1|00(A组0方式)|0(PA输出)|0(PC4-7输出)|0(B组0方式)|0(PB输出)|0(PC0-3输出) + OUT DX, AL + + + LP: + MOV DX, 280H ; A口,控制位码 + MOV AL, 10000000B ; 第1位,PA1置1 + OUT DX, AL + MOV DX, 281H ; B口,控制段码 + MOV AL, EIGHT ; 输出数据段定义的字符“8” + OUT DX, AL + CALL DELAY ; 延时后清零 + + MOV DX, 280H + MOV AL, 01000000B ; 第2位,PA2置1 + OUT DX, AL + MOV DX, 281H + MOV AL, TWO ; 输出数据段定义的字符“2” + OUT DX, AL + CALL DELAY + + MOV DX, 280H + MOV AL, 00100000B ; 第3位,PA3置1 + OUT DX, AL + MOV DX, 281H + MOV AL, FIVE ; 输出数据段定义的字符“5” + OUT DX, AL + CALL DELAY + + MOV DX, 280H + MOV AL, 00010000B ; 第4位,PA4置1 + OUT DX, AL + MOV DX, 281H + MOV AL, FIVE ; 输出数据段定义的字符“5” + OUT DX, AL + CALL DELAY + + MOV DX, 280H + MOV AL, 00001000B ; 第5位,PA5置1 + OUT DX, AL + MOV DX, 281H + MOV AL, BAR ; 输出数据段定义的字符“-” + OUT DX, AL + CALL DELAY + + MOV DX, 280H + MOV AL, 00000100B ; 第6位,PA6置1 + OUT DX, AL + MOV DX, 281H + MOV AL, A ; 输出数据段定义的字符“A” + OUT DX, AL + CALL DELAY + + JMP LP ; 无限循环 + +DELAY PROC + PUSH BX + MOV BX, T + DL1: + DEC BX + JNZ DL1 + POP BX + ; 将位码段码都置0,否则前一位显示的字符会在显示下一位字符显示前在该位上显示 + MOV DX, 280H + MOV AL, 00000000B + OUT DX, AL + MOV DX, 281H + MOV AL, 0 + OUT DX, AL + + RET +DELAY ENDP + +CODE ENDS +END START \ No newline at end of file diff --git a/Lab/Lab3/material/任务一演示.mp4 b/Lab/Lab3/material/任务一演示.mp4 new file mode 100755 index 0000000..de6b75d Binary files /dev/null and b/Lab/Lab3/material/任务一演示.mp4 differ diff --git a/Lab/Lab3/实验箱安装.doc b/Lab/Lab3/实验箱安装.doc new file mode 100755 index 0000000..17c46ed Binary files /dev/null and b/Lab/Lab3/实验箱安装.doc differ diff --git a/Lab/Lab3/接口技术实验平台补充内容.pptx b/Lab/Lab3/接口技术实验平台补充内容.pptx new file mode 100755 index 0000000..558a432 Binary files /dev/null and b/Lab/Lab3/接口技术实验平台补充内容.pptx differ diff --git a/Lab/Lab3/接口技术常规实验指导书.doc b/Lab/Lab3/接口技术常规实验指导书.doc new file mode 100755 index 0000000..0ab3385 Binary files /dev/null and b/Lab/Lab3/接口技术常规实验指导书.doc differ diff --git a/Lab/Lab4/21281280_柯劲帆_第4次实验_8254A不同工作方式的实验.zip b/Lab/Lab4/21281280_柯劲帆_第4次实验_8254A不同工作方式的实验.zip new file mode 100755 index 0000000..04df4af Binary files /dev/null and b/Lab/Lab4/21281280_柯劲帆_第4次实验_8254A不同工作方式的实验.zip differ diff --git a/Lab/Lab4/21281280_柯劲帆_第4次实验_8254A不同工作方式的实验/21281280_柯劲帆_第4次实验_8254A不同工作方式的实验.pdf b/Lab/Lab4/21281280_柯劲帆_第4次实验_8254A不同工作方式的实验/21281280_柯劲帆_第4次实验_8254A不同工作方式的实验.pdf new file mode 100755 index 0000000..a860707 Binary files /dev/null and b/Lab/Lab4/21281280_柯劲帆_第4次实验_8254A不同工作方式的实验/21281280_柯劲帆_第4次实验_8254A不同工作方式的实验.pdf differ diff --git a/Lab/Lab4/21281280_柯劲帆_第4次实验_8254A不同工作方式的实验/观测方式0演示.mp4 b/Lab/Lab4/21281280_柯劲帆_第4次实验_8254A不同工作方式的实验/观测方式0演示.mp4 new file mode 100755 index 0000000..95fe37f Binary files /dev/null and b/Lab/Lab4/21281280_柯劲帆_第4次实验_8254A不同工作方式的实验/观测方式0演示.mp4 differ diff --git a/Lab/Lab4/21281280_柯劲帆_第4次实验_8254A不同工作方式的实验/观测方式1演示.mp4 b/Lab/Lab4/21281280_柯劲帆_第4次实验_8254A不同工作方式的实验/观测方式1演示.mp4 new file mode 100755 index 0000000..a9f69bb Binary files /dev/null and b/Lab/Lab4/21281280_柯劲帆_第4次实验_8254A不同工作方式的实验/观测方式1演示.mp4 differ diff --git a/Lab/Lab4/21281280_柯劲帆_第4次实验_8254A不同工作方式的实验/观测方式4演示.mp4 b/Lab/Lab4/21281280_柯劲帆_第4次实验_8254A不同工作方式的实验/观测方式4演示.mp4 new file mode 100755 index 0000000..2e24daf Binary files /dev/null and b/Lab/Lab4/21281280_柯劲帆_第4次实验_8254A不同工作方式的实验/观测方式4演示.mp4 differ diff --git a/Lab/Lab4/21281280_柯劲帆_第4次实验_8254A不同工作方式的实验/观测方式5演示.mp4 b/Lab/Lab4/21281280_柯劲帆_第4次实验_8254A不同工作方式的实验/观测方式5演示.mp4 new file mode 100755 index 0000000..8ef2dca Binary files /dev/null and b/Lab/Lab4/21281280_柯劲帆_第4次实验_8254A不同工作方式的实验/观测方式5演示.mp4 differ diff --git a/Lab/Lab4/material/1-1.png b/Lab/Lab4/material/1-1.png new file mode 100755 index 0000000..0699914 Binary files /dev/null and b/Lab/Lab4/material/1-1.png differ diff --git a/Lab/Lab4/material/1-2.png b/Lab/Lab4/material/1-2.png new file mode 100755 index 0000000..cbf08d5 Binary files /dev/null and b/Lab/Lab4/material/1-2.png differ diff --git a/Lab/Lab4/material/21281280_柯劲帆_第4次实验_8254A实验.md b/Lab/Lab4/material/21281280_柯劲帆_第4次实验_8254A实验.md new file mode 100755 index 0000000..e924d66 --- /dev/null +++ b/Lab/Lab4/material/21281280_柯劲帆_第4次实验_8254A实验.md @@ -0,0 +1,437 @@ + + + + + + + + + + + + + + +![cover](cover.png) + + + + + + + + + + + +

实验四 8254A不同工作方式的实验

+ +### 一、实验目的 + +更深刻的理解8254A定时/计数器的各种工作方式的特点;通过观察实验波形,可直观地了解这几种工作方式的异同。 + +### 二、实验内容 + +**任务一:**编写程序分别显示2、3工作方式下的波形。要求2方式的输出频率为1000Hz,3方式的输出频率为2000Hz。本实验使用8253A的定时/计数器0,GATE0通过K1接到+5V或地,CLK0接1MHZ的时钟脉冲,OUT2接示波器观测输出波形(连接线见图1-1示)。 + +**任务二:**采用定时器0和定时器1的级联方式,要求定时器0采用2方式,定时器1采用3方式,观测定时器0和定时器1输出波形(时间常数自定,连接线见图1-2示)。 + +![1-1](1-1.png) + +![1-2](1-2.png) + +### 三、流程图 + +**任务一:** + +![task1.drawio](task1.drawio.svg) + +**任务二:** + +![task3.drawio](task3.drawio.svg) + +### 四、实验过程与分析 + +**任务一:** + +8254A芯片的2方式是频率发生器,在每一个计数周期的最后输出长度为一个时钟周期的低脉冲,其余时间维持高脉冲。输出目标频率为1kHz,时钟周期为1MHz,则计数初值为$(1,000,000)_D \div (1,000)_D = (1,000)_D = (0011,1110,1000)_B$。首先在283H口输入方式命令。使用定时器0,计数初值长度为2个字节,使用2方式,使用二进制输入计数初值,所以输入的命令字为$(0011,0100)_B$。随后依次向280H口输入$(0011,1110,1000)_B$的低位字节和高位字节。8254A芯片即可运行。 + +示波器显示波形如下: + +method2 + +8254A芯片的3方式是方波发生器,在每一个计数周期中,前一半周期输出高脉冲,后一半周期输出低脉冲。输出目标频率为2kHz,时钟周期为1MHz,则计数初值为$(1,000,000)_D \div (2,000)_D = (500)_D = (0001,1111,0100)_B$。首先在283H口输入方式命令。使用定时器0,计数初值长度为2个字节,使用2方式,使用二进制输入计数初值,所以输入的命令字为$(0011,0100)_B$。随后依次向280H口输入$(0001,1111,0100)_B$的低位字节和高位字节。8254A芯片即可运行。 + +示波器显示波形如下: + +method3 + +**任务二:** + +按照任务要求级联定时器0和定时器1。首先将OUT0的输出频率设置为1kHz,CLK0输入为1MHz,则计数初值为$1,000,000 \div 1,000 = (1,000)_D = (0011,1110,1000)_B$。在283H口输入方式命令。使用定时器0,计数初值长度为2个字节,使用2方式,使用二进制输入计数初值,所以输入的命令字为$(0011,0110)_B$。随后依次向280H口输入$(0011,1110,1000)_B$的低位字节和高位字节。 + +再将OUT1的计数初值设置为$(10)_D = (0000,1010)_B$,则输出为$(1,000)_D \div (10)_D = (100)_D{\rm Hz}$的方波。在283H口输入方式命令。使用定时器1,计数初值长度为1个字节,使用3方式,使用二进制输入计数初值,所以输入的命令字为$(0101,0110)_B$。随后向280H口输入$(0000,1010)_B$。 + + + +### 五、实验总结 + +通过本实验,我对8254A定时/计数器的各种工作方式的特点的理解更加深刻。我学会了如何在实验箱中使用8254定时器,学会了如何使用示波器。受益匪浅。 + + + +### 六、思考题 + +> 用示波器观测方式0-5,它们所展示的波形如何。 + +方式2和方式3已经在任务一中观测。下面介绍观测方式0、方式1、方式4、方式5。 + +**观测方式0:** + +使用定时器0,将CLK0连到1MHz时钟源,使用方式3分频,使OUT0的频率为1000Hz;使用定时器1,将CLK1连到频率为1000Hz的OUT0,使用方式3分频,使OUT1的频率为10Hz。级联降频的原因是初值寄存器的大小不足以容纳$\left(100000 \right)_D$的二进制值。降频至10Hz的原因是示波器只能检测5Hz以上的频率。 + +使用定时器2,将CLK2连到频率为10Hz的OUT1,使用0方式。初值设置为$\left(40 \right)_D$,因此**OUT2在第二个时钟下降沿之后输出低电平,LED灯灭;4秒后OUT2输出高电平,LED灯亮**。 + +使用示波器观察OUT1,将LED7连到OUT2观察定时器2的方式0输出。 + +实物连接图如图所示。 + +method0 + +演示视频见附件。 + +代码如下: + +```assembly +DATA SEGMENT + +DATA ENDS + +CODE SEGMENT + ASSUME CS:CODE, DS:DATA + + START: + MOV AX, DATA + MOV DS, AX + + ; 时钟源为1MHz,使用0号计数器3方式降频为1kHz,计数值为1M / 1k = 1000 + MOV DX, 283H ; 命令口 + MOV AL, 00110110B ; 00(0号计数器)|11(读写2字节)|011(3方式工作)|0(计数值为2进制) + OUT DX, AL + + MOV DX, 280H ; 0号计数器 + MOV AL, 11101000B ; 计数值(1000)_D的2进制的低8位 + OUT DX, AL + MOV AL, 00000011B ; 计数值(1000)_D的2进制的高8位 + OUT DX, AL + + ; 从0号计数器获得1kHz的方波,使用1号计数器3方式降频为10Hz,方便示波器和人眼观察,计数值为1k / 10 = 100 + MOV DX, 283H ; 命令口 + MOV AL, 01010110B ; 01(1号计数器)|01(读写低字节,高字节置0)|011(3方式工作)|0(计数值为2进制) + OUT DX, AL + + MOV DX, 281H ; 1号计数器 + MOV AL, 01100100B ; 计数值(100)_D的2进制 + OUT DX, AL + + ; 从1号计数器获得10Hz的方波,观察2号计数器0工作方式,计数值为4s / 10Hz = 40 + MOV DX, 283H ; 命令口 + MOV AL, 10010000B ; 10(2号计数器)|01(读写低字节,高字节置0)|000(0方式工作)|0(计数值为2进制) + OUT DX, AL + + MOV DX, 282H ; 2号计数器 + MOV AL, 101000B ; 计数值(40)_D的2进制 + OUT DX, AL + +CODE ENDS +END START +``` + +**观测方式1:** + +使用计时器0和计时器1级联降频为10Hz,同观测方式0。 + +使用定时器2,将CLK2连到频率为10Hz的OUT1,使用1方式。初值设置为$\left(40 \right)_D$。将GATE2连至单次高脉冲发生器。 + +**拨动开关K,OUT2立刻输出低电平,LED灯灭;4秒后OUT2输出高电平,LED灯亮**。 + +使用示波器观察OUT1,将LED7连到OUT2观察定时器2的方式1输出。 + +实物连接图如图所示。 + +method1 + +演示视频见附件。 + +代码如下: + +```assembly +DATA SEGMENT + +DATA ENDS + +CODE SEGMENT + ASSUME CS:CODE, DS:DATA + + START: + MOV AX, DATA + MOV DS, AX + + ; 时钟源为1MHz,使用0号计数器3方式降频为1kHz,计数值为1M / 1k = 1000 + MOV DX, 283H ; 命令口 + MOV AL, 00110110B ; 00(0号计数器)|11(读写2字节)|011(3方式工作)|0(计数值为2进制) + OUT DX, AL + + MOV DX, 280H ; 0号计数器 + MOV AL, 11101000B ; 计数值(1000)_D的2进制的低8位 + OUT DX, AL + MOV AL, 00000011B ; 计数值(1000)_D的2进制的高8位 + OUT DX, AL + + ; 从0号计数器获得1kHz的方波,使用1号计数器3方式降频为10Hz,方便示波器和人眼观察,计数值为1k / 10 = 100 + MOV DX, 283H ; 命令口 + MOV AL, 01010110B ; 01(1号计数器)|01(读写低字节,高字节置0)|011(3方式工作)|0(计数值为2进制) + OUT DX, AL + + MOV DX, 281H ; 1号计数器 + MOV AL, 01100100B ; 计数值(100)_D的2进制 + OUT DX, AL + + ; 从1号计数器获得10Hz的方波,观察2号计数器1工作方式,计数值为4s / 10Hz = 40 + MOV DX, 283H ; 命令口 + MOV AL, 10010010B ; 10(2号计数器)|01(读写低字节,高字节置0)|001(1方式工作)|0(计数值为2进制) + OUT DX, AL + + MOV DX, 282H ; 2号计数器 + MOV AL, 101000B ; 计数值(40)_D的2进制 + OUT DX, AL + +CODE ENDS +END START +``` + +**观测方式4:** + +使用计时器0和计时器1级联降频为1Hz,同观测方式0。选择频率为1Hz的原因是方式4输出的负脉冲的持续时间为1个时钟周期,如果频率太高不易观察。 + +使用定时器2,将CLK2连到频率为1Hz的OUT1,使用4方式。初值设置为$\left(4 \right)_D$。 + +**启动程序,4秒后OUT2输出持续1s的低电平,LED灯灭,1s后LED重新亮**。 + +将GATE2连到单次低脉冲发生器,**在启动程序后的4秒内如果输入一个低脉冲,倒计时会重新计时**。 + +使用示波器观察OUT0,将LED7连到OUT2观察定时器2的方式4输出。 + +实物连接图如图所示。 + +method1 + +演示视频见附件。 + +代码如下: + +```assembly +DATA SEGMENT + +DATA ENDS + +CODE SEGMENT + ASSUME CS:CODE, DS:DATA + + START: + MOV AX, DATA + MOV DS, AX + + ; 时钟源为1MHz,使用0号计数器3方式降频为1kHz,计数值为1M / 1k = 1000 + MOV DX, 283H ; 命令口 + MOV AL, 00110110B ; 00(0号计数器)|11(读写2字节)|011(3方式工作)|0(计数值为2进制) + OUT DX, AL + + MOV DX, 280H ; 0号计数器 + MOV AL, 11101000B ; 计数值(1000)_D的2进制的低8位 + OUT DX, AL + MOV AL, 00000011B ; 计数值(1000)_D的2进制的高8位 + OUT DX, AL + + ; 从0号计数器获得1kHz的方波,使用1号计数器3方式降频为1Hz,方便人眼观察,计数值为1k / 1 = 1000 + MOV DX, 283H ; 命令口 + MOV AL, 01110110B ; 01(1号计数器)|11(读写2字节)|011(3方式工作)|0(计数值为2进制) + OUT DX, AL + + MOV DX, 281H ; 1号计数器 + MOV AL, 11101000B ; 计数值(1000)_D的2进制的低8位 + OUT DX, AL + MOV AL, 00000011B ; 计数值(1000)_D的2进制的高8位 + OUT DX, AL + + ; 从1号计数器获得1Hz的方波,观察2号计数器4工作方式,计数值为4s / 1Hz = 4 + MOV DX, 283H ; 命令口 + MOV AL, 10011000B ; 10(2号计数器)|01(读写低字节,高字节置0)|100(4方式工作)|0(计数值为2进制) + OUT DX, AL + + MOV DX, 282H ; 2号计数器 + MOV AL, 100B ; 计数值(4)_D的2进制 + OUT DX, AL + +CODE ENDS +END START +``` + +**观测方式5:** + +使用计时器0和计时器1级联降频为1Hz,同观测方式4。 + +使用定时器2,将CLK2连到频率为1Hz的OUT1,使用5方式。初值设置为$\left(4 \right)_D$。将GATE2连至单次高脉冲发生器。 + +**拨动开关K,4秒后OUT2输出持续1s的低电平,LED灯灭,1s后LED重新亮**。 + +使用示波器观察OUT0,将LED7连到OUT2观察定时器2的方式5输出。 + +实物连接图如图所示。 + +method1 + +演示视频见附件。 + +代码如下: + +```assembly +DATA SEGMENT + +DATA ENDS + +CODE SEGMENT + ASSUME CS:CODE, DS:DATA + + START: + MOV AX, DATA + MOV DS, AX + + ; 时钟源为1MHz,使用0号计数器3方式降频为1kHz,计数值为1M / 1k = 1000 + MOV DX, 283H ; 命令口 + MOV AL, 00110110B ; 00(0号计数器)|11(读写2字节)|011(3方式工作)|0(计数值为2进制) + OUT DX, AL + + MOV DX, 280H ; 0号计数器 + MOV AL, 11101000B ; 计数值(1000)_D的2进制的低8位 + OUT DX, AL + MOV AL, 00000011B ; 计数值(1000)_D的2进制的高8位 + OUT DX, AL + + ; 从0号计数器获得1kHz的方波,使用1号计数器3方式降频为1Hz,方便人眼观察,计数值为1k / 1 = 1000 + MOV DX, 283H ; 命令口 + MOV AL, 01110110B ; 01(1号计数器)|11(读写2字节)|011(3方式工作)|0(计数值为2进制) + OUT DX, AL + + MOV DX, 281H ; 1号计数器 + MOV AL, 11101000B ; 计数值(1000)_D的2进制的低8位 + OUT DX, AL + MOV AL, 00000011B ; 计数值(1000)_D的2进制的高8位 + OUT DX, AL + + ; 从1号计数器获得1Hz的方波,观察2号计数器5工作方式,计数值为4s / 1Hz = 4 + MOV DX, 283H ; 命令口 + MOV AL, 10011010B ; 10(2号计数器)|01(读写低字节,高字节置0)|101(5方式工作)|0(计数值为2进制) + OUT DX, AL + + MOV DX, 282H ; 2号计数器 + MOV AL, 100B ; 计数值(4)_D的2进制 + OUT DX, AL + +CODE ENDS +END START +``` + + + +### 源代码附录 + +**任务一:** + +方式2: + +```assembly +DATA SEGMENT + +DATA ENDS + +CODE SEGMENT + ASSUME CS:CODE, DS:DATA + + START: + MOV AX, DATA + MOV DS, AX + + MOV DX, 283H ; 命令口 + MOV AL, 00110100B ; 00(0号计数器)|11(读写2字节)|010(2方式工作)|0(计数值为2进制) + OUT DX, AL + MOV DX, 280H ; 0号计数器 + MOV AL, 11101000B ; (1000)_D的2进制的低8位 + OUT DX, AL + MOV AL, 00000011B ; (1000)_D的2进制的高8位 + OUT DX, AL + +CODE ENDS +END START +``` + +方式3: + +```assembly +DATA SEGMENT + +DATA ENDS + +CODE SEGMENT + ASSUME CS:CODE, DS:DATA + + START: + MOV AX, DATA + MOV DS, AX + + MOV DX, 283H ; 命令口 + MOV AL, 00110110B ; 00(0号计数器)|11(读写2字节)|011(3方式工作)|0(计数值为2进制) + OUT DX, AL + MOV DX, 280H ; 0号计数器 + MOV AL, 11110100B ; (500)_D的2进制的低8位 + OUT DX, AL + MOV AL, 00000001B ; (500)_D的2进制的高8位 + OUT DX, AL + +CODE ENDS +END START +``` + +**任务二:** + +```assembly +DATA SEGMENT + +DATA ENDS + +CODE SEGMENT + ASSUME CS:CODE, DS:DATA + + START: + MOV AX, DATA + MOV DS, AX + + MOV DX, 283H ; 命令口 + MOV AL, 00110100B ; 00(0号计数器)|11(读写2字节)|010(2方式工作)|0(计数值为2进制) + OUT DX, AL + MOV DX, 280H ; 0号计数器 + MOV AL, 11101000B ; (1000)_D的2进制的低8位 + OUT DX, AL + MOV AL, 00000011B ; (1000)_D的2进制的高8位 + OUT DX, AL + + MOV DX, 283H ; 命令口 + MOV AL, 01010110B ; 01(1号计数器)|01(读写低字节,高字节为0)|011(3方式工作)|0(计数值为2进制) + OUT DX, AL + MOV DX, 281H ; 1号计数器 + MOV AL, 00001010B ; (10)_D的2进制 + OUT DX, AL + +CODE ENDS +END START +``` \ No newline at end of file diff --git a/Lab/Lab4/material/21281280_柯劲帆_第4次实验_8254A实验.pdf b/Lab/Lab4/material/21281280_柯劲帆_第4次实验_8254A实验.pdf new file mode 100755 index 0000000..525f264 Binary files /dev/null and b/Lab/Lab4/material/21281280_柯劲帆_第4次实验_8254A实验.pdf differ diff --git a/Lab/Lab4/material/cover.png b/Lab/Lab4/material/cover.png new file mode 100755 index 0000000..91b805f Binary files /dev/null and b/Lab/Lab4/material/cover.png differ diff --git a/Lab/Lab4/material/method0.jpg b/Lab/Lab4/material/method0.jpg new file mode 100755 index 0000000..810bba9 Binary files /dev/null and b/Lab/Lab4/material/method0.jpg differ diff --git a/Lab/Lab4/material/method0test/code.EXE b/Lab/Lab4/material/method0test/code.EXE new file mode 100755 index 0000000..03540c0 Binary files /dev/null and b/Lab/Lab4/material/method0test/code.EXE differ diff --git a/Lab/Lab4/material/method0test/code.LST b/Lab/Lab4/material/method0test/code.LST new file mode 100755 index 0000000..055a110 --- /dev/null +++ b/Lab/Lab4/material/method0test/code.LST @@ -0,0 +1,71 @@ +Turbo Assembler Version 5.3 05-06-23 20:42:50 Page 1 +code.asm + + + + 1 0000 DATA SEGMENT + 2 + 3 0000 DATA ENDS + 4 + 5 0000 CODE SEGMENT + 6 ASSUME CS:CODE, DS:DATA + 7 + 8 0000 START: + 9 0000 B8 0000s MOV AX, DATA + 10 0003 8E D8 MOV DS, AX + 11 + 12 + 13 0005 BA 0283 MOV DX, 283H + 14 0008 B0 36 MOV AL, 00110110B + 15 000A EE OUT DX, AL + 16 + 17 000B BA 0280 MOV DX, 280H + 18 000E B0 E8 MOV AL, 11101000B + 19 0010 EE OUT DX, AL + 20 0011 B0 03 MOV AL, 00000011B + 21 0013 EE OUT DX, AL + 22 + 23 + 24 0014 BA 0283 MOV DX, 283H + 25 0017 B0 56 MOV AL, 01010110B + 26 0019 EE OUT DX, AL + 27 + 28 001A BA 0281 MOV DX, 281H + 29 001D B0 64 MOV AL, 01100100B + 30 001F EE OUT DX, AL + 31 + 32 + 33 0020 BA 0283 MOV DX, 283H + 34 0023 B0 90 MOV AL, 10010000B + 35 0025 EE OUT DX, AL + 36 + 37 0026 BA 0282 MOV DX, 282H + 38 0029 B0 28 MOV AL, 101000B + 39 002B EE OUT DX, AL + 40 + 41 + 42 002C CODE ENDS + 43 END START + Turbo Assembler Version 5.3 05-06-23 20:42:50 Page 2 +Symbol Table + + + + +Symbol Name Type Value + +??DATE Text "05-06-23" +??FILENAME Text "code " +??TIME Text "20:42:50" +??VERSION Number 0503 +@CPU Text 0101H +@CURSEG Text CODE +@FILENAME Text CODE +@WORDSIZE Text 2 +START Near16 CODE:0000 + +Groups & Segments Bit Size Align Combine Class + +CODE 16 002C Para none +DATA 16 0000 Para none + \ No newline at end of file diff --git a/Lab/Lab4/material/method0test/code.MAP b/Lab/Lab4/material/method0test/code.MAP new file mode 100755 index 0000000..3914de2 --- /dev/null +++ b/Lab/Lab4/material/method0test/code.MAP @@ -0,0 +1,7 @@ +LINK : warning L4021: no stack segment + + Start Stop Length Name Class + 00000H 00000H 00000H DATA + 00000H 0002BH 0002CH CODE + +Program entry point at 0000:0000 diff --git a/Lab/Lab4/material/method0test/code.OBJ b/Lab/Lab4/material/method0test/code.OBJ new file mode 100755 index 0000000..d2138f4 Binary files /dev/null and b/Lab/Lab4/material/method0test/code.OBJ differ diff --git a/Lab/Lab4/material/method0test/code.asm b/Lab/Lab4/material/method0test/code.asm new file mode 100755 index 0000000..8992ce8 --- /dev/null +++ b/Lab/Lab4/material/method0test/code.asm @@ -0,0 +1,42 @@ +DATA SEGMENT + +DATA ENDS + +CODE SEGMENT + ASSUME CS:CODE, DS:DATA + + START: + MOV AX, DATA + MOV DS, AX + + ; 时钟源为1MHz,使用0号计数器3方式降频为1kHz,计数值为1M / 1k = 1000 + MOV DX, 283H ; 命令口 + MOV AL, 00110110B ; 00(0号计数器)|11(读写2字节)|011(3方式工作)|0(计数值为2进制) + OUT DX, AL + + MOV DX, 280H ; 0号计数器 + MOV AL, 11101000B ; 计数值(1000)_D的2进制的低8位 + OUT DX, AL + MOV AL, 00000011B ; 计数值(1000)_D的2进制的高8位 + OUT DX, AL + + ; 从0号计数器获得1kHz的方波,使用1号计数器3方式降频为10Hz,方便示波器和人眼观察,计数值为1k / 10 = 100 + MOV DX, 283H ; 命令口 + MOV AL, 01010110B ; 01(1号计数器)|01(读写低字节,高字节置0)|011(3方式工作)|0(计数值为2进制) + OUT DX, AL + + MOV DX, 281H ; 1号计数器 + MOV AL, 01100100B ; 计数值(100)_D的2进制 + OUT DX, AL + + ; 从1号计数器获得10Hz的方波,观察2号计数器0工作方式,计数值为4s / 10Hz = 40 + MOV DX, 283H ; 命令口 + MOV AL, 10010000B ; 10(2号计数器)|01(读写低字节,高字节置0)|000(0方式工作)|0(计数值为2进制) + OUT DX, AL + + MOV DX, 282H ; 2号计数器 + MOV AL, 101000B ; 计数值(40)_D的2进制 + OUT DX, AL + +CODE ENDS +END START \ No newline at end of file diff --git a/Lab/Lab4/material/method1.jpg b/Lab/Lab4/material/method1.jpg new file mode 100755 index 0000000..ae35a85 Binary files /dev/null and b/Lab/Lab4/material/method1.jpg differ diff --git a/Lab/Lab4/material/method1test/code.EXE b/Lab/Lab4/material/method1test/code.EXE new file mode 100755 index 0000000..9bd34a4 Binary files /dev/null and b/Lab/Lab4/material/method1test/code.EXE differ diff --git a/Lab/Lab4/material/method1test/code.LST b/Lab/Lab4/material/method1test/code.LST new file mode 100755 index 0000000..9a6d57b --- /dev/null +++ b/Lab/Lab4/material/method1test/code.LST @@ -0,0 +1,71 @@ +Turbo Assembler Version 5.3 05-06-23 20:50:25 Page 1 +code.asm + + + + 1 0000 DATA SEGMENT + 2 + 3 0000 DATA ENDS + 4 + 5 0000 CODE SEGMENT + 6 ASSUME CS:CODE, DS:DATA + 7 + 8 0000 START: + 9 0000 B8 0000s MOV AX, DATA + 10 0003 8E D8 MOV DS, AX + 11 + 12 + 13 0005 BA 0283 MOV DX, 283H + 14 0008 B0 36 MOV AL, 00110110B + 15 000A EE OUT DX, AL + 16 + 17 000B BA 0280 MOV DX, 280H + 18 000E B0 E8 MOV AL, 11101000B + 19 0010 EE OUT DX, AL + 20 0011 B0 03 MOV AL, 00000011B + 21 0013 EE OUT DX, AL + 22 + 23 + 24 0014 BA 0283 MOV DX, 283H + 25 0017 B0 56 MOV AL, 01010110B + 26 0019 EE OUT DX, AL + 27 + 28 001A BA 0281 MOV DX, 281H + 29 001D B0 64 MOV AL, 01100100B + 30 001F EE OUT DX, AL + 31 + 32 + 33 0020 BA 0283 MOV DX, 283H + 34 0023 B0 92 MOV AL, 10010010B + 35 0025 EE OUT DX, AL + 36 + 37 0026 BA 0282 MOV DX, 282H + 38 0029 B0 28 MOV AL, 101000B + 39 002B EE OUT DX, AL + 40 + 41 + 42 002C CODE ENDS + 43 END START + Turbo Assembler Version 5.3 05-06-23 20:50:25 Page 2 +Symbol Table + + + + +Symbol Name Type Value + +??DATE Text "05-06-23" +??FILENAME Text "code " +??TIME Text "20:50:25" +??VERSION Number 0503 +@CPU Text 0101H +@CURSEG Text CODE +@FILENAME Text CODE +@WORDSIZE Text 2 +START Near16 CODE:0000 + +Groups & Segments Bit Size Align Combine Class + +CODE 16 002C Para none +DATA 16 0000 Para none + \ No newline at end of file diff --git a/Lab/Lab4/material/method1test/code.MAP b/Lab/Lab4/material/method1test/code.MAP new file mode 100755 index 0000000..3914de2 --- /dev/null +++ b/Lab/Lab4/material/method1test/code.MAP @@ -0,0 +1,7 @@ +LINK : warning L4021: no stack segment + + Start Stop Length Name Class + 00000H 00000H 00000H DATA + 00000H 0002BH 0002CH CODE + +Program entry point at 0000:0000 diff --git a/Lab/Lab4/material/method1test/code.OBJ b/Lab/Lab4/material/method1test/code.OBJ new file mode 100755 index 0000000..0c93900 Binary files /dev/null and b/Lab/Lab4/material/method1test/code.OBJ differ diff --git a/Lab/Lab4/material/method1test/code.asm b/Lab/Lab4/material/method1test/code.asm new file mode 100755 index 0000000..eaf7957 --- /dev/null +++ b/Lab/Lab4/material/method1test/code.asm @@ -0,0 +1,42 @@ +DATA SEGMENT + +DATA ENDS + +CODE SEGMENT + ASSUME CS:CODE, DS:DATA + + START: + MOV AX, DATA + MOV DS, AX + + ; 时钟源为1MHz,使用0号计数器3方式降频为1kHz,计数值为1M / 1k = 1000 + MOV DX, 283H ; 命令口 + MOV AL, 00110110B ; 00(0号计数器)|11(读写2字节)|011(3方式工作)|0(计数值为2进制) + OUT DX, AL + + MOV DX, 280H ; 0号计数器 + MOV AL, 11101000B ; 计数值(1000)_D的2进制的低8位 + OUT DX, AL + MOV AL, 00000011B ; 计数值(1000)_D的2进制的高8位 + OUT DX, AL + + ; 从0号计数器获得1kHz的方波,使用1号计数器3方式降频为10Hz,方便示波器和人眼观察,计数值为1k / 10 = 100 + MOV DX, 283H ; 命令口 + MOV AL, 01010110B ; 01(1号计数器)|01(读写低字节,高字节置0)|011(3方式工作)|0(计数值为2进制) + OUT DX, AL + + MOV DX, 281H ; 1号计数器 + MOV AL, 01100100B ; 计数值(100)_D的2进制 + OUT DX, AL + + ; 从1号计数器获得10Hz的方波,观察2号计数器1工作方式,计数值为4s / 10Hz = 40 + MOV DX, 283H ; 命令口 + MOV AL, 10010010B ; 10(2号计数器)|01(读写低字节,高字节置0)|001(1方式工作)|0(计数值为2进制) + OUT DX, AL + + MOV DX, 282H ; 2号计数器 + MOV AL, 101000B ; 计数值(40)_D的2进制 + OUT DX, AL + +CODE ENDS +END START \ No newline at end of file diff --git a/Lab/Lab4/material/method2.jpg b/Lab/Lab4/material/method2.jpg new file mode 100755 index 0000000..f18b0b1 Binary files /dev/null and b/Lab/Lab4/material/method2.jpg differ diff --git a/Lab/Lab4/material/method3.jpg b/Lab/Lab4/material/method3.jpg new file mode 100755 index 0000000..31dfa67 Binary files /dev/null and b/Lab/Lab4/material/method3.jpg differ diff --git a/Lab/Lab4/material/method4.jpg b/Lab/Lab4/material/method4.jpg new file mode 100755 index 0000000..faf9ac5 Binary files /dev/null and b/Lab/Lab4/material/method4.jpg differ diff --git a/Lab/Lab4/material/method4test/code.EXE b/Lab/Lab4/material/method4test/code.EXE new file mode 100755 index 0000000..24e8818 Binary files /dev/null and b/Lab/Lab4/material/method4test/code.EXE differ diff --git a/Lab/Lab4/material/method4test/code.LST b/Lab/Lab4/material/method4test/code.LST new file mode 100755 index 0000000..2926abd --- /dev/null +++ b/Lab/Lab4/material/method4test/code.LST @@ -0,0 +1,73 @@ +Turbo Assembler Version 5.3 05-06-23 21:40:00 Page 1 +code.asm + + + + 1 0000 DATA SEGMENT + 2 + 3 0000 DATA ENDS + 4 + 5 0000 CODE SEGMENT + 6 ASSUME CS:CODE, DS:DATA + 7 + 8 0000 START: + 9 0000 B8 0000s MOV AX, DATA + 10 0003 8E D8 MOV DS, AX + 11 + 12 + 13 0005 BA 0283 MOV DX, 283H + 14 0008 B0 36 MOV AL, 00110110B + 15 000A EE OUT DX, AL + 16 + 17 000B BA 0280 MOV DX, 280H + 18 000E B0 E8 MOV AL, 11101000B + 19 0010 EE OUT DX, AL + 20 0011 B0 03 MOV AL, 00000011B + 21 0013 EE OUT DX, AL + 22 + 23 + 24 0014 BA 0283 MOV DX, 283H + 25 0017 B0 76 MOV AL, 01110110B + 26 0019 EE OUT DX, AL + 27 + 28 001A BA 0281 MOV DX, 281H + 29 001D B0 E8 MOV AL, 11101000B + 30 001F EE OUT DX, AL + 31 0020 B0 03 MOV AL, 00000011B + 32 0022 EE OUT DX, AL + 33 + 34 + 35 0023 BA 0283 MOV DX, 283H + 36 0026 B0 98 MOV AL, 10011000B + 37 0028 EE OUT DX, AL + 38 + 39 0029 BA 0282 MOV DX, 282H + 40 002C B0 04 MOV AL, 100B + 41 002E EE OUT DX, AL + 42 + 43 + 44 002F CODE ENDS + 45 END START + Turbo Assembler Version 5.3 05-06-23 21:40:00 Page 2 +Symbol Table + + + + +Symbol Name Type Value + +??DATE Text "05-06-23" +??FILENAME Text "code " +??TIME Text "21:40:00" +??VERSION Number 0503 +@CPU Text 0101H +@CURSEG Text CODE +@FILENAME Text CODE +@WORDSIZE Text 2 +START Near16 CODE:0000 + +Groups & Segments Bit Size Align Combine Class + +CODE 16 002F Para none +DATA 16 0000 Para none + \ No newline at end of file diff --git a/Lab/Lab4/material/method4test/code.MAP b/Lab/Lab4/material/method4test/code.MAP new file mode 100755 index 0000000..d52d286 --- /dev/null +++ b/Lab/Lab4/material/method4test/code.MAP @@ -0,0 +1,7 @@ +LINK : warning L4021: no stack segment + + Start Stop Length Name Class + 00000H 00000H 00000H DATA + 00000H 0002EH 0002FH CODE + +Program entry point at 0000:0000 diff --git a/Lab/Lab4/material/method4test/code.OBJ b/Lab/Lab4/material/method4test/code.OBJ new file mode 100755 index 0000000..50f77f8 Binary files /dev/null and b/Lab/Lab4/material/method4test/code.OBJ differ diff --git a/Lab/Lab4/material/method4test/code.asm b/Lab/Lab4/material/method4test/code.asm new file mode 100755 index 0000000..8820500 --- /dev/null +++ b/Lab/Lab4/material/method4test/code.asm @@ -0,0 +1,44 @@ +DATA SEGMENT + +DATA ENDS + +CODE SEGMENT + ASSUME CS:CODE, DS:DATA + + START: + MOV AX, DATA + MOV DS, AX + + ; 时钟源为1MHz,使用0号计数器3方式降频为1kHz,计数值为1M / 1k = 1000 + MOV DX, 283H ; 命令口 + MOV AL, 00110110B ; 00(0号计数器)|11(读写2字节)|011(3方式工作)|0(计数值为2进制) + OUT DX, AL + + MOV DX, 280H ; 0号计数器 + MOV AL, 11101000B ; 计数值(1000)_D的2进制的低8位 + OUT DX, AL + MOV AL, 00000011B ; 计数值(1000)_D的2进制的高8位 + OUT DX, AL + + ; 从0号计数器获得1kHz的方波,使用1号计数器3方式降频为1Hz,方便人眼观察,计数值为1k / 1 = 1000 + MOV DX, 283H ; 命令口 + MOV AL, 01110110B ; 01(1号计数器)|11(读写2字节)|011(3方式工作)|0(计数值为2进制) + OUT DX, AL + + MOV DX, 281H ; 1号计数器 + MOV AL, 11101000B ; 计数值(1000)_D的2进制的低8位 + OUT DX, AL + MOV AL, 00000011B ; 计数值(1000)_D的2进制的高8位 + OUT DX, AL + + ; 从1号计数器获得1Hz的方波,观察2号计数器4工作方式,计数值为4s / 1Hz = 4 + MOV DX, 283H ; 命令口 + MOV AL, 10011000B ; 10(2号计数器)|01(读写低字节,高字节置0)|100(4方式工作)|0(计数值为2进制) + OUT DX, AL + + MOV DX, 282H ; 2号计数器 + MOV AL, 100B ; 计数值(4)_D的2进制 + OUT DX, AL + +CODE ENDS +END START \ No newline at end of file diff --git a/Lab/Lab4/material/method5.jpg b/Lab/Lab4/material/method5.jpg new file mode 100755 index 0000000..0702699 Binary files /dev/null and b/Lab/Lab4/material/method5.jpg differ diff --git a/Lab/Lab4/material/method5test/code.EXE b/Lab/Lab4/material/method5test/code.EXE new file mode 100755 index 0000000..7d7e559 Binary files /dev/null and b/Lab/Lab4/material/method5test/code.EXE differ diff --git a/Lab/Lab4/material/method5test/code.LST b/Lab/Lab4/material/method5test/code.LST new file mode 100755 index 0000000..37fee60 --- /dev/null +++ b/Lab/Lab4/material/method5test/code.LST @@ -0,0 +1,72 @@ +Turbo Assembler Version 5.3 05-06-23 21:46:11 Page 1 +code.asm + + + + 1 0000 DATA SEGMENT + 2 + 3 0000 DATA ENDS + 4 + 5 0000 CODE SEGMENT + 6 ASSUME CS:CODE, DS:DATA + 7 + 8 0000 START: + 9 0000 B8 0000s MOV AX, DATA + 10 0003 8E D8 MOV DS, AX + 11 + 12 + 13 0005 BA 0283 MOV DX, 283H + 14 0008 B0 36 MOV AL, 00110110B + 15 000A EE OUT DX, AL + 16 + 17 000B BA 0280 MOV DX, 280H + 18 000E B0 E8 MOV AL, 11101000B + 19 0010 EE OUT DX, AL + 20 0011 B0 03 MOV AL, 00000011B + 21 0013 EE OUT DX, AL + 22 + 23 + 24 0014 BA 0283 MOV DX, 283H + 25 0017 B0 76 MOV AL, 01110110B + 26 0019 EE OUT DX, AL + 27 + 28 001A BA 0281 MOV DX, 281H + 29 001D B0 E8 MOV AL, 11101000B + 30 001F EE OUT DX, AL + 31 0020 B0 03 MOV AL, 00000011B + 32 0022 EE OUT DX, AL + 33 + 34 0023 BA 0283 MOV DX, 283H + 35 0026 B0 9A MOV AL, 10011010B + 36 0028 EE OUT DX, AL + 37 + 38 0029 BA 0282 MOV DX, 282H + 39 002C B0 04 MOV AL, 100B + 40 002E EE OUT DX, AL + 41 + 42 + 43 002F CODE ENDS + 44 END START + Turbo Assembler Version 5.3 05-06-23 21:46:11 Page 2 +Symbol Table + + + + +Symbol Name Type Value + +??DATE Text "05-06-23" +??FILENAME Text "code " +??TIME Text "21:46:11" +??VERSION Number 0503 +@CPU Text 0101H +@CURSEG Text CODE +@FILENAME Text CODE +@WORDSIZE Text 2 +START Near16 CODE:0000 + +Groups & Segments Bit Size Align Combine Class + +CODE 16 002F Para none +DATA 16 0000 Para none + \ No newline at end of file diff --git a/Lab/Lab4/material/method5test/code.MAP b/Lab/Lab4/material/method5test/code.MAP new file mode 100755 index 0000000..d52d286 --- /dev/null +++ b/Lab/Lab4/material/method5test/code.MAP @@ -0,0 +1,7 @@ +LINK : warning L4021: no stack segment + + Start Stop Length Name Class + 00000H 00000H 00000H DATA + 00000H 0002EH 0002FH CODE + +Program entry point at 0000:0000 diff --git a/Lab/Lab4/material/method5test/code.OBJ b/Lab/Lab4/material/method5test/code.OBJ new file mode 100755 index 0000000..c12986d Binary files /dev/null and b/Lab/Lab4/material/method5test/code.OBJ differ diff --git a/Lab/Lab4/material/method5test/code.asm b/Lab/Lab4/material/method5test/code.asm new file mode 100755 index 0000000..e934b02 --- /dev/null +++ b/Lab/Lab4/material/method5test/code.asm @@ -0,0 +1,44 @@ +DATA SEGMENT + +DATA ENDS + +CODE SEGMENT + ASSUME CS:CODE, DS:DATA + + START: + MOV AX, DATA + MOV DS, AX + + ; 时钟源为1MHz,使用0号计数器3方式降频为1kHz,计数值为1M / 1k = 1000 + MOV DX, 283H ; 命令口 + MOV AL, 00110110B ; 00(0号计数器)|11(读写2字节)|011(3方式工作)|0(计数值为2进制) + OUT DX, AL + + MOV DX, 280H ; 0号计数器 + MOV AL, 11101000B ; 计数值(1000)_D的2进制的低8位 + OUT DX, AL + MOV AL, 00000011B ; 计数值(1000)_D的2进制的高8位 + OUT DX, AL + + ; 从0号计数器获得1kHz的方波,使用1号计数器3方式降频为1Hz,方便人眼观察,计数值为1k / 1 = 1000 + MOV DX, 283H ; 命令口 + MOV AL, 01110110B ; 01(1号计数器)|11(读写2字节)|011(3方式工作)|0(计数值为2进制) + OUT DX, AL + + MOV DX, 281H ; 1号计数器 + MOV AL, 11101000B ; 计数值(1000)_D的2进制的低8位 + OUT DX, AL + MOV AL, 00000011B ; 计数值(1000)_D的2进制的高8位 + OUT DX, AL + + ; 从1号计数器获得1Hz的方波,观察2号计数器5工作方式,计数值为4s / 1Hz = 4 + MOV DX, 283H ; 命令口 + MOV AL, 10011010B ; 10(2号计数器)|01(读写低字节,高字节置0)|101(5方式工作)|0(计数值为2进制) + OUT DX, AL + + MOV DX, 282H ; 2号计数器 + MOV AL, 100B ; 计数值(4)_D的2进制 + OUT DX, AL + +CODE ENDS +END START \ No newline at end of file diff --git a/Lab/Lab4/material/task1.drawio b/Lab/Lab4/material/task1.drawio new file mode 100755 index 0000000..b6781a1 --- /dev/null +++ b/Lab/Lab4/material/task1.drawio @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Lab/Lab4/material/task1.drawio.svg b/Lab/Lab4/material/task1.drawio.svg new file mode 100755 index 0000000..3a7a96e --- /dev/null +++ b/Lab/Lab4/material/task1.drawio.svg @@ -0,0 +1,4 @@ + + + +
程序开始
程序开始
向283H口输出方式命令字0011,0100B
向283H口输出方式命令字0011,0100B
向280H口输出计数初值低字节1110,1000B
向280H口输出计数初值低字节1110,1000B
向280H口输出计数初值高字节0000,0011B
向280H口输出计数初值高字节0000,0011B
程序结束
程序结束
程序开始
程序开始
向283H口输出方式命令字0011,0110B
向283H口输出方式命令字0011,0110B
向280H口输出计数初值低字节1111,0100B
向280H口输出计数初值低字节1111,0100B
向280H口输出计数初值高字节0000,0001B
向280H口输出计数初值高字节0000,0001B
程序结束
程序结束
2方式
2方式
3方式
3方式
Text is not SVG - cannot display
\ No newline at end of file diff --git a/Lab/Lab4/material/task1/code.EXE b/Lab/Lab4/material/task1/code.EXE new file mode 100755 index 0000000..a9d1517 Binary files /dev/null and b/Lab/Lab4/material/task1/code.EXE differ diff --git a/Lab/Lab4/material/task1/code.LST b/Lab/Lab4/material/task1/code.LST new file mode 100755 index 0000000..7c8ace4 --- /dev/null +++ b/Lab/Lab4/material/task1/code.LST @@ -0,0 +1,50 @@ +Turbo Assembler Version 5.3 05-06-23 19:47:15 Page 1 +code.asm + + + + 1 0000 DATA SEGMENT + 2 + 3 0000 DATA ENDS + 4 + 5 0000 CODE SEGMENT + 6 ASSUME CS:CODE, DS:DATA + 7 + 8 0000 START: + 9 0000 B8 0000s MOV AX, DATA + 10 0003 8E D8 MOV DS, AX + 11 + 12 0005 BA 0283 MOV DX, 283H + 13 0008 B0 34 MOV AL, 00110100B + 14 000A EE OUT DX, AL + 15 000B BA 0280 MOV DX, 280H + 16 000E B0 E8 MOV AL, 11101000B + 17 0010 EE OUT DX, AL + 18 0011 B0 03 MOV AL, 00000011B + 19 0013 EE OUT DX, AL + 20 + 21 0014 CODE ENDS + 22 END START + Turbo Assembler Version 5.3 05-06-23 19:47:15 Page 2 +Symbol Table + + + + +Symbol Name Type Value + +??DATE Text "05-06-23" +??FILENAME Text "code " +??TIME Text "19:47:15" +??VERSION Number 0503 +@CPU Text 0101H +@CURSEG Text CODE +@FILENAME Text CODE +@WORDSIZE Text 2 +START Near16 CODE:0000 + +Groups & Segments Bit Size Align Combine Class + +CODE 16 0014 Para none +DATA 16 0000 Para none + \ No newline at end of file diff --git a/Lab/Lab4/material/task1/code.MAP b/Lab/Lab4/material/task1/code.MAP new file mode 100755 index 0000000..3086f37 --- /dev/null +++ b/Lab/Lab4/material/task1/code.MAP @@ -0,0 +1,7 @@ +LINK : warning L4021: no stack segment + + Start Stop Length Name Class + 00000H 00000H 00000H DATA + 00000H 00013H 00014H CODE + +Program entry point at 0000:0000 diff --git a/Lab/Lab4/material/task1/code.OBJ b/Lab/Lab4/material/task1/code.OBJ new file mode 100755 index 0000000..afb59c5 Binary files /dev/null and b/Lab/Lab4/material/task1/code.OBJ differ diff --git a/Lab/Lab4/material/task1/code.asm b/Lab/Lab4/material/task1/code.asm new file mode 100755 index 0000000..84f9ffa --- /dev/null +++ b/Lab/Lab4/material/task1/code.asm @@ -0,0 +1,22 @@ +DATA SEGMENT + +DATA ENDS + +CODE SEGMENT + ASSUME CS:CODE, DS:DATA + + START: + MOV AX, DATA + MOV DS, AX + + MOV DX, 283H ; 命令口 + MOV AL, 00110100B ; 00(0号计数器)|11(读写2字节)|010(2方式工作)|0(计数值为2进制) + OUT DX, AL + MOV DX, 280H ; 0号计数器 + MOV AL, 11101000B ; (1000)_D的2进制的低8位 + OUT DX, AL + MOV AL, 00000011B ; (1000)_D的2进制的高8位 + OUT DX, AL + +CODE ENDS +END START \ No newline at end of file diff --git a/Lab/Lab4/material/task2/code.EXE b/Lab/Lab4/material/task2/code.EXE new file mode 100755 index 0000000..d29063f Binary files /dev/null and b/Lab/Lab4/material/task2/code.EXE differ diff --git a/Lab/Lab4/material/task2/code.LST b/Lab/Lab4/material/task2/code.LST new file mode 100755 index 0000000..a24f185 --- /dev/null +++ b/Lab/Lab4/material/task2/code.LST @@ -0,0 +1,50 @@ +Turbo Assembler Version 5.3 05-09-23 17:33:28 Page 1 +code.asm + + + + 1 0000 DATA SEGMENT + 2 + 3 0000 DATA ENDS + 4 + 5 0000 CODE SEGMENT + 6 ASSUME CS:CODE, DS:DATA + 7 + 8 0000 START: + 9 0000 B8 0000s MOV AX, DATA + 10 0003 8E D8 MOV DS, AX + 11 + 12 0005 BA 0283 MOV DX, 283H + 13 0008 B0 36 MOV AL, 00110110B + 14 000A EE OUT DX, AL + 15 000B BA 0280 MOV DX, 280H + 16 000E B0 F4 MOV AL, 11110100B + 17 0010 EE OUT DX, AL + 18 0011 B0 01 MOV AL, 00000001B + 19 0013 EE OUT DX, AL + 20 + 21 0014 CODE ENDS + 22 END START + Turbo Assembler Version 5.3 05-09-23 17:33:28 Page 2 +Symbol Table + + + + +Symbol Name Type Value + +??DATE Text "05-09-23" +??FILENAME Text "code " +??TIME Text "17:33:28" +??VERSION Number 0503 +@CPU Text 0101H +@CURSEG Text CODE +@FILENAME Text CODE +@WORDSIZE Text 2 +START Near16 CODE:0000 + +Groups & Segments Bit Size Align Combine Class + +CODE 16 0014 Para none +DATA 16 0000 Para none + \ No newline at end of file diff --git a/Lab/Lab4/material/task2/code.MAP b/Lab/Lab4/material/task2/code.MAP new file mode 100755 index 0000000..3086f37 --- /dev/null +++ b/Lab/Lab4/material/task2/code.MAP @@ -0,0 +1,7 @@ +LINK : warning L4021: no stack segment + + Start Stop Length Name Class + 00000H 00000H 00000H DATA + 00000H 00013H 00014H CODE + +Program entry point at 0000:0000 diff --git a/Lab/Lab4/material/task2/code.OBJ b/Lab/Lab4/material/task2/code.OBJ new file mode 100755 index 0000000..25e9d2f Binary files /dev/null and b/Lab/Lab4/material/task2/code.OBJ differ diff --git a/Lab/Lab4/material/task2/code.asm b/Lab/Lab4/material/task2/code.asm new file mode 100755 index 0000000..7a7b95f --- /dev/null +++ b/Lab/Lab4/material/task2/code.asm @@ -0,0 +1,22 @@ +DATA SEGMENT + +DATA ENDS + +CODE SEGMENT + ASSUME CS:CODE, DS:DATA + + START: + MOV AX, DATA + MOV DS, AX + + MOV DX, 283H ; 命令口 + MOV AL, 00110110B ; 00(0号计数器)|11(读写2字节)|011(3方式工作)|0(计数值为2进制) + OUT DX, AL + MOV DX, 280H ; 0号计数器 + MOV AL, 11110100B ; (500)_D的2进制的低8位 + OUT DX, AL + MOV AL, 00000001B ; (500)_D的2进制的高8位 + OUT DX, AL + +CODE ENDS +END START \ No newline at end of file diff --git a/Lab/Lab4/material/task3.drawio b/Lab/Lab4/material/task3.drawio new file mode 100755 index 0000000..5cc6df7 --- /dev/null +++ b/Lab/Lab4/material/task3.drawio @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Lab/Lab4/material/task3.drawio.svg b/Lab/Lab4/material/task3.drawio.svg new file mode 100755 index 0000000..b934e7b --- /dev/null +++ b/Lab/Lab4/material/task3.drawio.svg @@ -0,0 +1,4 @@ + + + +
程序开始
程序开始
向283H口输出方式命令字0011,0100B
向283H口输出方式命令字0011,0100B
向280H口输出计数初值低字节1110,1000B
向280H口输出计数初值低字节1110,1000B
向280H口输出计数初值高字节0000,0011B
向280H口输出计数初值高字节0000,0011B
向283H口输出方式命令字0101,0110B
向283H口输出方式命令字0101,0110B
向280H口输出计数初值0000,1010B
向280H口输出计数初值0000,1010B
程序结束
程序结束
Text is not SVG - cannot display
\ No newline at end of file diff --git a/Lab/Lab4/material/task3/code.EXE b/Lab/Lab4/material/task3/code.EXE new file mode 100755 index 0000000..a9c4406 Binary files /dev/null and b/Lab/Lab4/material/task3/code.EXE differ diff --git a/Lab/Lab4/material/task3/code.LST b/Lab/Lab4/material/task3/code.LST new file mode 100755 index 0000000..6d60943 --- /dev/null +++ b/Lab/Lab4/material/task3/code.LST @@ -0,0 +1,57 @@ +Turbo Assembler Version 5.3 05-06-23 20:03:59 Page 1 +code.asm + + + + 1 0000 DATA SEGMENT + 2 + 3 0000 DATA ENDS + 4 + 5 0000 CODE SEGMENT + 6 ASSUME CS:CODE, DS:DATA + 7 + 8 0000 START: + 9 0000 B8 0000s MOV AX, DATA + 10 0003 8E D8 MOV DS, AX + 11 + 12 0005 BA 0283 MOV DX, 283H + 13 0008 B0 34 MOV AL, 00110100B + 14 000A EE OUT DX, AL + 15 000B BA 0280 MOV DX, 280H + 16 000E B0 E8 MOV AL, 11101000B + 17 0010 EE OUT DX, AL + 18 0011 B0 03 MOV AL, 00000011B + 19 0013 EE OUT DX, AL + 20 + 21 0014 BA 0283 MOV DX, 283H + 22 0017 B0 56 MOV AL, 01010110B + 23 0019 EE OUT DX, AL + 24 001A BA 0281 MOV DX, 281H + 25 001D B0 0A MOV AL, 00001010B + 26 001F EE OUT DX, AL + 27 + 28 0020 CODE ENDS + 29 END START + Turbo Assembler Version 5.3 05-06-23 20:03:59 Page 2 +Symbol Table + + + + +Symbol Name Type Value + +??DATE Text "05-06-23" +??FILENAME Text "code " +??TIME Text "20:03:59" +??VERSION Number 0503 +@CPU Text 0101H +@CURSEG Text CODE +@FILENAME Text CODE +@WORDSIZE Text 2 +START Near16 CODE:0000 + +Groups & Segments Bit Size Align Combine Class + +CODE 16 0020 Para none +DATA 16 0000 Para none + \ No newline at end of file diff --git a/Lab/Lab4/material/task3/code.MAP b/Lab/Lab4/material/task3/code.MAP new file mode 100755 index 0000000..d0dc942 --- /dev/null +++ b/Lab/Lab4/material/task3/code.MAP @@ -0,0 +1,7 @@ +LINK : warning L4021: no stack segment + + Start Stop Length Name Class + 00000H 00000H 00000H DATA + 00000H 0001FH 00020H CODE + +Program entry point at 0000:0000 diff --git a/Lab/Lab4/material/task3/code.OBJ b/Lab/Lab4/material/task3/code.OBJ new file mode 100755 index 0000000..bc656dd Binary files /dev/null and b/Lab/Lab4/material/task3/code.OBJ differ diff --git a/Lab/Lab4/material/task3/code.asm b/Lab/Lab4/material/task3/code.asm new file mode 100755 index 0000000..e23330b --- /dev/null +++ b/Lab/Lab4/material/task3/code.asm @@ -0,0 +1,29 @@ +DATA SEGMENT + +DATA ENDS + +CODE SEGMENT + ASSUME CS:CODE, DS:DATA + + START: + MOV AX, DATA + MOV DS, AX + + MOV DX, 283H ; 命令口 + MOV AL, 00110100B ; 00(0号计数器)|11(读写2字节)|010(2方式工作)|0(计数值为2进制) + OUT DX, AL + MOV DX, 280H ; 0号计数器 + MOV AL, 11101000B ; (1000)_D的2进制的低8位 + OUT DX, AL + MOV AL, 00000011B ; (1000)_D的2进制的高8位 + OUT DX, AL + + MOV DX, 283H ; 命令口 + MOV AL, 01010110B ; 01(1号计数器)|01(读写低字节,高字节为0)|011(3方式工作)|0(计数值为2进制) + OUT DX, AL + MOV DX, 281H ; 1号计数器 + MOV AL, 00001010B ; (10)_D的2进制 + OUT DX, AL + +CODE ENDS +END START \ No newline at end of file diff --git a/Lab/Lab4/接口技术常规实验指导书.doc b/Lab/Lab4/接口技术常规实验指导书.doc new file mode 100755 index 0000000..0ab3385 Binary files /dev/null and b/Lab/Lab4/接口技术常规实验指导书.doc differ diff --git a/Lab/Lab5/21281280_柯劲帆_第5次实验_8259中断实验/21281280_柯劲帆_第5次实验_8259中断实验.pdf b/Lab/Lab5/21281280_柯劲帆_第5次实验_8259中断实验/21281280_柯劲帆_第5次实验_8259中断实验.pdf new file mode 100755 index 0000000..954d242 Binary files /dev/null and b/Lab/Lab5/21281280_柯劲帆_第5次实验_8259中断实验/21281280_柯劲帆_第5次实验_8259中断实验.pdf differ diff --git a/Lab/Lab5/material/1.1.png b/Lab/Lab5/material/1.1.png new file mode 100755 index 0000000..2874da3 Binary files /dev/null and b/Lab/Lab5/material/1.1.png differ diff --git a/Lab/Lab5/material/1.3.png b/Lab/Lab5/material/1.3.png new file mode 100755 index 0000000..c4c4b7b Binary files /dev/null and b/Lab/Lab5/material/1.3.png differ diff --git a/Lab/Lab5/material/2.1.jpg b/Lab/Lab5/material/2.1.jpg new file mode 100755 index 0000000..387a0ab Binary files /dev/null and b/Lab/Lab5/material/2.1.jpg differ diff --git a/Lab/Lab5/material/21281280_柯劲帆_第5次实验_8259中断实验.md b/Lab/Lab5/material/21281280_柯劲帆_第5次实验_8259中断实验.md new file mode 100755 index 0000000..0c6c81b --- /dev/null +++ b/Lab/Lab5/material/21281280_柯劲帆_第5次实验_8259中断实验.md @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + +![cover](cover.png) + + + + + + + + + + + +

实验五 8259中断实验

+ +### 一、实验目的 + +该实验使学生掌握$8259$向量中断方式的硬件连接和软件编程的方法,同时使同学掌握中断和其它接口芯片配合来完成某一特定任务的方法。 + + + +### 二、实验内容 + +手动产生单脉冲作为中断请求信号连接到$\rm {MIRQ}_3$(对应中断号$\rm 0BH$)上和$\rm {SIRQ}_{10}$(对应中断号$\rm 72H$)上。每按一次开关产生一次中断,某$\rm LED$灯就亮或灭一次(上次亮,当前就灭;上次灭,当前就亮),中断$10$次后程序退出。其中,主$8259$的端口地址为$\rm 20H$,从片$8259$的端口地址为$\rm 0A0H$。 + +1.1 + +连线:总线$\rm {MIRQ}_x$接单脉冲$1$正脉冲,总线$\rm {SIRQ}_x$接单脉冲$2$正脉冲。 + + + +### 三、流程图 + +graph + + + +### 四、实验过程与分析 + +首先连好接线,如图4-1所示。单脉冲$1$连$\rm {MIRQ}_{3}$,单脉冲$2$连$\rm {SIRQ}_{10}$,$8255$芯片连$\rm 280H$,$8255$的$\rm {PC}_0$连$\rm {LED}_7$。 + +4-1 + +
图4-1 硬件连接图
+ +按动任意的单脉冲$1/2$,就会触发中断程序,$\rm LED$就会将当前状态取反,并将触发计数加$1$。 + +主程序不断检测触发计数,当触发计数超过$10$时,退出程序。 + +因此按单脉冲$10$次之后,$\rm LED$不会再有任何变化。 + + + +### 五、实验总结 + +通过本实验,我掌握$8259$向量中断方式的硬件连接和软件编程的方法,同时掌握了中断和其它接口芯片(如$8255$芯片)配合来完成某一特定任务的方法。 + + + +### 六、思考题 + +> 如何理解采用中断方式进行实时控制,请举一些可能的应用例子。 + +如图6-1所示,当中断引脚检测到触发信号时,若中断屏蔽开放,$\rm CPU$会从当前主程序或中断服务中跳出,立即执行相应的中断服务程序,因此实现了实时控制。如果没有中断系统,CPU就只能按照原来的程序编写的先后顺序,对各个外设进行查询和处理,这样实际工作效率很低,不能及时响应紧急事件。 + +6-1 + +
图6-1 中断程序运行流程图
+ +应用例子: + +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 +``` diff --git a/Lab/Lab5/material/21281280_柯劲帆_第5次实验_8259中断实验.pdf b/Lab/Lab5/material/21281280_柯劲帆_第5次实验_8259中断实验.pdf new file mode 100755 index 0000000..a51f4b7 Binary files /dev/null and b/Lab/Lab5/material/21281280_柯劲帆_第5次实验_8259中断实验.pdf differ diff --git a/Lab/Lab5/material/code.EXE b/Lab/Lab5/material/code.EXE new file mode 100755 index 0000000..8593817 Binary files /dev/null and b/Lab/Lab5/material/code.EXE differ diff --git a/Lab/Lab5/material/code.LST b/Lab/Lab5/material/code.LST new file mode 100755 index 0000000..44a9c24 --- /dev/null +++ b/Lab/Lab5/material/code.LST @@ -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 + \ No newline at end of file diff --git a/Lab/Lab5/material/code.MAP b/Lab/Lab5/material/code.MAP new file mode 100755 index 0000000..0c4a076 --- /dev/null +++ b/Lab/Lab5/material/code.MAP @@ -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 diff --git a/Lab/Lab5/material/code.OBJ b/Lab/Lab5/material/code.OBJ new file mode 100755 index 0000000..7ac5113 Binary files /dev/null and b/Lab/Lab5/material/code.OBJ differ diff --git a/Lab/Lab5/material/code.asm b/Lab/Lab5/material/code.asm new file mode 100755 index 0000000..0f19fb1 --- /dev/null +++ b/Lab/Lab5/material/code.asm @@ -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 \ No newline at end of file diff --git a/Lab/Lab5/material/cover.png b/Lab/Lab5/material/cover.png new file mode 100755 index 0000000..a0a082e Binary files /dev/null and b/Lab/Lab5/material/cover.png differ diff --git a/Lab/Lab5/material/graph.drawio b/Lab/Lab5/material/graph.drawio new file mode 100755 index 0000000..cfcff92 --- /dev/null +++ b/Lab/Lab5/material/graph.drawio @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Lab/Lab5/material/graph.drawio.svg b/Lab/Lab5/material/graph.drawio.svg new file mode 100755 index 0000000..cadbf8d --- /dev/null +++ b/Lab/Lab5/material/graph.drawio.svg @@ -0,0 +1,4 @@ + + + +
程序开始
程序开始
将新的中断程序的地址
写入主片和从片的对应的中断号
将新的中断程序的地址 写入主片和从片的对应的中断号
获取并保存主片和从片的原中断向量
获取并保存主片和从片的原中断向量
打开主片和从片相应的中断屏蔽
打开主片和从片相应的中断屏蔽
初始化8255芯片
初始化8255芯片
开中断
开中断
Y
Y
N
N
判断计数是否达到10次
判断计数是否达到10次
程序结束
程序结束
收到高脉冲,中断程序开始
收到高脉冲,中断程序开始
将LED灯状态取反
将LED灯状态取反
状态压栈,关中断
状态压栈,关中断
计数加1
计数加1
向主从、片发送EOI命令,开中断,状态退栈
向主从、片发送EOI命令,开中断,状态退栈
中断程序结束
中断程序结束
恢复主片和从片的原中断向量
恢复主片和从片的原中断向量
关闭主片和从片相应的中断屏蔽
关闭主片和从片相应的中断屏蔽
Text is not SVG - cannot display
\ No newline at end of file diff --git a/Lab/Lab5/接口技术常规实验指导书.doc b/Lab/Lab5/接口技术常规实验指导书.doc new file mode 100755 index 0000000..0ab3385 Binary files /dev/null and b/Lab/Lab5/接口技术常规实验指导书.doc differ diff --git a/Lab/Lab6/21281280_柯劲帆_第6次实验_中断方式的AD采集系统.zip b/Lab/Lab6/21281280_柯劲帆_第6次实验_中断方式的AD采集系统.zip new file mode 100755 index 0000000..9870246 Binary files /dev/null and b/Lab/Lab6/21281280_柯劲帆_第6次实验_中断方式的AD采集系统.zip differ diff --git a/Lab/Lab6/21281280_柯劲帆_第6次实验_中断方式的AD采集系统/21281280_柯劲帆_第6次实验_中断方式的AD采集系统.pdf b/Lab/Lab6/21281280_柯劲帆_第6次实验_中断方式的AD采集系统/21281280_柯劲帆_第6次实验_中断方式的AD采集系统.pdf new file mode 100755 index 0000000..9022cdd Binary files /dev/null and b/Lab/Lab6/21281280_柯劲帆_第6次实验_中断方式的AD采集系统/21281280_柯劲帆_第6次实验_中断方式的AD采集系统.pdf differ diff --git a/Lab/Lab6/21281280_柯劲帆_第6次实验_中断方式的AD采集系统/code.asm b/Lab/Lab6/21281280_柯劲帆_第6次实验_中断方式的AD采集系统/code.asm new file mode 100755 index 0000000..174b043 --- /dev/null +++ b/Lab/Lab6/21281280_柯劲帆_第6次实验_中断方式的AD采集系统/code.asm @@ -0,0 +1,171 @@ +DATA SEGMENT + LED DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H + OLD_OFF DW 0 + OLD_SEG DW 0 + CNT DW 0 + TMP DB 0 + BUFFER DB 100 (0) +DATA ENDS + +CODE SEGMENT + ASSUME DS:DATA, CS:CODE + START: + MOV AX, DATA + MOV DS, AX + + ; 保存旧的中断向量 + MOV AX, 350BH + INT 21H + MOV OLD_OFF, BX + MOV BX, ES + MOV OLD_SEG, BX + CLI + + ; 设置新的中断向量 + MOV AX, 250BH + MOV DX, SEG A_D + MOV DS, DX + MOV DX, OFFSET A_D + INT 21H + + ; 恢复数据段 + MOV AX, DATA + MOV DS, AX + + ; 设置中断屏蔽 + IN AL, 21H + AND AL, 11110111B + OUT 21H, AL + + ; 初始化8255 + MOV DX, 283H + MOV AL, 10000000B ; 全输出 + OUT DX, AL + + ; 启动ADC0809 + MOV DX, 288H + OUT DX, AL ; 脉冲模式启动 + + MOV CX, 100 ; 转换次数 + MOV SI, 0 ; 转换成功标志位,置零 + + LOOP1: + STI + IN AL, DX + CMP SI, 1 ; 判断转换成功 + JNE LOOP1 ; 没有转换成功重新判断 + CALL DELAY ; 延时 + CLI + MOV DX, 288H ; 重新打开ADC0809 + OUT DX, AL + DEC CX + JZ FINISH + JMP LOOP1 + + FINISH: + CLI ; 关中断 + MOV AX, 250BH ; 恢复原来的中断向量 + MOV DX, OLD_OFF + MOV DS, DX + MOV DS, OLD_SEG + INT 21H + + MOV AX, 4C00H + INT 21H + +A_D PROC FAR + PUSH AX ; 保护现场 + PUSH DX + PUSH CX + MOV SI, 1 ; 设定转换标志位 + MOV DX, 288H + IN AL, DX + + MOV TMP, AL ; 保存数据 + MOV DI, CNT + CMP DI, 100 + JE DISPLAY + MOV BUFFER[DI], AL + INC DI + MOV CNT, DI + + MOV CX, 6 ; 刷新6次 + + DISPLAY: + ; 显示高四位 + MOV AL, 0 + MOV DX, 281H + OUT DX, AL + + MOV AL, TMP + SHR AL, 4 ; 右移4位 + MOV BX, OFFSET LED + XLAT + MOV DX, 280H ; 段码 + OUT DX, AL + MOV AL, 00000010B + MOV DX, 281H ; 位码 + OUT DX, AL + CALL DELAY2 + + ; 显示低四位 + MOV AL, 0 + MOV DX, 281H + OUT DX, AL + + MOV AL, TMP + AND AL, 00001111B + MOV BX, OFFSET LED + XLAT + MOV DX, 280H ; 段码 + OUT DX, AL + MOV AL, 00000001B ; 位码 + MOV DX, 281H + OUT DX, AL + CALL DELAY2 + + LOOP DISPLAY + + STI + MOV AL, 20H ; 发送EOI指令 + OUT 20H, AL + POP CX + POP DX + POP AX + IRET +A_D ENDP + +DELAY PROC NEAR + PUSH CX + PUSH BX + MOV CX, 0FFFFH + LOOP2: + MOV BX, 01FH + LOOP3: + DEC BX + JNZ LOOP3 + DEC CX + JNZ LOOP2 + POP BX + POP CX + RET +DELAY ENDP + +DELAY2 PROC NEAR + PUSH CX + PUSH BX + MOV CX, 0FFFFH + LOOP4: + MOV BX, 5 + LOOP5: + DEC BX + JNZ LOOP5 + DEC CX + JNZ LOOP4 + POP BX + POP CX + RET +DELAY2 ENDP + +CODE ENDS +END START \ No newline at end of file diff --git a/Lab/Lab6/material/.$graph.drawio.bkp b/Lab/Lab6/material/.$graph.drawio.bkp new file mode 100755 index 0000000..39ad288 --- /dev/null +++ b/Lab/Lab6/material/.$graph.drawio.bkp @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Lab/Lab6/material/.$graph.drawio.dtmp b/Lab/Lab6/material/.$graph.drawio.dtmp new file mode 100755 index 0000000..7e78c9c --- /dev/null +++ b/Lab/Lab6/material/.$graph.drawio.dtmp @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Lab/Lab6/material/2.jpg b/Lab/Lab6/material/2.jpg new file mode 100755 index 0000000..b4ddc2f Binary files /dev/null and b/Lab/Lab6/material/2.jpg differ diff --git a/Lab/Lab6/material/21281280_柯劲帆_第6次实验_中断方式的AD采集系统.md b/Lab/Lab6/material/21281280_柯劲帆_第6次实验_中断方式的AD采集系统.md new file mode 100755 index 0000000..9432c0a --- /dev/null +++ b/Lab/Lab6/material/21281280_柯劲帆_第6次实验_中断方式的AD采集系统.md @@ -0,0 +1,248 @@ + + + + + + + + + + + + + + +![cover](cover.png) + + + + + + + + + + + +

实验六 中断方式的AD采集系统

+ +### 一、实验目的 + +该实验使用了$\rm 8259A$,$\rm ADC0809$,数码管来完成一个数据采集系统的设计,目的是了解中断方式的$\rm A/D$采集数据的实现方法,掌握硬件设计和中断程序的编写方法,是对学生综合实验能力的训练。 + + + +### 二、实验内容 + +使用$\rm ADC0809$的通道0,接入$0-5\rm V$的直流电压,用“直流信号”电位器调整模拟电压值,$\rm A/D$的转换结束信号$\rm EOC$接在主$\rm 8259A$的$\rm {MIRQ}_3$上,采集$100$个数据并存入内存中,同时将采集的$16$进制数据显示在数码管上。请多次调整$0-5\rm V$的电压值(旋动“直流信号”旋钮),进行$\rm A/D$采集,并观测内存中的数据的变化情况。 + + + +### 三、流程图 + +graph + + + +### 四、实验过程与分析 + +首先连好接线。 + +$8255$芯片$\rm CS$连接译码地址$\rm 280H$,$8255$芯片$\rm A$口接数码管段码,$8255$芯片$\rm B$口接数码管位码; + +$\rm ADC0809$芯片$\rm CS$连接译码地址$\rm 288H$,$\rm ADC0809$芯片$\rm IN1$连接直流信号,$\rm ADC0809$芯片$\rm EOC$连接$\rm {MIRQ}_3$。 + +4-1 + +
图4-1 硬件连接图
+ +启动汇编程序,旋动直流信号旋钮。 + +$\rm ADC0809$每次结束转换,$\rm EOC$就会输出脉冲触发中断程序,将转换结果通过$8255$芯片在数码管上显示出来,并将转换计数减$1$。 + +主程序不断检测转换计数,当转换计数为$0$时,退出主程序。 + + + +### 五、实验总结 + +通过本实验,我了解了中断方式的$\rm A/D$采集数据的实现方法,掌握了硬件设计和中断程序的编写方法,我的综合实验能力得到了训练。 + + + +### 源代码附录 + +```assembly +DATA SEGMENT + LED DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H + OLD_OFF DW 0 ; 旧的中断偏移地址 + OLD_SEG DW 0 ; 旧的中断段地址 + CNT DW 0 ; 计数器 + TMP DB 0 ; 临时变量 + BUFFER DB 100 (0) ; 缓冲区,大小为100字节,初始化为0 +DATA ENDS + +CODE SEGMENT + ASSUME DS:DATA, CS:CODE + START: + MOV AX, DATA + MOV DS, AX + + ; 保存旧的中断向量 + MOV AX, 350BH ; 获取原来的中断号为0BH的中断向量 + INT 21H ; 将中断向量的偏移地址存在BX,段地址存在ES + MOV OLD_OFF, BX ; 分别将原来中断向量的偏移地址和段地址保存 + MOV BX, ES + MOV OLD_SEG, BX + + CLI + ; 设置新的中断向量 + MOV DX, SEG A_D ; 将新中断向量的段地址存入DX + MOV DS, DX ; 再装到DS + MOV DX, OFFSET A_D ; 将新中断向量的偏移地址存入DX + MOV AX, 250BH ; 装填到中断向量表里中断号为0BH的中断向量 + INT 21H + + ; 重新加载数据段地址 + MOV AX, DATA + MOV DS, AX + + ; 设置中断屏蔽 + IN AL, 21H ; 读取中断屏蔽寄存器 + AND AL, 11110111B ; 将第3位设置为1 + OUT 21H, AL ; 将修改后的值写入中断屏蔽寄存器 + STI ; 设置中断标志,允许跳转到中断程序 + + ; 初始化8255 + MOV DX, 283H ; 设置8255芯片的命令口 + MOV AL, 10000000B ; 全输出 + OUT DX, AL + + ; 启动ADC0809 + MOV DX, 288H ; 设置ADC0809的命令口 + OUT DX, AL ; 向ADC0809发送脉冲模式启动命令 + + MOV CX, 100 ; 转换次数 + MOV SI, 0 ; 转换成功标志位,置零 + + LOOP1: + STI ; 设置中断标志,允许跳转到中断程序 + IN AL, DX ; 从ADC0809读取转换结果 + CMP SI, 1 ; 判断转换成功 + JNE LOOP1 ; 如果转换未成功,则重新判断 + CALL DELAY ; 延时 + CLI ; 清除中断标志,禁止跳转到其他中断程序 + MOV DX, 288H ; 重新打开ADC0809 + OUT DX, AL + DEC CX + JZ FINISH ; 如果转换次数为0,跳转到FINISH + JMP LOOP1 + + FINISH: + CLI ; 关中断 + MOV AX, 250BH ; 恢复原来的中断向量 + MOV DX, OLD_OFF + MOV DS, DX + MOV DS, OLD_SEG + INT 21H + + MOV AX, 4C00H + INT 21H + +A_D PROC FAR + PUSH AX ; 保护现场 + PUSH DX + PUSH CX + MOV SI, 1 ; 设定转换标志位 + MOV DX, 288H + IN AL, DX + + MOV TMP, AL ; 保存数据 + MOV DI, CNT + CMP DI, 100 + JE DISPLAY + MOV BUFFER[DI], AL + INC DI + MOV CNT, DI + + MOV CX, 6 ; 刷新6次 + + DISPLAY: + ; 显示高四位 + MOV AL, 0 + MOV DX, 281H + OUT DX, AL + + MOV AL, TMP + SHR AL, 4 ; 右移4位 + MOV BX, OFFSET LED + XLAT ; 使用BX寄存器作为LED数组的索引,将LED数组中下标为BX的值传给AL + MOV DX, 280H ; 段码 + OUT DX, AL + MOV AL, 00000010B ; 倒数第2位显示AD转换结果的高4位 + MOV DX, 281H ; 位码 + OUT DX, AL + CALL DELAY2 + + ; 显示低四位 + MOV AL, 0 + MOV DX, 281H + OUT DX, AL + + MOV AL, TMP + AND AL, 00001111B + MOV BX, OFFSET LED + XLAT ; 使用BX寄存器作为LED数组的索引,将LED数组中下标为BX的值传给AL + MOV DX, 280H ; 段码 + OUT DX, AL + MOV AL, 00000001B ; 倒数第1位显示AD转换结果的低4位 + MOV DX, 281H ; 位码 + OUT DX, AL + CALL DELAY2 + + LOOP DISPLAY + + STI + MOV AL, 20H ; 发送EOI指令 + OUT 20H, AL + POP CX + POP DX + POP AX + IRET +A_D ENDP + +DELAY PROC NEAR + PUSH CX + PUSH BX + MOV CX, 0FFFFH + LOOP2: + MOV BX, 01FH + LOOP3: + DEC BX + JNZ LOOP3 + DEC CX + JNZ LOOP2 + POP BX + POP CX + RET +DELAY ENDP + +DELAY2 PROC NEAR + PUSH CX + PUSH BX + MOV CX, 0FFFFH + LOOP4: + MOV BX, 5 + LOOP5: + DEC BX + JNZ LOOP5 + DEC CX + JNZ LOOP4 + POP BX + POP CX + RET +DELAY2 ENDP + +CODE ENDS +END START +``` diff --git a/Lab/Lab6/material/21281280_柯劲帆_第6次实验_中断方式的AD采集系统.pdf b/Lab/Lab6/material/21281280_柯劲帆_第6次实验_中断方式的AD采集系统.pdf new file mode 100755 index 0000000..76de0ee Binary files /dev/null and b/Lab/Lab6/material/21281280_柯劲帆_第6次实验_中断方式的AD采集系统.pdf differ diff --git a/Lab/Lab6/material/code.asm b/Lab/Lab6/material/code.asm new file mode 100755 index 0000000..48cae81 --- /dev/null +++ b/Lab/Lab6/material/code.asm @@ -0,0 +1,172 @@ +DATA SEGMENT + LED DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H + OLD_OFF DW 0 ; 旧的中断偏移地址 + OLD_SEG DW 0 ; 旧的中断段地址 + CNT DW 0 ; 计数器 + TMP DB 0 ; 临时变量 + BUFFER DB 100 (0) ; 缓冲区,大小为100字节,初始化为0 +DATA ENDS + +CODE SEGMENT + ASSUME DS:DATA, CS:CODE + START: + MOV AX, DATA + MOV DS, AX + + ; 保存旧的中断向量 + MOV AX, 350BH ; 获取原来的中断号为0BH的中断向量 + INT 21H ; 将中断向量的偏移地址存在BX,段地址存在ES + MOV OLD_OFF, BX ; 分别将原来中断向量的偏移地址和段地址保存 + MOV BX, ES + MOV OLD_SEG, BX + + CLI + ; 设置新的中断向量 + MOV DX, SEG A_D ; 将新中断向量的段地址存入DX + MOV DS, DX ; 再装到DS + MOV DX, OFFSET A_D ; 将新中断向量的偏移地址存入DX + MOV AX, 250BH ; 装填到中断向量表里中断号为0BH的中断向量 + INT 21H + + ; 重新加载数据段地址 + MOV AX, DATA + MOV DS, AX + + ; 设置中断屏蔽 + IN AL, 21H ; 读取中断屏蔽寄存器 + AND AL, 11110111B ; 将第3位设置为1 + OUT 21H, AL ; 将修改后的值写入中断屏蔽寄存器 + STI ; 设置中断标志,允许跳转到中断程序 + + ; 初始化8255 + MOV DX, 283H ; 设置8255芯片的命令口 + MOV AL, 10000000B ; 全输出 + OUT DX, AL + + ; 启动ADC0809 + MOV DX, 288H ; 设置ADC0809的命令口 + OUT DX, AL ; 向ADC0809发送脉冲模式启动命令 + + MOV CX, 100 ; 转换次数 + MOV SI, 0 ; 转换成功标志位,置零 + + LOOP1: + STI ; 设置中断标志,允许跳转到中断程序 + IN AL, DX ; 从ADC0809读取转换结果 + CMP SI, 1 ; 判断转换成功 + JNE LOOP1 ; 如果转换未成功,则重新判断 + CALL DELAY ; 延时 + CLI ; 清除中断标志,禁止跳转到其他中断程序 + MOV DX, 288H ; 重新打开ADC0809 + OUT DX, AL + DEC CX + JZ FINISH ; 如果转换次数为0,跳转到FINISH + JMP LOOP1 + + FINISH: + CLI ; 关中断 + MOV AX, 250BH ; 恢复原来的中断向量 + MOV DX, OLD_OFF + MOV DS, DX + MOV DS, OLD_SEG + INT 21H + + MOV AX, 4C00H + INT 21H + +A_D PROC FAR + PUSH AX ; 保护现场 + PUSH DX + PUSH CX + MOV SI, 1 ; 设定转换标志位 + MOV DX, 288H + IN AL, DX + + MOV TMP, AL ; 保存数据 + MOV DI, CNT + CMP DI, 100 + JE DISPLAY + MOV BUFFER[DI], AL + INC DI + MOV CNT, DI + + MOV CX, 6 ; 刷新6次 + + DISPLAY: + ; 显示高四位 + MOV AL, 0 + MOV DX, 281H + OUT DX, AL + + MOV AL, TMP + SHR AL, 4 ; 右移4位 + MOV BX, OFFSET LED + XLAT ; 使用BX寄存器作为LED数组的索引,将LED数组中下标为BX的值传给AL + MOV DX, 280H ; 段码 + OUT DX, AL + MOV AL, 00000010B ; 倒数第2位显示AD转换结果的高4位 + MOV DX, 281H ; 位码 + OUT DX, AL + CALL DELAY2 + + ; 显示低四位 + MOV AL, 0 + MOV DX, 281H + OUT DX, AL + + MOV AL, TMP + AND AL, 00001111B + MOV BX, OFFSET LED + XLAT ; 使用BX寄存器作为LED数组的索引,将LED数组中下标为BX的值传给AL + MOV DX, 280H ; 段码 + OUT DX, AL + MOV AL, 00000001B ; 倒数第1位显示AD转换结果的低4位 + MOV DX, 281H ; 位码 + OUT DX, AL + CALL DELAY2 + + LOOP DISPLAY + + STI + MOV AL, 20H ; 发送EOI指令 + OUT 20H, AL + POP CX + POP DX + POP AX + IRET +A_D ENDP + +DELAY PROC NEAR + PUSH CX + PUSH BX + MOV CX, 0FFFFH + LOOP2: + MOV BX, 01FH + LOOP3: + DEC BX + JNZ LOOP3 + DEC CX + JNZ LOOP2 + POP BX + POP CX + RET +DELAY ENDP + +DELAY2 PROC NEAR + PUSH CX + PUSH BX + MOV CX, 0FFFFH + LOOP4: + MOV BX, 5 + LOOP5: + DEC BX + JNZ LOOP5 + DEC CX + JNZ LOOP4 + POP BX + POP CX + RET +DELAY2 ENDP + +CODE ENDS +END START \ No newline at end of file diff --git a/Lab/Lab6/material/cover.png b/Lab/Lab6/material/cover.png new file mode 100755 index 0000000..7625d51 Binary files /dev/null and b/Lab/Lab6/material/cover.png differ diff --git a/Lab/Lab6/material/graph.drawio b/Lab/Lab6/material/graph.drawio new file mode 100755 index 0000000..c165778 --- /dev/null +++ b/Lab/Lab6/material/graph.drawio @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Lab/Lab6/material/graph.drawio.svg b/Lab/Lab6/material/graph.drawio.svg new file mode 100755 index 0000000..fefcb2a --- /dev/null +++ b/Lab/Lab6/material/graph.drawio.svg @@ -0,0 +1,4 @@ + + + +
主程序开始
主程序开始
保存旧的中断向量
保存旧的中断向量
设置中断屏蔽
设置中断屏蔽
初始化8255芯片,设置全输出
初始化8255芯片,设置全输出
启动ADC0809进行转换
启动ADC0809进行转换
进入延时子程序,延时一小段时间
进入延时子程序,延时一小段时间
使用ROR指令AL向右移一位
使用ROR指令AL向右移一位
设置新的终端向量
设置新的终端向量
初始化
初始化
开始转换
开始转换
设置转换次数
设置转换次数
设置转换成功标志,置0
设置转换成功标志,置0
延时
延时
Y
Y
N
N
判断是否转换成功
(转换成功标志是否为1)
判断是否转换成功 (转换成功标志是否为1)
重新启动ACD0809进行转换
重新启动ACD0809进行转换
Y
Y
N
N
判断转换次数是否用尽
判断转换次数是否用尽
主程序结束
主程序结束
收到EOC信号,
中断程序开始
收到EOC信号,...
保护现场
保护现场
置转换成功标志为1
置转换成功标志为1
从ADC0809获取转换信息
从ADC0809获取转换信息
向内存数组中保存转换信息
向内存数组中保存转换信息
设置刷新次数
设置刷新次数
将8位转换信息右移4位,作为段码从8255芯片A口输出,B口设置位码
将8位转换信息右移4位,作为段码从8255芯片A口输出,B口设置位码
将8位转换信息高4位置零,作为段码从8255芯片A口输出,B口设置位码
将8位转换信息高4位置零,作为段码从8255芯片A口输出,B口设置位码
Y
Y
N
N
判断刷新次数是否用尽
判断刷新次数是否用尽
发送EOI指令
发送EOI指令
恢复现场
恢复现场
中断程序结束
中断程序结束
Text is not SVG - cannot display
\ No newline at end of file diff --git a/Lab/Lab6/~$技术常规实验指导书.doc b/Lab/Lab6/~$技术常规实验指导书.doc new file mode 100755 index 0000000..25a29f5 Binary files /dev/null and b/Lab/Lab6/~$技术常规实验指导书.doc differ diff --git a/Lab/Lab6/接口技术常规实验指导书.doc b/Lab/Lab6/接口技术常规实验指导书.doc new file mode 100755 index 0000000..0ab3385 Binary files /dev/null and b/Lab/Lab6/接口技术常规实验指导书.doc differ diff --git a/Lab/Lab_final/material/Picture1.png b/Lab/Lab_final/material/Picture1.png new file mode 100755 index 0000000..50c27e2 Binary files /dev/null and b/Lab/Lab_final/material/Picture1.png differ diff --git a/Lab/Lab_final/material/Picture2.jpg b/Lab/Lab_final/material/Picture2.jpg new file mode 100755 index 0000000..4722d5d Binary files /dev/null and b/Lab/Lab_final/material/Picture2.jpg differ diff --git a/Lab/Lab_final/material/code.asm b/Lab/Lab_final/material/code.asm new file mode 100755 index 0000000..f7065be --- /dev/null +++ b/Lab/Lab_final/material/code.asm @@ -0,0 +1,339 @@ +DATA SEGMENT + A8255A EQU 280H + A8255B EQU 281H + A8255C EQU 282H + A8255COM EQU 283H + + A8254A EQU 288H + A8254B EQU 289H + A8254COM EQU 28BH + + OLD_OFF DW 0 + OLD_SEG DW 0 + + TMP1 DB 0 + TMP2 DB 0 + LED DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H + WAITING DB 40H ; 等待状态的字节码 + FAULT DB 71H ; 违规状态的字节码 + SUCCESS DB 6DH ; 抢答成功状态的字节码 + ZERO DB 3FH ; 数码管显示0的字节码 +DATA ENDS + +CODE SEGMENT + ASSUME DS:DATA, CS:CODE + + ; 1. 程序逻辑 + ;   1.1. 当K7为0时,K0-6都必须为0,否则为1的违规,数码管显示违规选手 && 扬声器鸣叫 + ;   1.2. 当K7为1时,当K0-6中有一个为1时,停止检测,为1的按键对应的选手抢答成功,数码管显示抢答成功选手 + ; 2. 程序设计 + ;   2.1. 2个PROC + ;       2.1.1. PROC1扫描到 K7为0 && K0-6中存在1的按键时进入,K0-6全为0时退出 + ;               进入PROC1后蜂鸣器响起,不断扫描K0-7,数码管显示违规选手。 + ;               当全为0时蜂鸣器关闭,退出PROC1 + ;       2.1.2. PROC2扫描到K7为1时进入,K7为0时退出 + ;               进入PROC2后循环扫描K0-7,K0-6存在1后数码管显示抢答成功选手 + ;               继续循环扫描,但只看K7,K7为0时退出 + ;               进入PROC2后进行计时,4秒后若无变化,触发中断,退出PROC + ;   2.2. 主程序 循环扫描K0-7 + ;       2.2.1. K7为0 && K0-6按键全0时不变,继续循环 + ;       2.2.2. K7为0 && K0-6中存在1的按键时进入PROC1 + ;       2.2.2. K7为1时进入PROC2 + + START: + MOV AX, DATA + MOV DS, AX + + CLI ; 关中断,防止中断干扰 + ; 保存旧的中断向量 + MOV AX, 350BH + INT 21H + MOV OLD_OFF, BX + MOV BX, ES + MOV OLD_SEG, BX + + ; 设置新的中断向量 + MOV AX, 250BH + MOV DX, SEG TIMEOUT + MOV DS, DX + MOV DX, OFFSET TIMEOUT + INT 21H + STI + + ; 恢复数据段 + MOV AX, DATA + MOV DS, AX + + ; 初始化8255 + MOV AX, 10001001B ; A口输出段码,B口输出位码,C口输入拨动开关 + MOV DX, A8255COM + OUT DX, AL + + ; 使用8254 A口将1MHz降频为1kHz,为8254 B口提供时钟源 + MOV DX, A8254COM + MOV AL, 00110110B + OUT DX, AL + MOV DX, A8254A + MOV AL, 11101000B + OUT DX, AL + MOV AL, 00000011B + OUT DX, AL + + ; 主程序 + MAIN: + MOV DX, A8255C + IN AL, DX + + MOV SI, 0 ; 中断标志位 + + ; K7为0 && K0-6按键全0时不变,继续循环 + CMP AL, 0 ; 比较AL寄存器的值与0 + JE MAIN ; 如果相等,则跳转到MAIN + + ; K7为0 && K0-6中存在1的按键时进入PROC1 + AND AL, 10000000B ; 将AL寄存器的值与10000000B进行按位与操作 + CMP AL, 0 ; 比较AL寄存器的值与0,即判断第7位是否为0 + JNE P2 ; 如果不相等,则跳转到P2 + CALL PROC1 ; 调用PROC1子程序 + + ; K7为1时进入PROC2 + P2: + CALL PROC2 ; 调用PROC2子程序 + JMP MAIN ; 无条件跳转到MAIN + + FINISH: + CLI ; 关中断,防止中断干扰 + MOV AX, 250BH ; 恢复原来的中断向量 + MOV DX, OLD_OFF + MOV DS, DX + MOV DS, OLD_SEG + INT 21H + + MOV AX, 4C00H + INT 21H + +PROC1 PROC NEAR + + ; K7为0 && K0-6中存在1的按键时进入,K0-6全为0时退出 + ; 进入PROC1后蜂鸣器响起,不断扫描K0-7,数码管显示违规选手。 + ; 当全为0时,蜂鸣器关闭,退出PROC1 + + PUSH DX + PUSH CX + + LOOP1: + MOV DX, A8255C + IN AL, DX + MOV TMP1, AL + + CMP AL, 0 + JE RETURN1 + + MOV CX, 8 + MOV TMP2, 10000000B ; 位码 + LOOP2: + ROR TMP2, 1 + JMP OUTPUT1 + BACK1: + LOOP LOOP2 + JMP LOOP1 + + ; 在数码管上输出 + OUTPUT1: + CALL CLEAR + MOV AL, TMP1 + AND AL, TMP2 + CMP AL, TMP2 + JE FAULT1 + MOV AL, WAITING + JMP DISPLAY1 + FAULT1: + MOV AL, FAULT + DISPLAY1: + MOV DX, A8255A + OUT DX, AL + MOV DX, A8255B + MOV AL, TMP2 + OUT DX, AL + CALL DELAY + JMP BACK1 + + RETURN1: + CALL CLEAR + POP CX + POP DX + RET +PROC1 ENDP + +PROC2 PROC NEAR + + ; 进入PROC2后循环扫描K0-7,K0-6存在1后数码管显示抢答成功选手 + ; 继续循环扫描,但只看K7,K7为0时退出PROC2 + + PUSH DX + PUSH CX + + MOV SI, 0 ; 时间到退出抢答标志 + + ; 开始计时,1000Hz * 4000 = 4s后输出低电平,取反后用于触发中断 + MOV DX, A8254COM + MOV AL, 10111000B + OUT DX, AL + MOV DX, A8254B + MOV AL, 10100000B + OUT DX, AL + MOV AL, 00001111B + OUT DX, AL + + ; 设置中断屏蔽 + CLI + IN AL, 21H + AND AL, 11110111B + OUT 21H, AL + STI + + LOOP3: + CMP SI, 1 + JE RETURN2 + + MOV DX, A8255C + IN AL, DX + MOV TMP1, AL + AND AL, 10000000B ; 位码 + CMP AL, 0 + JE RETURN2 + + MOV AL, TMP1 + AND AL, 01111111B + MOV TMP1, AL + CMP AL, 0 + JE LOOP3 + + ; 检测到有变化,恢复中断屏蔽,取消中断 + CLI + IN AL, 21H + OR AL, 00001000B + OUT 21H, AL + STI + + LOOP4: + MOV DX, A8255C + IN AL, DX + AND AL, 10000000B + CMP AL, 0 + JE RETURN2 + + MOV CX, 7 + MOV TMP2, 10000000B ; 位码 + LOOP5: + ROR TMP2, 1 + JMP OUTPUT2 + BACK2: + LOOP LOOP5 + JMP LOOP4 + + OUTPUT2: + CALL CLEAR + MOV AL, TMP1 + AND AL, TMP2 + CMP AL, TMP2 + JE SUCCESS2 + MOV AL, WAITING + JMP DISPLAY2 + SUCCESS2: + MOV AL, SUCCESS + DISPLAY2: + MOV DX, A8255A + OUT DX, AL + MOV DX, A8255B + MOV AL, TMP2 + OUT DX, AL + CALL DELAY + JMP BACK2 + + RETURN2: + CALL CLEAR + ; 恢复中断屏蔽 + CLI + IN AL, 21H + OR AL, 00001000B + OUT 21H, AL + STI + POP CX + POP DX + RET +PROC2 ENDP + +TIMEOUT PROC FAR + CLI + PUSH CX + PUSH BX + MOV SI, 1 + + CALL CLEAR + MOV BX, 0FH + LOOP6: + MOV CX, 8 + MOV TMP1, 00000001B ; 位码 + LOOP7: + ROR TMP1, 1 + JMP OUTPUT3 + BACK3: + LOOP LOOP7 + DEC BX + JZ RETURN3 + JMP LOOP6 + + OUTPUT3: + MOV AL, ZERO + MOV DX, A8255A + OUT DX, AL + MOV DX, A8255B + MOV AL, TMP1 + OUT DX, AL + CALL DELAY + JMP BACK3 + + RETURN3: + MOV AL, 20H ; 发送EOI指令 + OUT 20H, AL + POP BX + POP CX + STI + IRET +TIMEOUT ENDP + +CLEAR PROC NEAR + PUSH DX + PUSH AX + + MOV DX, A8255A + MOV AL, 00000000B + OUT DX, AL + MOV DX, A8255B + MOV AL, 0 + OUT DX, AL + + POP AX + POP DX + RET +CLEAR ENDP + +DELAY PROC NEAR + PUSH CX + PUSH BX + MOV CX, 0FFFFH + LOOP8: + MOV BX, 2 + LOOP9: + DEC BX + JNZ LOOP9 + DEC CX + JNZ LOOP8 + POP BX + POP CX + RET +DELAY ENDP + +END START +CODE ENDS \ No newline at end of file diff --git a/Lab/Lab_final/material/connections.png b/Lab/Lab_final/material/connections.png new file mode 100755 index 0000000..f932f28 Binary files /dev/null and b/Lab/Lab_final/material/connections.png differ diff --git a/Lab/Lab_final/material/cover.png b/Lab/Lab_final/material/cover.png new file mode 100755 index 0000000..e3e9a68 Binary files /dev/null and b/Lab/Lab_final/material/cover.png differ diff --git a/Lab/Lab_final/material/fault.png b/Lab/Lab_final/material/fault.png new file mode 100755 index 0000000..51b7dea Binary files /dev/null and b/Lab/Lab_final/material/fault.png differ diff --git a/Lab/Lab_final/material/success.png b/Lab/Lab_final/material/success.png new file mode 100755 index 0000000..e4e2b0e Binary files /dev/null and b/Lab/Lab_final/material/success.png differ diff --git a/Lab/Lab_final/material/timeout.png b/Lab/Lab_final/material/timeout.png new file mode 100755 index 0000000..f2eb2aa Binary files /dev/null and b/Lab/Lab_final/material/timeout.png differ diff --git a/Lab/Lab_final/material/接线.xlsx b/Lab/Lab_final/material/接线.xlsx new file mode 100755 index 0000000..5cb12ea Binary files /dev/null and b/Lab/Lab_final/material/接线.xlsx differ diff --git a/Lab/Lab_final/material/研究性实验_竞赛抢答器设计.md b/Lab/Lab_final/material/研究性实验_竞赛抢答器设计.md new file mode 100755 index 0000000..6d76e24 --- /dev/null +++ b/Lab/Lab_final/material/研究性实验_竞赛抢答器设计.md @@ -0,0 +1,516 @@ + + + + + + + + + + + + + + +![cover](cover.png) + + + + + + + + + + + +

研究性实验 竞赛抢答器设计

+ +### 一、实验目的 + +​ 利用可编程并行接口接口芯片$8255$、可编程定时器/计数器$8254$,扬声器,$\rm LED$八段数码管,$8$个拨动开关,设计一个七路抢答器,以模拟竞赛中的抢答器功能。 + + + +### 二、实验内容 + +​ 设计一个七路抢答器,以模拟竞赛中的抢答器功能。当主持人按开始键后,选手才可抢答,否则违规。该抢答器具有如下功能: + +1. 该抢答器有一个开始键,由拨动开关控制,由主持人使用; +2. 该抢答器可供$7$人同时抢答,由拨动开关控制,选手使用; +3. 当选手违规时,扬声器报警,数码管显示最先违规的选手; +4. 当选手抢答成功,数码管显示最先抢答到的选手号码; +5. 抢答前,所有的波动开关必须拨到下方,新一轮的抢答才可以开始。 + +> 在本实验中,我们没有参照原实验指导书使用发光二极管进行抢答成功/违规选手的号码的显示,而是直接在数码管上直接对抢答成功/违规选手的物理位置进行显示,如第四部分中实验效果图所示。 +> +> 我们认为这样更能贴合竞赛抢答的实际情景,也比在数码管上直接显示单个数字更具有挑战性。 + + + +### 三、流程图 + +graph + + + +### 四、实验过程与分析 + +#### 4.1. 接线 + +![connections](connections.png) + +
表4-1 硬件连接表
+ +4-1 + +
图4-1 硬件连接图
+ +#### 4.2. 程序设计 + +##### 4.2.1. 需求分析和程序逻辑 + +1. 判断主持人和选手的行为可以使用$8255$芯片读取逻辑电平开关状态实现 + 1. 当主持人对应的$\rm K7$为$0$时还没开始抢答,这时选手对应的$\rm K0\sim 6$中的$1$说明对应选手违规,存在违规选手时不能进入抢答程序 + 2. 当主持人对应的$\rm K7$为$1$时开始抢答,这时选手对应的$\rm K0\sim 6$中有$1$说明选手抢答成功,此时应停止其他选手的抢答 +2. 显示违规和抢答成功信息使用数码管显示,需要利用人眼延时特性循环刷新数码管显示 +3. 违规选手的告警用蜂鸣器和$8255$芯片控制。 + 1. 利用违规时数码管的位码第$7$位为$0$、抢答时数码管的位码第$7$位为$1$的程序特性,将控制位码的$8255B$口的第$7$位用单根线连接至扬声器,这样违规时扬声器鸣叫,正常抢答时扬声器不鸣叫。 + +##### 4.2.2. 新器件的控制方法 + +​ 新器件是扬声器,控制口为高电平时鸣叫,为低电平时不鸣叫。 + +##### 4.2.3. 代码实现 + +**主程序** + +​ 首先初始化所有要用到的芯片。 + +​ 然后进行无限循环,不断从$\rm 8255C$口获取逻辑电平开关状态,判断: + +1. 当$\rm K0\sim 7$全为$0$时不作任何变化,继续循环; +1. 当$\rm K7$为$0$且$\rm K0\sim 6$中存在$1$时,进入$\rm PROC1$; +1. 当$\rm K7$为$1$时,进入$\rm PROC2$。 + +**PROC1程序**(抢答开始前有选手违规) + +​ 主程序扫描到 $\rm K7$为$0$且$\rm K0\sim 6$中存在$1$时进入,扬声器鸣叫。 + +​ 进入无限循环,不断从$\rm 8255C$口读入$\rm K0\sim 7$,数码管显示违规选手。 + +​ $\rm K0\sim 6$全为$0$时,跳出循环,扬声器关闭,退出$\rm PROC1$。 + +fault + +
图4-2 判定违规选手效果图
+ +**PROC2程序**(选手成功抢答) + +​ 主程序扫描到 $\rm K7$为$1$时进入,开启$\rm 8254$芯片开始计时,取消屏蔽$\rm MIRQ3$的中断。 + +​ 进入第一个无限循环,不断从$\rm 8255C$口读入$\rm K0\sim 7$。 + +​ $\rm K0\sim 6$存在$1$后,退出循环,开启屏蔽$\rm MIRQ3$的中断。 + +​ 进入第二个无限循环,数码管显示抢答成功选手,当 $\rm K7$为$0$时退出无限循环,退出$\rm PROC2$。 + +​ 若在第一个无限循环中,$4$秒内$\rm K0\sim 6$都为$0$没有变化,$8254$芯片会用$4$方式输出低电平,经非门取反后触发$\rm MIRQ3$中断。 + +success + +
图4-3 判定抢答成功选手效果图
+ +**TIMEOUT中断服务程序**(抢答超时) + +​ $\rm PROC2$进入$4$秒后由$8254$芯片用$4$方式输出低电平,经非门取反后触发$\rm MIRQ3$进入。 + +​ 数码管显示全$0$,延时约$1$秒后退出$\rm TIMEOUT$中断服务程序。 + +timeout + +
图4-4 判定抢答超时效果图
+ + + +### 五、实验总结 + +在实验过程中我们发现了抢答器出现的问题: + +1. 数字开头命名变量导致代码编译错误; +2. 接错线,且没有与蜂鸣器联动; +3. 我们只有$\rm PROC2$中可以触发中断但是在进行$\rm PROC1$时也会触发中断 + +经讨论得到的解决方案或结论: + +1. 在变量前增加字母,使得程序顺利运行。 +2. 重新搭线,由于$\rm K7$的位码在有选手违规时以及抢答时都会亮起,利用这点将$\rm PB7$口作为蜂鸣器的输入,使得条件$1$时蜂鸣器报警。 +3. 硬件问题,实验箱短路造成中断的误触发,无法避免。 + + + +### 六、小组分工 & 心得体会 + +**皇甫昱慧** *(组长)* + +组织组员协同完成实验;编写$8255$芯片的逻辑电平开关输入和对发光二极管输出控制代码;绘制程序逻辑流程图。 + +> 在本次实验中,我学会了使用$8255$来实现抢答器的功能,同时我们设计了使用$8254$进行计时并使用$8259$进行中断。在实验过程中,一开始我写了非常冗长且不方便的代码,非常感谢我的组员给予的帮助,同时我通过画流程图对后面精简过的代码也有了更好的认识。 + +**庄子君** *(组员)* + +为实验箱接线;参与实验程序的调试;记录实验流程和现象以及在实验中遇到的问题;实验报告和实验总结的撰写。 + +> 加深了对可编程接口芯片$8254$、$8255$的理解,顺利实现$8254$、$8255$的配合使用,遇到问题组内也及时沟通并积极讨论,最后顺利解决了试验过程中出现的问题。 + +**柯劲帆** *(组员)* + +编写$8255$芯片控制数码管显示、$8254$芯片和$8259$芯片控制代码,整合程序代码;接线并调试代码;修改实验报告。 + +> 通过本次实验我学会使用$8255$芯片、$8254$芯片、$8259$芯片、数码管以及蜂鸣器进行联动,我对接口的理解更为深刻,同时汇编代码编写能力、逻辑实现能力、工程架构设计能力和$\rm DEBUG$能力都得到了非常大的提升。非常感谢老师的指导。 + + + +### 源代码附录 + +```assembly +DATA SEGMENT + A8255A EQU 280H + A8255B EQU 281H + A8255C EQU 282H + A8255COM EQU 283H + + A8254A EQU 288H + A8254B EQU 289H + A8254COM EQU 28BH + + OLD_OFF DW 0 + OLD_SEG DW 0 + + TMP1 DB 0 + TMP2 DB 0 + LED DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H + WAITING DB 40H ; 等待状态的字节码 + FAULT DB 71H ; 违规状态的字节码 + SUCCESS DB 6DH ; 抢答成功状态的字节码 + ZERO DB 3FH ; 数码管显示0的字节码 +DATA ENDS + +CODE SEGMENT + ASSUME DS:DATA, CS:CODE + + ; 1. 程序逻辑 + ;   1.1. 当K7为0时,K0-6都必须为0,否则为1的违规,数码管显示违规选手 && 扬声器鸣叫 + ;   1.2. 当K7为1时,当K0-6中有一个为1时,停止检测,为1的按键对应的选手抢答成功,数码管显示抢答成功选手 + ; 2. 程序设计 + ;   2.1. 2个PROC + ;       2.1.1. PROC1扫描到 K7为0 && K0-6中存在1的按键时进入,K0-6全为0时退出 + ;               进入PROC1后蜂鸣器响起,不断扫描K0-7,数码管显示违规选手。 + ;               当全为0时蜂鸣器关闭,退出PROC1 + ;       2.1.2. PROC2扫描到K7为1时进入,K7为0时退出 + ;               进入PROC2后循环扫描K0-7,K0-6存在1后数码管显示抢答成功选手 + ;               继续循环扫描,但只看K7,K7为0时退出 + ;               进入PROC2后进行计时,4秒后若无变化,触发中断,退出PROC + ;   2.2. 主程序 循环扫描K0-7 + ;       2.2.1. K7为0 && K0-6按键全0时不变,继续循环 + ;       2.2.2. K7为0 && K0-6中存在1的按键时进入PROC1 + ;       2.2.2. K7为1时进入PROC2 + + START: + MOV AX, DATA + MOV DS, AX + + CLI ; 关中断,防止中断干扰 + ; 保存旧的中断向量 + MOV AX, 350BH + INT 21H + MOV OLD_OFF, BX + MOV BX, ES + MOV OLD_SEG, BX + + ; 设置新的中断向量 + MOV AX, 250BH + MOV DX, SEG TIMEOUT + MOV DS, DX + MOV DX, OFFSET TIMEOUT + INT 21H + STI + + ; 恢复数据段 + MOV AX, DATA + MOV DS, AX + + ; 初始化8255 + MOV AX, 10001001B ; A口输出段码,B口输出位码,C口输入拨动开关 + MOV DX, A8255COM + OUT DX, AL + + ; 使用8254 A口将1MHz降频为1kHz,为8254 B口提供时钟源 + MOV DX, A8254COM + MOV AL, 00110110B + OUT DX, AL + MOV DX, A8254A + MOV AL, 11101000B + OUT DX, AL + MOV AL, 00000011B + OUT DX, AL + + ; 主程序 + MAIN: + MOV DX, A8255C + IN AL, DX + + MOV SI, 0 ; 中断标志位 + + ; K7为0 && K0-6按键全0时不变,继续循环 + CMP AL, 0 ; 比较AL寄存器的值与0 + JE MAIN ; 如果相等,则跳转到MAIN + + ; K7为0 && K0-6中存在1的按键时进入PROC1 + AND AL, 10000000B ; 将AL寄存器的值与10000000B进行按位与操作 + CMP AL, 0 ; 比较AL寄存器的值与0,即判断第7位是否为0 + JNE P2 ; 如果不相等,则跳转到P2 + CALL PROC1 ; 调用PROC1子程序 + + ; K7为1时进入PROC2 + P2: + CALL PROC2 ; 调用PROC2子程序 + JMP MAIN ; 无条件跳转到MAIN + + FINISH: + CLI ; 关中断,防止中断干扰 + MOV AX, 250BH ; 恢复原来的中断向量 + MOV DX, OLD_OFF + MOV DS, DX + MOV DS, OLD_SEG + INT 21H + + MOV AX, 4C00H + INT 21H + +PROC1 PROC NEAR + + ; K7为0 && K0-6中存在1的按键时进入,K0-6全为0时退出 + ; 进入PROC1后蜂鸣器响起,不断扫描K0-7,数码管显示违规选手。 + ; 当全为0时,蜂鸣器关闭,退出PROC1 + + PUSH DX + PUSH CX + + LOOP1: + MOV DX, A8255C + IN AL, DX + MOV TMP1, AL + + CMP AL, 0 + JE RETURN1 + + MOV CX, 8 + MOV TMP2, 10000000B ; 位码 + LOOP2: + ROR TMP2, 1 + JMP OUTPUT1 + BACK1: + LOOP LOOP2 + JMP LOOP1 + + ; 在数码管上输出 + OUTPUT1: + CALL CLEAR + MOV AL, TMP1 + AND AL, TMP2 + CMP AL, TMP2 + JE FAULT1 + MOV AL, WAITING + JMP DISPLAY1 + FAULT1: + MOV AL, FAULT + DISPLAY1: + MOV DX, A8255A + OUT DX, AL + MOV DX, A8255B + MOV AL, TMP2 + OUT DX, AL + CALL DELAY + JMP BACK1 + + RETURN1: + CALL CLEAR + POP CX + POP DX + RET +PROC1 ENDP + +PROC2 PROC NEAR + + ; 进入PROC2后循环扫描K0-7,K0-6存在1后数码管显示抢答成功选手 + ; 继续循环扫描,但只看K7,K7为0时退出PROC2 + + PUSH DX + PUSH CX + + MOV SI, 0 ; 时间到退出抢答标志 + + ; 开始计时,1000Hz * 4000 = 4s后输出低电平,取反后用于触发中断 + MOV DX, A8254COM + MOV AL, 10111000B + OUT DX, AL + MOV DX, A8254B + MOV AL, 10100000B + OUT DX, AL + MOV AL, 00001111B + OUT DX, AL + + ; 设置中断屏蔽 + CLI + IN AL, 21H + AND AL, 11110111B + OUT 21H, AL + STI + + LOOP3: + CMP SI, 1 + JE RETURN2 + + MOV DX, A8255C + IN AL, DX + MOV TMP1, AL + AND AL, 10000000B ; 位码 + CMP AL, 0 + JE RETURN2 + + MOV AL, TMP1 + AND AL, 01111111B + MOV TMP1, AL + CMP AL, 0 + JE LOOP3 + + ; 检测到有变化,恢复中断屏蔽,取消中断 + CLI + IN AL, 21H + OR AL, 00001000B + OUT 21H, AL + STI + + LOOP4: + MOV DX, A8255C + IN AL, DX + AND AL, 10000000B + CMP AL, 0 + JE RETURN2 + + MOV CX, 7 + MOV TMP2, 10000000B ; 位码 + LOOP5: + ROR TMP2, 1 + JMP OUTPUT2 + BACK2: + LOOP LOOP5 + JMP LOOP4 + + OUTPUT2: + CALL CLEAR + MOV AL, TMP1 + AND AL, TMP2 + CMP AL, TMP2 + JE SUCCESS2 + MOV AL, WAITING + JMP DISPLAY2 + SUCCESS2: + MOV AL, SUCCESS + DISPLAY2: + MOV DX, A8255A + OUT DX, AL + MOV DX, A8255B + MOV AL, TMP2 + OUT DX, AL + CALL DELAY + JMP BACK2 + + RETURN2: + CALL CLEAR + ; 恢复中断屏蔽 + CLI + IN AL, 21H + OR AL, 00001000B + OUT 21H, AL + STI + POP CX + POP DX + RET +PROC2 ENDP + +TIMEOUT PROC FAR + CLI + PUSH CX + PUSH BX + MOV SI, 1 + + CALL CLEAR + MOV BX, 0FH + LOOP6: + MOV CX, 8 + MOV TMP1, 00000001B ; 位码 + LOOP7: + ROR TMP1, 1 + JMP OUTPUT3 + BACK3: + LOOP LOOP7 + DEC BX + JZ RETURN3 + JMP LOOP6 + + OUTPUT3: + MOV AL, ZERO + MOV DX, A8255A + OUT DX, AL + MOV DX, A8255B + MOV AL, TMP1 + OUT DX, AL + CALL DELAY + JMP BACK3 + + RETURN3: + MOV AL, 20H ; 发送EOI指令 + OUT 20H, AL + POP BX + POP CX + STI + IRET +TIMEOUT ENDP + +CLEAR PROC NEAR + PUSH DX + PUSH AX + + MOV DX, A8255A + MOV AL, 00000000B + OUT DX, AL + MOV DX, A8255B + MOV AL, 0 + OUT DX, AL + + POP AX + POP DX + RET +CLEAR ENDP + +DELAY PROC NEAR + PUSH CX + PUSH BX + MOV CX, 0FFFFH + LOOP8: + MOV BX, 2 + LOOP9: + DEC BX + JNZ LOOP9 + DEC CX + JNZ LOOP8 + POP BX + POP CX + RET +DELAY ENDP + +END START +CODE ENDS +``` diff --git a/Lab/Lab_final/material/研究性实验_竞赛抢答器设计.pdf b/Lab/Lab_final/material/研究性实验_竞赛抢答器设计.pdf new file mode 100755 index 0000000..9a8e351 Binary files /dev/null and b/Lab/Lab_final/material/研究性实验_竞赛抢答器设计.pdf differ diff --git a/Lab/Lab_final/接口技术研究性实验指导书.docx b/Lab/Lab_final/接口技术研究性实验指导书.docx new file mode 100755 index 0000000..e7f14a6 Binary files /dev/null and b/Lab/Lab_final/接口技术研究性实验指导书.docx differ diff --git a/Lab/实验报告模板.docx b/Lab/实验报告模板.docx new file mode 100755 index 0000000..eb05397 Binary files /dev/null and b/Lab/实验报告模板.docx differ diff --git a/Lab/开发环境建立和DEBUG调试工具介绍.pdf b/Lab/开发环境建立和DEBUG调试工具介绍.pdf new file mode 100755 index 0000000..db87154 Binary files /dev/null and b/Lab/开发环境建立和DEBUG调试工具介绍.pdf differ diff --git a/M302016B《微机系统与接口技术》教学大纲.doc b/M302016B《微机系统与接口技术》教学大纲.doc new file mode 100755 index 0000000..7540580 Binary files /dev/null and b/M302016B《微机系统与接口技术》教学大纲.doc differ diff --git a/emu8086-version4.08.zip b/emu8086-version4.08.zip new file mode 100755 index 0000000..e7a68fd Binary files /dev/null and b/emu8086-version4.08.zip differ diff --git a/《微机系统与接口技术》2023教学日历.doc b/《微机系统与接口技术》2023教学日历.doc new file mode 100755 index 0000000..ffd8d02 Binary files /dev/null and b/《微机系统与接口技术》2023教学日历.doc differ