第一篇:电子科大计算机学院 语言程序设计 实验报告 99分精品版
电子科技大学 计算机科学与工程
学院
标 准 实 验 报 告
(实验)课程名称
汇编语言与微机接口技术综合实验
电子科技大学教务处制表
电 子 科 技 大 学
实
验
报
告
(一)学生姓名:郫县英格拉姆
学 号:2014123456789
指导教师:皮皮怪
实验地点:主楼A2_412
实验时间:2017年4月25日星期二
一、实验室名称:
主楼A2_412机房
二、实验项目名称:汇编语言编程训练
三、实验学时:3学时
四、实验原理:(包括知识点,电路图,流程图)
知识点
(一)课后自学——使用DOSBox在win7 x64位下搭建汇编环境 1.软件安装
a.安装3DOSBox b.准备debug.exe,masm.exe,link.exe,edit.exe文件。2.使用
a.DOSBox安装完成后,打开,可发下它的提示符是:“Z:>”,这是DOSBox里的虚拟盘。我们需要更改到我们自己的盘符,如果直接更改的话,会提示你错误。首先需要mount到自己的目录。
b.比如我们准备将D:DEBUG作为我们自己的汇编测试目录,则执行“mount C D:DEBUG”命令,这样C盘符也就虚拟成了自己本地电脑的D:DEBUG目录。我们在DOSBox中切换到C盘符时,也就实际上切换到了D:DEBUG目录。c.将debug.exe,masm.exe,link.exe,edit.com放置于D:DEBUG目录下,我们就能在DOSBox下直接使用它们了。3.配置
上面我们为使用DOSBox,要mount到我们本地目录,但是我们每一次打开DOSBox都要进行这两步,有点麻烦,可以通过下面的操作来保存配置。a.开始->所有程序->DOSBox-0.74->Options->DOSBox 0.74 Options,在文本的最后位置找到“[autoexec]”:
[autoexec] # Lines in this section will be run at startup.# You can put your MOUNT lines here.b.然后将下面的2条命令写在此处:第一条命令的作用是mount目录,第二条命令的作用是mount之后切换到D盘符:
mount C D:DEBUG C: 知识点
(二)课堂讲述——相关知识介绍
1.生成可执行程序的过程
·建立汇编源程序(*.asm)
·汇编源程序文件,生成目标文件(*.obj)、·连接目标文件,生成可执行文件(*.exe)·运行调试程序 2.汇编
假设masm.exe在D盘根目录下,编辑了一个名为demo.asm的源文件,则通过命令
D:>masm demo.asm;扩展名可以忽略,默认为asm类型 得到汇编结果,如下图所示:
·扩展名为*.lst的文件称为列表文件,该文件对于后续的调试十分有用。
关于列表文件(*.lst)
列表文件同时列出源程序和机器语言程序清单,并给出段表、段的大小及属性,以及用户定义的符号表、符号类型及属性,对于调试程序十分有用。3.连接
在生成了目标文件demo.obj以后,通过输入命令 D:>link demo.obj;LINK.EXE是连接程序,同样的,扩展名可以忽略,默认为obj类型
得到连接结果,如下图所示:
4.调试
a.关于DEBUG.EXE b.DEBUG.EXE的用法
在DOS的提示符下,如下键入:c.DEBUG.EXE的注意事项 d.本实验课需要的DEBUG指令
运行命令G、追踪命令T、继续命令P、显示内存单元内容命令D、退出命令Q
修改内存单元内容命令E、检查和修改寄存器内容的命令R
流程图
五、实验电路(本次实验无电路图)
六、实验内容:(介绍自己所选的实验内容)
实验内容一:
学习“第4章 顺序、分支、循环程序例子.ppt”,按照要求完成下列题目并给出实验结果(至少选择两个):我选择1、2
1、利用学号查学生的数学成绩表
在数据段中建立一个成绩表TABLE,表中的成绩按照学生学号从小到大的顺序存放。要查的学号存放在变量NUM中,查表的结果放在变量MATH中。(用XLAT指令进行查表)
2、无符号数排序
数据段的ARY数组中存放有10个无符号数,试找出其中最大者送入MAX单元。(用LOOP指令做循环)
实验内容二:
学习“第4 子程序设计例子(1).ppt”,用“堆栈传递参数”的方式编程并运行给出结果.将两个给定的二进制数(8位和16位)转换为ASCII码字符串。用堆栈传递参数,要求:分步骤给出堆栈状态和运行结果。
七、实验步骤:(编辑调试的过程)实验一:
题目1.利用学号查学生的数学成绩表
1、根据题目要求,建立汇编源程序,用Windows系统自带的记事本进行编辑,另存为projec1.asm,并保存至masm.exe所在目录中。
2、汇编源程序文件,生成目标文件project1.obj;
3、通过link命令连接目标文件,生成可执行文件project1.exe;
4、运行调试程序,键入debug project1.asm,参考LST文件,通过G命令、D命令进行调试,分析结果。(分析过程见报告第九部分)。题目2.无符号数排序
1、根据题目要求,建立汇编源程序,用Windows系统自带的记事本进行编辑,另存为projec2.asm,并保存至masm.exe所在目录中。
2、汇编源程序文件,生成目标文件project2.obj
3、通过link命令连接目标文件,生成可执行文件project2.exe
4、运行调试程序,参考LST文件,通过G命令、D命令进行调试,分析结果,(分析过程见报告第九部分)。
实验二:
题目:用“堆栈传递参数” 的方式编程,将两个给定的二进制数(8位和16位)转换为ASCII码字符串。
1.根据题目要求,建立汇编源程序,用Windows系统自带的记事本进行编辑,另存为projec4.asm,并保存至masm.exe所在目录中。
2.汇编源程序文件,生成目标文件project4.obj 3.通过link命令连接目标文件,生成可执行文件project4.exe 4.运行调试程序,通过G命令、D命令进行调试,分析结果(分析过程见报告第九部分)。
八、实验结果:(源程序代码,必要的中文注释,以及运行结果,包括截图或者拍照)实验一 第一题
源代码及其注释如下:
TITLE TABLE LOOKUP DATA SEGMENT;数据段
TABLE DB 01, 02, 03, 04, 05, 06, 07, 82, 09, 10
DB 11, 12, 13, 14, 15, 16, 17, 18, 19, 20;为了便于调试,把82之外的数据进行特殊处理,使其数值等于所在的位置 NUM DB 8;学号为8 MATH DB ? DATA ENDS STACK1 SEGMENT PARA STACK;堆栈段
DW 20H DUP(0)STACK1 ENDS
COSEG SEGMENT
ASSUME CS:COSEG,DS:DATA,SS:STACK1 START: MOV AX,DATA MOV DS,AX;装入DS
MOV BX,OFFSET TABLE;BX指向表首地质
XOR AH,AH;AH清零
MOV AL,NUM;NUM值赋给AL
DEC AL;因为实际学号从1开始 XLAT;查表
MOV MATH,AL;存结果
MOV AH,4CH
INT 21H COSEG ENDS
END START
运行结果介绍及截图、分析:
运行调试程序,通过G命令、D命令进行调试,分析结果。
查看PROJECT1.LST文件,可以分析出调试的方法,分析过程见图标记:
根据上述分析输入指令g 0013、d0015 l1进行调试,结果见下图:
结果分析:MATH中成绩为52h,对应十进制82,而在程序源代码中对成绩的定义情况如下,其中的学号为8对应的成绩确实为82:
符合要求,实验成功。
实验一:第二题
源代码及其注释如下:
DATA SEGMENT
ARY DB 01,16,02,03,04,05,06,07,08,09 MAX DB ? DATA ENDS
STACK1 SEGMENT PARA STACK DW 20H DUP(0)STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1 BEGIN:
MOV AX,DATA MOV DS,AX;装入DS
MOV SI,OFFSET ARY;SI指向ARY第一个元素
MOV CX,9;CX做计数器
MOV AL,[SI];取第一个元素到AL LOP: INC SI;SI指向后一个元素
CMP AL,[SI];比较两个数
JAE BIGER;前元素>=后元素,则跳到BIGER进行处理
MOV AL,[SI];取较大数到AL BIGER: LOOP LOP;循环执行LOOP
MOV MAX, AL;存最大数
MOV AH,4CH
INT 21H CODE ENDS END BEGIN
运行结果介绍及截图、分析:
运行调试程序,通过G命令、D命令进行调试,分析结果。
查看PROJECT2.LST文件,可以分析出调试的方法,分析过程见图标记:
根据上述分析输入指令g 0019、d000a l1进行调试,结果见下图:
MATH中成绩为10h,对应十进制数16,确实是我编写的十个数中的最大数:
符合要求,实验成功。
实验二:堆栈传递参数,转化ASCII码
代码及注释如下:
DATA SEGMENT BIN1 DB 35H BIN2 DW 0AB48H ASCBUF DB 20H DUP(?)DATA ENDS
STACK1 SEGMENT PARA STACK DW 20H DUP(65535);对应OFFFFH 便于查看内存单元时确定堆栈位置 STACK1 ENDS
COSEG SEGMENT
ASSUME CS:COSEG,DS:DATA,SS:STACK1
BEGIN: MOV AX,DATA MOV DS,AX
XOR AX,AX;清零AX
MOV AH,BIN1;第一个数据送AH
PUSH AX;待转换数据压栈
MOV AX,8
PUSH AX;待转换位数压栈
LEA DI,ASCBUF PUSH DI;存放ASCII码首址压栈
CALL BINASC;调用转换子程序
MOV AX,BIN2;第二个数据送AX
PUSH AX;待转换数据压栈
MOV AX,10H
PUSH AX;待转换位数压栈
ADD DI,8
PUSH DI;DI+8压栈
CALL BINASC;调用转换子程序
MOV AH,4CH INT 21H BINASC PROC
PUSH AX
PUSH CX
PUSH DX
PUSH DI
MOV BP,SP
MOV DI,[BP+10];从堆栈取入口参数
MOV CX,[BP+12]
MOV DX,[BP+14]
LOP: ROL DX,1;LOP为将所给转化为ASCII的算法
MOV AL,DL
AND AL,1ADD AL,30H MOV [DI],AL
INC DI
LOOP LOP POP DI
POP DX
POP CX
POP AX
RET 6;返回并从堆栈中弹出6个字节 BINASC ENDP COSEG ENDS END BEGIN
分析:
首先单步运行几条指令,通过d 00 查看内存单元状态,检测堆栈段等的设置是否成功:
空间看起来有问题:上面显示00的部分是设置的ASCBUF应该有用32个字节,截图显示是45个;下面的STACK1应该有64个字节,截图显示是54个,但后面全部执行完毕后结果是正确的。在网络上查询过后得知应该是软件的原因。
继续执行至将第一个待转换数据0035H压栈,查看内存单元,截图如下:
同样的,执行至待转换位数、存放ASCII码首址成功入栈,与上图相似,省去截图,直至调用转化子程序,执行完一系列入栈操作和取入口参数、数据位数、待转换数据操作:
进入标号为LOP的程序段,循环执行求ASCII码的算法,将数据一位一位地转化为ASCII码,循环过程中可以看到CX依次减1,减小至0时不再执行LOP循环:
继续执行至第一个数据转化结束,查看内存单元情况,与预期结果进行比较,第一个待转换数据35H=0011 0101B,其对应ASCII码确实与内存单元中显示相同,详见图片:
第二个待转换数据分析过程与第一个数据相同,转化结束后同样与预期结果进行比较:
第二个待转换数据AB48H=1010 1011 0100 1000B, 其对应ASCII码确实与内存单元中显示相同,详见图片:
九、结果分析和改进意见(完成每次留的问答题,以及实验过程中遇到的问题)
汇编语言编程作为低级语言,与高级语言相比,可读性不如高级语言,更易出错,调试更麻烦,但是逻辑性很强,更接近机器,分析起来很有意思,每一步都是很小的操作,最后能达到目的。
在堆栈传递参数的实验中,内存中显示00的部分是设置的ASCBUF,应该有用32个字节,截图显示是45个;下面的STACK1应该有64个字节,截图显示是54个,但后面全部执行完毕后结果是正确的。在网络上查询过后发现有很多相似的情况,应该是软件的原因。后期可以研究一下产生这种现象的具体原因和解决方案。
十、心得体会:
做实验很有趣,写报告很烦。在大三下学期,保研考研找实习最忙的时候,要写这么多报告,很难受。但是万幸王老师很漂亮,讲话又好听,我超喜欢她的。如果她直接教汇编理论课我一定好好听~~~
报告评分:
指导教师签字:
电 子 科 技 大 学
实
验
报
告
(二)学生姓名:郫县英格拉姆
学 号:2014123456789
指导教师:皮皮怪
实验地点:主楼A2_412
实验时间:2017年5月9日星期二
一、实验室名称:
主楼A2_411机房
二、实验项目名称:8259A中断控制器实验
三、实验学时:3学时
四、实验原理:(包括知识点,流程图)
(一)知识点:
(老师上课提的问题写在报告第九部分)
1.8259A的工作过程
(1)中断源在中断请求输入端IR0-IR7上产生中断请求 涉及问题:中断请求的触发方式有哪些?
·电平触发方式:用IR引脚上的有效高电平信号触发中断。常被用于需要重复执行当前中断服务程序的情况,直到IR信号变为无效。
·边沿触发方式:采用IR输入信号的上升沿触发中断,常被用于不希望产生重复响应及中断请求信号是一个短暂脉冲的情况。
(2)中断请求被锁存在IRR中,并经IMR屏蔽,结果送优先权电路判优 涉及问题:IRR/IMR的数据是自动写入还是通过软件编程设定?
·IRR的数据是根据中断请求信号自动写入的(有中断请求的对应位为1,允许多个位为1,如果被响应对应位清零);
·IMR的数据是通过软件编程设定的(通过对某位或某几位置1屏蔽该位,使其不能进入优先级判别器)
(3)优先权电路检出优先权最高的中断请求位,设置ISR的对应位(置1)涉及问题:中断判优的依据是什么?ISR是自动写入还是通过软件编程设定?
·IRR的数据是根据中断请求信号自动写入的(有中断请求的对应位为1,允许多个位为1,如果被响应对应位清零);
·IMR的数据是通过软件编程设定的(通过对某位或某几位置1屏蔽该位,使其不能进入优先级判别器)
(4)8259A控制逻辑接受中断请求,向CPU输出INT信号
(5)CPU接受INT信号,进入两个INTA中断响应周期,第一个周期通知8259A做好响应准备,第二个周期8259A将响应的中断类型号输出到DB上 涉及问题:CPU中断响应过程中的“配套操作”有哪些?
·8259A接到来自CPU的第一个脉冲时,设置ISR并把IRR中的相应位复位。同时,8259A准备向数据总线发送中断向量。
·在8259A发送中断向量的最后一个脉冲期间,如果是在自动结束中断方式下,在这个脉冲结束时复位ISR的相应位。在其他方式下,ISR相应位要由中断服务程序结束时发出的EOI命令来复位。
(6)CPU读取该中断类型号,转移到相应的中断处理程序 涉及问题:如何通过中断类型号找到中断处理程序? 2.8259A的命令字
(1)ICW1/OCW2/OCW3复用同一个地址(A0=0);剩下的命令字复用另一个地址(A0=1),在本系统中,复用地址分别是0FFE0H和0FFE1H,预置数类别顺序为先初始化命令字,再操作命令字,预置数设定顺序为下标顺序(见“第六章输入输出与中断-2-8259” P32)
(2)0FFE0H用于ICW1,OCW2和OCW3,0FFE1H用于ICW2,ICW3,ICW4和OCW1。本次实验中,ICW3、OCW3不需要进行设定。
(3)本实验只需要用一片8259A进行中断控制,中断源采用单脉冲信号,中断触发方式属于边沿触发,且8086/8088系统必须设定ICW4,因此ICW1=00010011B=13H(4)本系统中,设定使用中断类型8来服务IR7边沿触发产生的中断,所以ICW2=00001000B=08H(5)对于单片8259A,不需要设定ICW3,而8086/8088系统需要确定ICW4。因此跳过ICW3的设定直接设定ICW4。在该实验中,我们使用全嵌套方式(最常用的也是默认的工作方式,只开放比当前中断优先级高的中断,且中断优先权的级别固定,按照IR0-IR7逐级次之。)和普通EOI方式(一般的中断结束方式,在中断程序返回前,输出中断结束命令把ISR当前优先级最高的对应位清零)操作,因此ICW4=00001001B=09H(6)对于OCW,假设使用OCW1来屏蔽除IR7外其它所有中断,这样OCW1=01111111B=7FH;选用普通EOI,则OCW2=00100000=20H 3.有关中断向量存储地址的形成说明
(1)ICW2是设置中断类型码的初始化命令字。其中,D7~D3是8086/8088系统中8259A的中断指针地址的高5位,D2~D0的值恒为0。
(2)本系统的中断序号和中断地址对应表如下:
4.有关ICW4的设置说明
ICW4的位定义如下:
·其中,D7-D5位总是为0 ·在IBM PC/XT系统中,BUF位设定为1,M/S设定为0 ·普通中断结束方式用于完全嵌套情况下,8259每得到一次EOI命令,将把ISR中已经置位的各位中优先级最高的位复位,以此类推。·因此,在本例中,ICW4=00001001B=09H 5.有关OCW2的设置说明
OCW2用于控制中断结束,其格式如下:
·其中,R为优先权控制位,R=1为循环优先权,R=0为固定优先权 ·SL位决定了OCW2中L2,L1,L0是否有效,SL=1则有效,否则无效 ·EOI为中断结束命令位,在非自动中断结束命令下,EOI=1使得中断服务寄存器ISR中具有最高优先权的IS复位,EOI=0则该位无效。·在本实验中,OCW2=0010000=20H 6.七段数码管显示相关知识
数码管字形口地址:0FFDCH,字形代码如下表所示:
上述不同的代码实际上就是使得每只数码管中八只发光二极管的不同“点亮”组合,从而形成所谓不同的“字形”。
数码管字位口地址:0FFDDH,字位代码如下表所示:
上述不同的代码实际上就是“选通”某一片数码管工作的片选信号,显然,对应选通信号高电平有效。
字位1对应逻辑箱最左边那只数码管,字位6对应最右边那只数码管。7.七段数码管显示电路图(ppt)8.Dais微机接口实验箱操作说明(ppt)9.Windows平台操作方法(ppt)10.LED平台操作方法说明(ppt)
(二)流程图:(用visio画的)
五、实验电路:
1、实验参考电路及接线说明(8259部分)(红色连线为补充连线)
·SP插孔和8259A的IR7插孔相连,同时将SP插孔和8259A的IR6插孔也连接起来,提供两个中断源
·连接138译码输入端A.B.C,其中A连A2,B连A3,C连A4,138使能控制输入端G与位于地址线A0引出孔所在位置下方的使能控制输出端G作对应连接。8259的CS端连138译码器的Y0孔。
·将8259的单元总线接口D0-D7,用8芯排线或8芯扁平线与数据总线单元D0-D7任一接口相连。
2、电路图拍照:
六、实验内容:(介绍自己所选的实验内容)
编制程序,利用8259芯片的IRi作为中断源,产生多级中断,系统显示中断号,比如:IR7作为中断源则显示7。
七、实验步骤:
1.点击桌面上“Intel8088 微机实验系统”图标; 2.选择通信串口和速率;
3.检查有无错误对话框,是否正确连接仪器; 4.进入dais集成开发环境; 5.选择本次实验对应的实验指导;
6.调出连线指导,按照实验原理电路图,在实验箱上进行连线;
7.调出参考代码,进行修改,编写本次实验的源程序,源代码及注释按ppt要求,放在实验结果部分;
8.将源程序编译、连接、装载入仪器,若出错则进行修改,直到装载成功; 9.将LED平台复位,然后点击绿色按钮运行;
八、实验结果:(源程序代码,必要的中文注释,以及运行结果,包括截图或者拍照)
(一)源程序代码及中文注释:
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE ORG 3400H H8: JMP P8259 ZXK EQU 0FFDCH;数字管字形码端口地址
ZWK EQU 0FFDDH;数字管字位码端口地址
LED DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;LED
DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0DEH,0F3H
BUF DB ?,?,?,?,?,?;预留6个字节空间存放的是需要显示的字符,如123456 PORT0 EQU 0FFE0H;偶地址 PORT1 EQU 0FFE1H;奇地址 P8259: CLI;关中断
CALL WP;初始化显示“P.”
MOV AX,OFFSET INT8359 MOV BX,0038H;6号中断向量表
MOV [BX],AX MOV BX,003AH
MOV AX,0000H
MOV [BX],AX
MOV AX,OFFSET INT8259 MOV BX,003CH;7号中断向量表
MOV [BX],AX
MOV BX,003EH
MOV AX,0000H
MOV [BX],AX
CALL FOR8259;命令字的设置
MOV SI,0000H
STI;开中断
CALL WP CON8: CALL DIS JMP CON8;-----INT8259:CLI;初始化8259 IR7
MOV BX,OFFSET BUF MOV BYTE PTR [BX+SI],07H
;INC SI
CMP SI,0007H
JZ X59 XX59: MOV AL,20H;OCW2 MOV DX,PORT0 OUT DX,AL
MOV CX,0050H XXX59: PUSH CX
CALL DIS POP CX
LOOP XXX59 POP CX
MOV CX,3438H
PUSH CX
STI
IRET
X59: MOV SI,0000H
CALL WP JMP XX59;-----INT8359:CLI;初始化8259 IR6
MOV BX,OFFSET BUF MOV BYTE PTR [BX+SI],06H
;INC SI
CMP SI,0007H
JZ Y59 YY59: MOV AL,20H;OCW2=0010000=20H 一般EOI命令,全嵌套方式
MOV DX,PORT0 OUT DX,AL
MOV CX,0050H YYY59: PUSH CX CALL DIS POP CX
LOOP YYY59 POP CX
MOV CX,3438H
PUSH CX
STI
IRET
Y59: MOV SI,0000H
CALL WP JMP YY59;==============================
FOR8259:MOV AL,13H;ICW1=00010011B=13H 单脉冲 边沿触发
MOV DX,PORT0 OUT DX,AL
MOV AL,08H;ICW2=00001000B=08H 中断类型8
MOV DX,PORT1 OUT DX,AL
MOV AL,09H;ICW4=400001001B=09H 全嵌套方式,普通EOI方式
OUT DX,AL
MOV AL,00H;OCW1=00000000B=00H 不屏蔽中断
OUT DX,AL
RET
;---------------------------
WP: MOV BUF,11H;初始化显示“P.”
MOV BUF+1,10H
MOV BUF+2,10H
MOV BUF+3,10H
MOV BUF+4,10H
MOV BUF+5,10H
RET
;-
DIS: MOV CL,20H;字位码指向左侧第一个数码管
MOV BX,OFFSET BUF DIS1: MOV AL,[BX];取第一个需要显示的字符
PUSH BX
MOV BX,OFFSET LED;BX指向字形码表的表头地址
XLAT;查表得到需要显示的字符对应的字形码,并装入AL
POP BX
MOV DX,ZXK OUT DX,AL;将要显示的字形码输出到字形码端口
MOV AL,CL
MOV DX,ZWK OUT DX,AL;将要显示的字位码输出到字位码端口
PUSH CX
MOV CX,0100H DELAY: LOOP $;延时程序
POP CX
CMP CL,01H;检测是否显示到最右侧的数码管
JZ EXIT;如果是,退出
INC BX
SHR CL,1
JMP DIS1;否则继续显示下一个 EXIT: MOV AL,00H
MOV DX,ZWK OUT DX,AL;一个都不显示
RET;返回主程序;--------------------------CODE ENDS
END H8
(二)运行结果及分析
1、运行结果介绍: 不按弹片时,初始化显示“P.”;
短按弹片时,显示“6”;
长按弹片时,先显示“6”,再显示“7”。
2、照片:将关键部分合并到一张图片,便于观察,如下图:
3、结果分析:
不按弹片时,初始化显示“P.”;
短按弹片时,有IR6和IR7两个中断源,由于OCW2设置为固定优先级,IR0优先级最高,依次递减,IR6优先被处理,因此显示“6”,由于短按,处理完IR6之后IR7中断信号源已经消失;
长按弹片时,有IR6和IR7两个中断源,IR6优先被处理,因此显示“6”,后处理IR7,因此之后显示变为“7”。
九、结果分析和改进意见(完成每次留的问答题,以及实验过程中遇到的问题)
(一)上课留的问答题
1、pc机有几块8259,端口地址是多少
(1)早期的微型计算机使用单片的8259A,如早期IBM PC/XT只有一个8259A,端口地址分别是20H、21H。(2)后期,设计师们意识到这是不够的,到了IBM PC/AT,有2个8259A,一个称作Master,另一个称作Slave,Slave以基连的方式连接在Master上,如今大多数PC都有两个8259A。课件相关知识:
2、ret和iret的区别
(1)ret是过程调用的返回指令,一般位于子程序的最后,如果是段内返回,则从堆栈中弹出一个字送IP,如果是段间返回,则从堆栈中弹出两个字送IP和CS,不需要恢复标志寄存器;
(2)iret是中断返回指令,是中断服务程序的最后一条指令,负责恢复断点并恢复标志寄存器的内容。
3、中断和过程调用的区别
(1)中断是随机事件或异常事件引起,调用则是事先已在程序中安排好 ;
(2)响应中断请求不仅要保护断点地址,还要保护FLAGS标志寄存器的内容;
(3)调用指令在指令中直接给出子程序入口地址,而中断指令只给出中断向量码,入口地址则在向量码指向的内存单元中。
4、短按和长按的区别
(1)短按,则中断时间短,处理完IR6中断后,IR7的中断信号源已经不存在了;
(2)长按,则中断时间长,处理完IR6中断后,IR7源仍然存在,继续处理IR7中断。
(二)实验过程中遇到的问题
一定要正确运用开关中断的指令,为了避免其他中断服务影响当前中断服务程序的运行,可以在当前程序开始运行的时候加上CLI指令。在当前程序运行结束的时候,为了不影响其他中断服务程序的正常请求和响应,应该加上STI指令开放中断。做实验很有趣,写报告很烦。
在大三下学期,保研考研找实习最忙的时候,要写这么多报告,很难受。但是万幸王老师很漂亮,讲话又好听,我超喜欢她的。如果她直接教汇编理论课我一定好好听~~~ 可以把中断源增加至3个、4个等,让数码管的显示变化更复杂有趣。
十一、心得体会:
做实验很有趣,写报告很烦。
在大三下学期,保研考研找实习最忙的时候,要写这么多报告,很难受。但是万幸王老师很漂亮,讲话又好听,我超喜欢她的。如果她直接教汇编理论课我一定好好听~~~
报告评分:
指导教师签字:
电 子 科 技 大 学
实
验
报
告
(三)学生姓名:郫县英格拉姆
学 号:2014123456789
指导教师:皮皮怪
实验地点:主楼A2_412
实验时间:2017年5月16日星期二
一、实验室名称:
主楼A2_411机房
二、实验项目名称:8253时钟中断计时实验
三、实验学时:3学时
四、实验原理:(包括知识点,流程图)
(一)知识点:
(老师上课提的问题写在报告第九部分)
(一)有关8253芯片
8253基本工作方式就是对CLK时钟脉冲进行计数。CLK脉冲可以是均匀的、连续的、周期精确的,也可以是不均匀的、断续的、周期不定的。
无论8253工作于何种方式,当计数器减1到0时,在OUT引脚上必定有电平或脉冲输出,OUT引脚输出的信号可以是方波、电平或脉冲等,由工作方式决定。
8253每个计数器都可以选择6种工作方式之一进行工作。在控制字中进行设定。
二进制方式计数的最小值是0001H,最大值为0000H,即216=65536 二-十进制(BCD码)计数的最小值是0001H,最大值为0000H,即10^4=10000
(二)计数器和定时器的异同点
相同之处:都需要设定计数初值,在每个输入脉冲的作用下进行减1计数,减到0后产生一个OUT输出。
不同之处: 1.定时器方式下减到0后会自动恢复初始值进行下一轮减1计数;计数器方式下减到0后必须有新的外界因素的重触发才开始新一轮减1计数。
2.定时器方式下的输入时钟CLK必须是等周期的;计数器方式下的输入时钟CLK不一定是等周期的。
(三)关于选择分频信号源的说明
【目标】产生一个1s周期的方波信号(方式3)和1s延时的信号(方式0)1s周期对应的频率是1HZ,当计数初值=信号频率时得到1s周期的信号输出 T0-T7中,最小的非小数频率(HZ为单位)计数初值为76.8K 【结论】任意一个通道的计数器最大值<76.8K,无法一次设定好需要的初值 解决方案(该系统CPU8088/8086采用主频为14.3818MHz)1.用多个定时/计数通道进行分频
2.对单个定时/计数通道进行设置,设定一定倍数的周期信号引发显示刷新(不是引发显示中断)
(二)流程图:(用visio画的)
五、实验电路:
1、实验参考电路及接线说明(红色连线为补充连线)
·8253的GATE接+5V(方式3)或者开关(方式0)。
·8253的CLK插孔接分频器74LS393的T0-T7插孔(建议选择76.8KHZ)·8253的OUT输出端与8259的IR7输入端相连。
·连接138译码输入端A.B.C,其中A连A2,B连A3,C连A4,138使能控制输入端G与位于地址线A0引出孔所在位置下方的使能控制输出端G作对应连接,该端的寻址范围为0FFE0H~0FFFFH。8253、8259的CS孔与138译码器的Y0孔相连。
·将8259、8253的单元总线接口D0~D7用8芯排线或8芯扁平线与数据总线单元D0~D7任一接口相连(要接两根数据线)。
2、电路图拍照:
六、实验内容:(介绍自己所选的实验内容)利用8253的多个通道产生周期方波信号(方式3),该信号作为8259芯片的中断源,用边沿触发方式产生中断(单级中断),从而在七段数码管上构成一个“秒表”(显示范围为0-9或者00-59)。要求正确设置参数和采用适当的编程技巧,使得七段数码管的显示间隔为1s。
七、实验步骤:
1.点击桌面上“Intel8088 微机实验系统”图标; 2.选择通信串口和速率;
3.检查有无错误对话框,是否正确连接仪器; 4.进入dais集成开发环境; 5.选择本次实验对应的实验指导;
6.调出连线指导,按照实验原理电路图,在实验箱上进行连线;
7.调出参考代码,进行修改,编写本次实验的源程序,源代码及注释按ppt要求,放在实验结果部分;
8.将源程序编译、连接、装载入仪器,若出错则进行修改,直到装载成功; 9.将LED平台复位,然后点击绿色按钮运行;
八、实验结果:(源程序代码,必要的中文注释,以及运行结果,包括截图或者拍照)
(一)源程序代码及中文注释:
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE ORG 3400H H8: JMP P8259 ZXK EQU 0FFDCH;数字管字形码端口地址
ZWK EQU 0FFDDH;数字管字位码端口地址
LED DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;LED
DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0DEH,0F3H
BUF DB ?,?,?,?,?,?;预留6个字节空间存放的是需要显示的字符,如123456 IR_COUNT DB 0 SC_0 EQU BUF+5
PORT0 EQU 0FFE0H;8253计数器0 & 8259偶地址 PORT1 EQU 0FFE1H;8253计数器1 & 8259奇地址 PORT2 EQU 0FFE2H;8253计数器2 PC EQU 0FFE3H;8253控制寄存器地址 P8259: CLI
CALL WP;初始化显示“P.”
MOV AX,OFFSET IR7_BEGIN;取IR7中断服务程序偏移地址
MOV BX,003CH
MOV [BX],AX;写中断向量表IP
MOV BX,003EH
MOV AX,0000H
MOV [BX],AX;写中断向量表CS
CALL FOR8253;8253初始化
CALL FOR8259;8259初始化
MOV SI,0000H
STI CON8: CALL DIS JMP CON8;-----IR7_BEGIN:
CLI
INC BYTE PTR[IR_COUNT]
CMP BYTE PTR[IR_COUNT],4JB IR7_E MOV BYTE PTR[IR_COUNT],0
CALL INCS0 IR7_E:
MOV AL,20H;OCW2,EOI命令
MOV DX,PORT0 OUT DX,AL
MOV BX, OFFSET BUF POP CX
MOV CX,OFFSET CON8;也显示当前BUF中的数据
PUSH CX
STI
IRET INCS0:
INC BYTE PTR[SC_0]
CMP BYTE PTR[SC_0],10
JB INCS0_CARRY MOV BYTE PTR [SC_0], 0 INCS0_CARRY:
RET
;==============================
FOR8259:MOV AL,13H;ICW1单级中断,需要ICW4,不需要ICW
3MOV DX,PORT0 OUT DX,AL
MOV AL,08H;ICW2 MOV DX,PORT1 OUT DX,AL
MOV AL,09H;ICW4,特殊全嵌套,缓冲方式,8086
OUT DX,AL
MOV AL,7FH;OCW1,中断屏蔽操作字,屏蔽除IR7之外的所有中断
OUT DX,AL
RET
;============================== FOR8253:MOV DX,PC MOV AL,36H;00110110 计数器0,先低后高,方式3,二进制
OUT DX,AL
MOV DX,PORT0 MOV AL,00H;低8位
OUT DX,AL
MOV AL,4BH;高8位
OUT DX,AL
;---------------------------
WP: MOV BUF,11H;初始化显示“P.”
MOV BUF+1,10H MOV BUF+2,10H
MOV BUF+3,10H
MOV BUF+4,10H
MOV BUF+5,10H
RET
;-DIS: MOV CL,20H
MOV BX,OFFSET BUF DIS1: MOV AL,[BX];取第一个需要显示的字符
PUSH BX
MOV BX,OFFSET LED;BX指向字形码表的表头地址
XLAT;查表得到需要显示的字符对应的字形码,并装入AL
POP BX
MOV DX,ZXK OUT DX,AL;将要显示的字形码输出到字形码端口
MOV AL,CL
MOV DX,ZWK OUT DX,AL;将要显示的字位码输出到字位码端口
PUSH CX
MOV CX,0100H DELAY: LOOP $;延时程序
POP CX
CMP CL,01H;检测是否显示到最右侧的数码管
JZ EXIT;如果是,退出 INC BX
SHR CL,1
JMP DIS1;否则继续显示下一个 EXIT: MOV AL,00H
MOV DX,ZWK OUT DX,AL;一个都不显示
RET;返回主程序
;--------------------------CODE ENDS END H8
(二)运行结果
1、运行结果介绍:
运行程序,数码管左侧显示“P.”不变,右侧按照1s的时间间隔变化,依次显示数字“0”~“9”,实现秒表,很好的完成了实验要求。
2、照片:将关键部分合并到一张图片,便于观察,如下图:
九、结果分析和改进意见(完成每次留的问答题,以及实验过程中遇到的问题)
(一)上课留的问答题
1、在实验中,先初始化8253还是8259?为什么?
先初始化8253。因为8253和8259存在地址复用,8259的初始化程序中存在指令会干扰8253的初始化。2.PC机上有无8253,地址分配如何?
有8253。PC/XT微机系统中使用一片8253,T0、T1、T2、控制口地址依次是:40H、41H、42H、43H。三个定时/计数器各自的用途是:
定时/计数器T0:用于日历时钟计时; 定时/计数器T1:用于DRAM内存定时刷新; 定时/计数器T2:用于扬声器发声。
十一、心得体会:
做实验很有趣,写报告很烦。
在大三下学期,保研考研找实习最忙的时候,要写这么多报告,很难受。但是万幸王老师很漂亮,讲话又好听,我超喜欢她的。如果她直接教汇编理论课我一定好好听~~~
报告评分:
指导教师签字:
电 子 科 技 大 学
实
验
报
告
(四)学生姓名:郫县英格拉姆
学 号:2014123456789
指导教师:皮皮怪
实验地点:主楼A2_412
实验时间:2017年5月23日 周二
一、实验室名称:
主楼A2_411机房
二、实验项目名称:8255A并行可编程接口芯片实验
三、实验学时:3学时
四、实验原理:(包括知识点,流程图)
(一)知识点:
(老师上课提的问题写在报告第九部分)
1.有关8255的工作方式
方式0——基本输入/输出方式,不用联络信号,不用中断。A组和B组都可以作为输入/输出,而且输出是锁存的。
方式1——选通输入输出方式,与方式0相比,它的主要特点是当A口、B口工作于方式1时,C口的某些I/O线被定义为A口和B口在方式1下工作时所需的联络信号线,这些线已经定义,不能由用户改变。A口工作于方式1输出时,用PC3,PC6和PC7作联络线。C口剩余的两个I/O线PC4和PC5工作于方式0。该方式下输入输出均带锁存器。
2、实验题目2注意事项
【分析】PA口驱动LED,因此作为输出,工作在方式1,需要正确连接和设置PC3/PC6/PC7三个联络信号,如下图所示:
由于8255采用中断方式传送数据,故INTEA=1(PC6=1),需要通过C口置位/复位控制字来设定;INTRA由PC3连接8259A的IR,引发中断;PC7未用。3、8255A的方式选择控制字格式 4、8255A通道C置位/复位控制字格式
(二)流程图:(用visio画的)
五、实验电路:
1、实验参考电路及接线说明(红色连线为补充连线)
·用PC6连接单脉冲发生器模拟外设应答信号,PC3连接8259的IR端(单级中断)
2、电路图拍照:
六、实验内容:(介绍自己所选的实验内容)设置8255的A组工作在方式1,用中断的方式驱动PA口8只发光二极管,用PC6连接单脉冲发生器模拟外设应答信号,PC3连接8259的IR端(单级中断),每按一次单脉冲就点亮一个LED(从左往右或者从右往左依次点亮)。
七、实验步骤:
1.点击桌面上“Intel8088 微机实验系统”图标; 2.选择通信串口和速率;
3.检查有无错误对话框,是否正确连接仪器; 4.进入dais集成开发环境; 5.选择本次实验对应的实验指导;
6.调出连线指导,按照实验原理电路图,在实验箱上进行连线;
7.调出参考代码,进行修改,编写本次实验的源程序,源代码及注释按ppt要求,放在实验结果部分;
8.将源程序编译、连接、装载入仪器,若出错则进行修改,直到装载成功; 9.将LED平台复位,然后点击绿色按钮运行;
八、实验结果:(源程序代码,必要的中文注释,以及运行结果,包括截图或者拍照)
(一)源程序代码及中文注释:
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE ORG 3400H H8: JMP P8259 PORT0 EQU 0FFE0H;偶地址 PORT1 EQU 0FFE1H;奇地址 PA EQU 0FFD8H;A口 PB EQU 0FFD9H;B口 PC EQU 0FFDAH;C口 PCTL EQU 0FFDBH;控制口 P8259: CLI
MOV AX,OFFSET INT8259;7号中断向量表
MOV BX,003CH
MOV [BX],AX
MOV BX,003EH
MOV AX,0000H
MOV [BX],AX CALL FOR8259;设置命令字
MOV SI,0000H STARTP1: MOV DX,PCTL MOV AL,0A8H;SET 1010 1000
OUT DX,AL
MOV AL,0DH;SET 0000 110
1OUT DX,AL
MOV BX,0H
STI CON8: CALL DIS JMP CON8;-----INT8259:CLI
SHL BX,1;
INC BX;
MOV AL,20H
MOV DX,PORT0 OUT DX,AL;OCW2,EOI命令
STI
IRET
;-----FOR8259:MOV AL,13H;ICW1
MOV DX,PORT0 OUT DX,AL
MOV AL,08H;ICW
2MOV DX,PORT1 OUT DX,AL
MOV AL,09H;ICW4,特殊全嵌套,缓冲方式,8086
OUT DX,AL
MOV AL,00H;OCW1 不屏蔽
OUT DX,AL
RET
;-DIS:
MOV AX, 0FFFFH
XOR AX, 0FFFFH MOV DX, PA;A口
OUT DX, AL
JMP DIS;--------------------------CODE ENDS
END H8
(二)运行结果及拍照
1、运行结果介绍:
开始运行后,发光二极管不会亮,每按一次弹片,产生一个单脉冲,就点亮一只发光二极管,从左向右依次点亮。
2、照片:将关键部分合并到一张图片,便于观察,如下图:
九、结果分析和改进意见(完成每次留的问答题,以及实验过程中遇到的问题)
(一)上课留的问答题
1、PC上有几片8255,是如何与扬声器和打印机连接的? 有一片8255。
与打印机连接情况如下:
8255A工作在方式1,作为打印机的接口,其电路连接如图所示,采用中断方式传送数据。地址为0C0H、0C2H、0C4H、0C6H。
与扬声器连接情况如下: PB0输出扬声器发声控制信号到8253的GATE2端,PB0=1,允许8253计数器2产生音调信号;
PB1输出扬声器发声信号。PB1=1允许8253输出的音调信号加到扬声器驱动电路。
(二)实验过程中遇到的问题
一开始怎么调试是卡死状态,很绝望,后来发现居然是电脑前的板子连接的是其他的电脑。
十一、心得体会:
做实验很有趣,写报告很烦。
在大三下学期,保研考研找实习最忙的时候,要写这么多报告,很难受。但是万幸王老师很漂亮,讲话又好听,我超喜欢她的。如果她直接教汇编理论课我一定好好听~~~
报告评分:
指导教师签字:
电 子 科 技 大 学
实
验
报
告
(五)学生姓名:郫县英格拉姆
学 号:2014123456789
指导教师:皮皮怪
实验地点:主楼A2_412
实验时间:2017年6月7日 周三
一、实验室名称:
主楼A2_411机房
二、实验项目名称:交通灯综合实验
三、实验学时:3学时
四、实验原理:(包括知识点,流程图)
(一)知识点:
(老师上课提的问题写在报告第九部分)
(一)实验涉及的子程序
1.显示子程序 2.控制子程序
3.黄灯闪烁5次子程序
(二)中断服务程序的功能
调用显示子程序并更新显示缓冲区数据(实现倒数计数,时间间隔1s)
(三)主程序功能
1.初始化8255,8253,8259,显示缓冲区以及写中断向量
2.往8255的端口送数,驱动发光二极管模拟十字路口交通灯工作状态 3.调用控制子程序以及黄灯闪烁5次子程序 4.循环操作第2、3步
(四)编程提示 8255部分
1.该实验中,8255选择工作方式0; 2.由于十字路口的交通灯在东西方向或南北方向的6只发光二极管的工作状态完全一致,因此,12只灯可分为两组,用PA或PB一个端口即可进行模拟; 3.用PC口一个位连接8253的GATE,作为中断显示数据的控制开关; 4.该实验只需要正确设置方式选择控制字寄存器;
5.黄灯闪烁的处理,实际上就是往对应的黄灯位置0后再置1,循环5次; 8253部分
1.该实验中,8253选择工作方式3,产生周期性的方波信号;
2.正确选择CLK信号源,正确计算初始值,使得方波信号周期为1s或者接近1s;
3.由于GATE信号为高电平时才会产生方波信号,因此用PC口某位连接GATE,通过不同的输出进行8253工作方式3的开关信号; 8259部分
1.只需要编写单级中断,中断服务程序主要完成倒计时的功能; 2.正确设置命令字寄存器和正确填写中断向量; 3.中断信号源为8253输出的方波信号
(二)流程图:(老师ppt自带流程图)
五、实验电路:
1、实验参考电路及接线说明(红色连线为补充连线)
·138译码器的Y0对应的地址范围为0FFE0H--0FFE3H,覆盖了8253和8259的寄存器地址,因此,8253和8259的CS端均连Y0。
·138译码输入端ABC分别连A2、A3、A4,使能控制输入端G与位于地址线A0引出孔所在位置下方的使能控制输出端G作对应连接。
·将8253和8259的单元总线接口D0--D7,与数据总线单元D0--D7任一接口相连。
·将8255的PA或PB口连接12只发光二极管(只用端口的6位)·将8255的PC口某位连接8253的某GATE ·将8253的某OUT连接8259的某IR ·将8253的某CLK连接393分频器某输出(T0--T7中任意一个,自选)
2、电路图拍照:
六、实验内容:(介绍自己所选的实验内容)
用8255A驱动12只发光二极管,模拟十字路口交通灯工作状态。用8253的方式3产生连续的方波信号,利用该信号的上升沿触发中断,作为8259的中断请求信号,在七段数码管上显示红绿灯余下时间(间隔一秒显示刷新,倒数计数,当计数值为0时红绿灯进行切换,绿灯转换为红灯之前,黄灯闪烁5次)
七、实验步骤:
1.点击桌面上“Intel8088 微机实验系统”图标; 2.选择通信串口和速率;
3.检查有无错误对话框,是否正确连接仪器; 4.进入dais集成开发环境; 5.选择本次实验对应的实验指导;
6.调出连线指导,按照实验原理电路图,在实验箱上进行连线;
7.调出参考代码,进行修改,编写本次实验的源程序,源代码及注释按ppt要求,放在实验结果部分;
8.将源程序编译、连接、装载入仪器,若出错则进行修改,直到装载成功; 9.将LED平台复位,然后点击绿色按钮运行;
八、实验结果:(源程序代码,必要的中文注释,以及运行结果,包括截图或者拍照)
(一)源程序代码及中文注释:
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE ORG 3400H H8: JMP START P0 EQU 0FFE0H;(1)8253 计数器0(2)用于ICW1,OCW2和OCW3 P1 EQU 0FFE1H;(1)8253 计数器1(2)用于ICW2,ICW3,ICW4和OCW1 P2 EQU 0FFE2H;8253 计数器2 P3 EQU 0FFE3H;8253 写方式字的端口
PA EQU 0FFD8H;8255 A口 PB EQU 0FFD9H;8255 B口 PC EQU 0FFDAH;8255 C口
PCTL EQU 0FFDBH;8255 控制口地址
ZXK EQU 0FFDCH;数码管字形口地址
ZWK EQU 0FFDDH;字位口地址
LED DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0DEH,0F3H BUF DB ?,?,?,?,?,?
YELLOW EQU 11111110B GREEN EQU 11111101B RED EQU 11111011B NULL EQU 11111111B
PATH DW 0;道路通行方向, 0东西方向, 1南北方向 TIME DB 0;通行剩余时间 START: CLI
MOV AX,OFFSET INT8259;设置中断
MOV BX,003CH
MOV [BX],AX;放入服务程序偏移量
MOV BX,003EH
MOV AX,0000H;放入系统中断向量区段基地址0000
MOV [BX],AX
CALL WP;显示9
CALL INIT8253;初始化8253
CALL INIT8255;初始化8255 CALL INIT8259;初始化8259
STI CON8: CALL DIS JMP CON8;-------8259中断服务子程序-------INT8259:
CLI;关中断
MOV CL,TIME;显示10
DEC CL
MOV BUF,CL
JNZ L1 MOV DX,PC MOV AL,00H
OUT DX,AL;PC停止计时
MOV DX,PA ADD DX,PATH CALL FLASH;闪烁
MOV AL,RED OUT DX,AL;变为红灯
XOR PATH,1;另一方向通行
XOR DX,1
MOV AL,GREEN OUT DX,AL;变为绿灯
MOV CL,10;定时器初始化
MOV DX,PC MOV AL,01H
OUT DX,AL;PC开始计时 L1: MOV TIME,CL;倒计时
CALL DIS;显示
MOV AL,20H;中断退出
MOV DX,P0 OUT DX,AL;OCW2 OEI
POP BX
MOV BX, OFFSET CON8 PUSH BX
STI
IRET
;-------闪烁子程序(DX)-------FLASH:
PUSH CX MOV CL, 5
FLASH1: MOV AL,YELLOW;初始AL黄
OUT DX,AL;黄灯亮
CALL DELAY1;长延时 MOV AL,NULL;清空AL
OUT DX,AL;(黄)灯灭
CALL DELAY1;长延时
LOOP FLASH1 POP CX
RET
;-------8253初始化---------INIT8253:
MOV AL,00110110B;选计数器0,从而后面是P0,先低后高字节,选方式3
MOV DX,P3 OUT DX,AL;写控制字
MOV AL,00H;低8位为0
MOV DX,P0;计数器0
OUT DX,AL
MOV AL,4BH;高8位为4B,这样393连接T5或T6,应该会每秒一个脉冲
OUT DX,AL
MOV AL,10010110B;选计数器2,直接传低8位,方式3,添加有效果
MOV DX,P3 OUT DX,AL;写控制字
MOV AL,04H
MOV DX,P2;计数器2
OUT DX,AL
RET
;-------8255初始化-------INIT8255:
MOV AL,10000000B;控制字 A口,方式0,输出;B口方式0,输出;C口,输出
MOV DX,PCTL OUT DX,AL
MOV DX,PA;A口
MOV AL,GREEN;初始状态,绿灯
OUT DX,AL
MOV DX,PB;B口
MOV AL,RED;初始状态,红灯
OUT DX,AL;初始状态,LV灯
MOV TIME,10;初始化计时时间
MOV DX,PC;C口
MOV AL,01H;PC输出始终是1,连到8253GATE
OUT DX,AL;输出到C口,开始计时
RET
;----------8259初始化-------INIT8259:
MOV AL,13H;ICW1
MOV DX,P0 OUT DX,AL;ICW1单级中断,需要ICW4,不需要ICW3
第二篇:《计算机程序设计》实验报告
《计算机 程序设计》 实验报告
姓名:
学号 :
实验日期:
****年**月**日
实验名称
控制结构与基本算法 一、实验目的要求 1.熟练掌握 if 语句和 switch 语句 2.循环控制结构的使用 二、实验内容 1.实验教材 P86 第四题。
2.实验教材 P87 第八题。
3.实验教材 P108 第一题。
4.实验教材 108 页的第四题。
5.选做题:参考实验教材 P104 第六题,做课件上题目:
科大有 4 位同学中的一位做了好事不留名,表扬信来了之后,校长问这四位是谁做的好事.A 说:不是我.B 说:是 C.C 说:是 D.D 说:他(C)胡说
• 文件名格式:学号-姓名-实验 5.doc
• 序号 1-23:tmf77@mail.ustc.edu.cn • 序号 24-45:yunmeng@mail.ustc.edu.cn • 序号 46-67:cys1024@mail.ustc.edu.cn
三、上机程序(算法设计思想)
四、运行结果
五、调试中的问题及解决方法
第三篇:《C语言程序设计》实验报告
指导教师学院专业班级学号姓名实验室
实验题目:
实验要求:
实验内容及步骤:
运行结果
心得体会:
第四篇:Java语言程序设计实验报告1
《Java语言程序设计》实验报告一
学生姓名: 孙文琳
班级: 信息111
学号:201152275119 实验地点: 经管中心证券实验室
指导教师:赵利平实验日期:
2012.3.6
实验环境:Windows 2000+JDK1.6
1.实验目的(1)养成良好的编程风格;(2)掌握字符数据类型及其运算;
(3)熟悉从输入对话框获取输入和从控制台获取输入两种方法;(4)掌握布尔运算符;(5)掌握分支语句if和switch。
2.实验内容(1)在控制台下求两个实数的最大值:完成实验教材P22程序清单2-2;(2)
3.实验过程
报告撰写具体要求:上述实验内容要求写出源代码及运行结果。实验内容(1)://CompareTwoNumbersl.java
import java.util.Scanner;
public class CompareTwoNumbers1{
double number1,number2;
Scanner scanner;
public CompareTwoNumbers1(){
System.out.println(“请输入两个数字:”);
scanner=new Scanner(System.in);
number1=scanner.nextDouble();
number2=scanner.nextDouble();
System.out.println(“较大的数是:”+(number1>number2?number1:number2));
}
public static void main(String args[]){ CompareTwoNumbers1 ct=new CompareTwoNumbers1();System.exit(0);}
}
实验内容(2):
//DollarConvertor.java import java.util.Scanner;public class DollarConvertor{ public static void main(String args[]){ System.out.println(“请输入美元数:”);Scanner scanner=new Scanner(System.in);double i=scanner.nextDouble();double result=i*6.2875;System.out.println(“对应的人民币数:”+result);} }
实验内容(3): public class MultiplyList1{ public static void main(String args[]){ String output=“";for(int row=1;row<=9;row++){ for(int col=1;col<=row;col++)output+=col+”*“+row+”=“+(row*col)+” “;output+=”n";} System.out.println(output);System.exit(0);}}
4.实验总结
心得体会:做实验要小心翼翼,注意Java大小区分
第五篇:C语言程序设计 实验报告2.3
C语言程序设计
实验报告
专业
班级
日期
11月26日
成绩
实验组别
第 2(2.3)次实验
指导教师
李开
学生姓名
学号
同组人姓名
实验名称 流程控制实验
一、实验目的
(1)掌握复合语句、if语句、switch语句的使用,熟练掌握for、while、do-while三种基本的循环控制语句的使用,掌握重复循环技术,了解转移语句与标号语句。
(2)熟练运用for、while、do-while语句来编写程序。(3)练习转移语句和标号语句的使用。
(4)使用集成开发环境中的调试功能:单步执行、设置断点、观察变量值。
二、实验任务
3.2 实验内容及要求 1.源程序改错
下面是计算s=n!的源程序,在这个源程序中存在若干语法和逻辑错误。要求在计算机上对这个例子程序进行调试修改,使之能够正确完成指定任务。例如,8!=40320。#include
2.源程序修改替换
(1)修改第1题,分别用while和do-while语句替换for语句。
(2)修改第1题,输入改为“整数S”,输出改为“满足n!≥S的最小整数n”。例如输入整数40310,输出结果为n=8。
3.程序设计
(1)假设工资税金按以下方法计算:x < 1000元,不收取税金;1000 ≤ x < 2000,收取5%的税金;2000 ≤ x < 3000,收取10%的税金;3000 ≤ x < 4000,收取15%的税金;4000 ≤ x < 5000,收取20%的税金;x>5000,收取25%的税金。输入工资金额,输出应收取税金额度,要求分别用if语句和switch语句来实现。
(2)将输入的一行字符复制到输出,复制过程中将一个以上的空格字符用一个空格代替。
(3)打印如下杨辉三角形。
/*第0行 */ 1 1 /*第1行 */ 1 2 1 /*第2行 */ 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1
jjCCii每个数据值可以由组合计算(表示第i行第j列位置的值),而的计算如下:
Ci0(i=0,1,2,„)CijCij1*(i-j1)/ j(j=0,1,2,3,„,i)本程序中为了打印出金字塔效果,要注意空格的数目。一位数之间是3个空格,两位数之间有2个空格,3位数之间只有一个空格,程序编制过程中要注意区分。
(4)编写一个程序,将用户输入的任意正整数逆转,例如,输入1234,输出4321。
4.选做题
32f(x)3x4x5x130满足精度e=10-6 编写一个程序,用牛顿迭代法求方程的一个近似根,并在屏幕上输出所求近似根。
x0axxkf(xk)/f'(xk),其中f'(x)是牛顿迭代法:求方程近似根的迭代公式为k1函数f(x)的导函数。牛顿迭代法首先任意设定的一个实数a来作为近似根的迭代初值x0,然后用迭代公式计算下一个近似根x1。如此继续迭代计算x2, x3, „, xn, 直到xnxn1精度e
,此时值xn即为所求的近似根。
2.3:
1.源程序改错:(源程序)
#include
(修改后程序)#include
int i,n,s=1;
printf(“Please enter n:”);
scanf(“%d”,&n);
for(i=1;i<=n;i++)
s=s*i;
printf(“%d!= %d”,n,s);
return 0;}
2.源程序修改替换
(1)修改第1题,分别用while和do-while语句替换for语句。(while)
#include
(do-while)#include
(2)修改第1题,输入改为“整数S”,输出改为“满足n!≥S的最小整数n”。例如输入整数40310,输出结果为n=8。
#include = %d”,i-1,s);return 0;}
3.程序设计
(1)假设工资税金按以下方法计算:x < 1000元,不收取税金;1000 ≤ x < 2000,收取5%的税金;2000 ≤ x < 3000,收取10%的税金;3000 ≤ x < 4000,收取15%的税金;4000 ≤ x < 5000,收取20%的税金;x>5000,收取25%的税金。输入工资金额,输出应收取税金额度,要求分别用if语句和switch语句来实现。
(switch语句)#include
printf(“输入你的工资 ”);
int t;
float x;
scanf(“%f”,&x);
t =(int)(x/1000.0);
switch(t){
case 0:
printf(“no tax!n”);
break;
case 1:
printf(“%fn”,0.05*x);
break;
case 2:
printf(“%fn”,0.10*x);
break;
case 3:
printf(“%fn”,0.15*x);
break;
case 4:
printf(“%fn”,0.20*x);
break;
case 5:
printf(“%fn”,0.25*x);
break;
default:
printf(“%fn”,0.25*x);
break;
}
return 0;}
(if语句)
#include “stdio.h” int main(int argc, char *argv[]){
float x, tax;
scanf(“%f”, &x);
if(x<0)
{
printf(“Wrong input.n”);
return 1;
}
if(x<1000)
{
tax = 0.00;
}
else if(x>=1000&&x<2000)
{
tax = 0.05 * x;
}
else if(x>=2000&&x<3000)
{
tax = 0.10 * x;
}
else if(x>=3000&&x<4000)
{
tax = 0.15 * x;
}
else if(x>=4000&&x<5000)
{
tax = 0.20 * x;
}
else
{
tax = 0.25 * x;
} printf(“Tax of salary %.2f YUAN is %.2f YUAN.n”, x, tax);}
(2)将输入的一行字符复制到输出,复制过程中将一个以上的空格字符用一个空格代替。
#include
if(c==' '){
if(flag==0){
putchar(c);
flag=1;
}
}
else{
putchar(c);
flag=0;
}
}
return 0;}
(3)打印如下杨辉三角形。
/*第0行 */ 1 1 /*第1行 */ 1 2 1 /*第2行 */ 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1
jjCCii每个数据值可以由组合计算(表示第i行第j列位置的值),而的计算如下:
Ci01
(i=0,1,2,„)CijCij1*(i-j1)/ j(j=0,1,2,3,„,i)本程序中为了打印出金字塔效果,要注意空格的数目。一位数之间是3个空格,两位数之间有2个空格,3位数之间只有一个空格,程序编制过程中要注意区分。
#include
(4)编写一个程序,将用户输入的任意正整数逆转,例如,输入1234,输出4321。#include
4.选做题
-6 编写一个程序,用牛顿迭代法求方程f(x)3x4x5x130满足精度e=10的一个近似根,并在屏幕上输出所求近似根。
32x0axxkf(xk)/f'(xk),其中f'(x)是牛顿迭代法:求方程近似根的迭代公式为k1函数f(x)的导函数。牛顿迭代法首先任意设定的一个实数a来作为近似根的迭代初值x0,然后用迭代公式计算下一个近似根x1。如此继续迭代计算x2, x3, „, xn, 直到xnxn1精度e,此时值xn即为所求的近似根。
#include
double f(double x){ return(3*x*x*x-4*x*x-5*x+13);} double f_(double x){ return(9*x*x-8*x-5);} double root(double m){ double n;n=m-f(m)/f_(m);if(fabs(m-n)<=0.000001){ return n;} else{ return root(n);} }
四、实验体会
了解更多有关C语言的语法知识和循环结构以及熟练了调试过程。