电子科大计算机学院汇编语言程序设计实验报告分精品版.docx
《电子科大计算机学院汇编语言程序设计实验报告分精品版.docx》由会员分享,可在线阅读,更多相关《电子科大计算机学院汇编语言程序设计实验报告分精品版.docx(63页珍藏版)》请在冰豆网上搜索。
电子科大计算机学院汇编语言程序设计实验报告分精品版
电子科大计算机学院-汇编语言程序设计-实验报告-分精品版
————————————————————————————————作者:
————————————————————————————————日期:
电子科技大学计算机科学与工程学院
标准实验报告
(实验)课程名称汇编语言与微机接口技术综合实验
电子科技大学教务处制表
电子科技大学
实验报告
(一)
学生姓名:
郫县英格拉姆学号:
2014123456789指导教师:
皮皮怪
实验地点:
主楼A2_412实验时间:
2017年4月25日星期二
一、实验室名称:
主楼A2_412机房
二、实验项目名称:
汇编语言编程训练
三、实验学时:
3学时
四、实验原理:
(包括知识点,电路图,流程图)
知识点
(一)课后自学——使用DOSBox在win7x64位下搭建汇编环境
1.软件安装
a.安装3DOSBox
b.准备debug.exe,masm.exe,link.exe,edit.exe文件。
2.使用
a.DOSBox安装完成后,打开,可发下它的提示符是:
“Z:
\>”,这是DOSBox里的虚拟盘。
我们需要更改到我们自己的盘符,如果直接更改的话,会提示你错误。
首先需要mount到自己的目录。
b.比如我们准备将D:
\DEBUG作为我们自己的汇编测试目录,则执行“mountCD:
\DEBUG”命令,这样C盘符也就虚拟成了自己本地电脑的D:
\DEBUG目录。
我们在DOSBox中切换到C盘符时,也就实际上切换到了D:
\DEBUG目录。
c.将debug.exe,masm.exe,link.exe,放置于D:
\DEBUG目录下,我们就能在DOSBox下直接使用它们了。
3.配置
上面我们为使用DOSBox,要mount到我们本地目录,但是我们每一次打开DOSBox都要进行这两步,有点麻烦,可以通过下面的操作来保存配置。
a.开始->所有程序->DOSBox-0.74->Options->DOSBox0.74Options,在文本的最后位置找到“[autoexec]”:
[autoexec]
#Linesinthissectionwillberunatstartup.
#YoucanputyourMOUNTlineshere.
b.然后将下面的2条命令写在此处:
第一条命令的作用是mount目录,第二条命令的作用是mount之后切换到D盘符:
mountCD:
\DEBUG
C:
知识点
(二)课堂讲述——相关知识介绍
1.生成可执行程序的过程
·建立汇编源程序(*.asm)
·汇编源程序文件,生成目标文件(*.obj)、
·连接目标文件,生成可执行文件(*.exe)
·运行调试程序
2.汇编
假设masm.exe在D盘根目录下,编辑了一个名为demo.asm的源文件,则通过命令
D:
\>masmdemo.asm;扩展名可以忽略,默认为asm类型
得到汇编结果,如下图所示:
·扩展名为*.lst的文件称为列表文件,该文件对于后续的调试十分有用。
关于列表文件(*.lst)
列表文件同时列出源程序和机器语言程序清单,并给出段表、段的大小及属性,以及用户定义的符号表、符号类型及属性,对于调试程序十分有用。
3.连接
在生成了目标文件demo.obj以后,通过输入命令
D:
\>linkdemo.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、运行调试程序,键入debugproject1.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命令进行调试,分析结果(分析过程见报告第九部分)。
八、实验结果:
(源程序代码,必要的中文注释,以及运行结果,包括截图或者拍照)
实验一第一题
源代码及其注释如下:
TITLETABLELOOKUP
DATASEGMENT;数据段
TABLEDB01,02,03,04,05,06,07,82,09,10
DB11,12,13,14,15,16,17,18,19,20;为了便于调试,把82之外的数据进行特殊处理,使其数值等于所在的位置
NUMDB8;学号为8
MATHDB?
DATAENDS
STACK1SEGMENTPARASTACK;堆栈段
DW20HDUP(0)
STACK1ENDS
COSEGSEGMENT
ASSUMECS:
COSEG,DS:
DATA,SS:
STACK1
START:
MOVAX,DATA
MOVDS,AX;装入DS
MOVBX,OFFSETTABLE;BX指向表首地质
XORAH,AH;AH清零
MOVAL,NUM;NUM值赋给AL
DECAL;因为实际学号从1开始
XLAT;查表
MOVMATH,AL;存结果
MOVAH,4CH
INT21H
COSEGENDS
ENDSTART
运行结果介绍及截图、分析:
运行调试程序,通过G命令、D命令进行调试,分析结果。
查看PROJECT1.LST文件,可以分析出调试的方法,分析过程见图标记:
根据上述分析输入指令g0013、d0015l1进行调试,结果见下图:
结果分析:
MATH中成绩为52h,对应十进制82,而在程序源代码中对成绩的定义情况如下,其中的学号为8对应的成绩确实为82:
符合要求,实验成功。
实验一:
第二题
源代码及其注释如下:
DATASEGMENT
ARYDB01,16,02,03,04,05,06,07,08,09
MAXDB?
DATAENDS
STACK1SEGMENTPARASTACK
DW20HDUP(0)
STACK1ENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK1
BEGIN:
MOVAX,DATA
MOVDS,AX;装入DS
MOVSI,OFFSETARY;SI指向ARY第一个元素
MOVCX,9;CX做计数器
MOVAL,[SI];取第一个元素到AL
LOP:
INCSI;SI指向后一个元素
CMPAL,[SI];比较两个数
JAEBIGER;前元素>=后元素,则跳到BIGER进行处理
MOVAL,[SI];取较大数到AL
BIGER:
LOOPLOP;循环执行LOOP
MOVMAX,AL;存最大数
MOVAH,4CH
INT21H
CODEENDS
ENDBEGIN
运行结果介绍及截图、分析:
运行调试程序,通过G命令、D命令进行调试,分析结果。
查看PROJECT2.LST文件,可以分析出调试的方法,分析过程见图标记:
根据上述分析输入指令g0019、d000al1进行调试,结果见下图:
MATH中成绩为10h,对应十进制数16,确实是我编写的十个数中的最大数:
符合要求,实验成功。
实验二:
堆栈传递参数,转化ASCII码
代码及注释如下:
DATASEGMENT
BIN1DB35H
BIN2DW0AB48H
ASCBUFDB20HDUP(?
)
DATAENDS
STACK1SEGMENTPARASTACK
DW20HDUP(65535);对应OFFFFH便于查看内存单元时确定堆栈位置
STACK1ENDS
COSEGSEGMENT
ASSUMECS:
COSEG,DS:
DATA,SS:
STACK1
BEGIN:
MOVAX,DATA
MOVDS,AX
XORAX,AX;清零AX
MOVAH,BIN1;第一个数据送AH
PUSHAX;待转换数据压栈
MOVAX,8
PUSHAX;待转换位数压栈
LEADI,ASCBUF
PUSHDI;存放ASCII码首址压栈
CALLBINASC;调用转换子程序
MOVAX,BIN2;第二个数据送AX
PUSHAX;待转换数据压栈
MOVAX,10H
PUSHAX;待转换位数压栈
ADDDI,8
PUSHDI;DI+8压栈
CALLBINASC;调用转换子程序
MOVAH,4CH
INT21H
BINASCPROC
PUSHAX
PUSHCX
PUSHDX
PUSHDI
MOVBP,SP
MOVDI,[BP+10];从堆栈取入口参数
MOVCX,[BP+12]
MOVDX,[BP+14]
LOP:
ROLDX,1;LOP为将所给转化为ASCII的算法
MOVAL,DL
ANDAL,1
ADDAL,30H
MOV[DI],AL
INCDI
LOOPLOP
POPDI
POPDX
POPCX
POPAX
RET6;返回并从堆栈中弹出6个字节
BINASCENDP
COSEGENDS
ENDBEGIN
分析:
首先单步运行几条指令,通过d00查看内存单元状态,检测堆栈段等的设置是否成功:
空间看起来有问题:
上面显示00的部分是设置的ASCBUF应该有用32个字节,截图显示是45个;下面的STACK1应该有64个字节,截图显示是54个,但后面全部执行完毕后结果是正确的。
在网络上查询过后得知应该是软件的原因。
继续执行至将第一个待转换数据0035H压栈,查看内存单元,截图如下:
同样的,执行至待转换位数、存放ASCII码首址成功入栈,与上图相似,省去截图,直至调用转化子程序,执行完一系列入栈操作和取入口参数、数据位数、待转换数据操作:
进入标号为LOP的程序段,循环执行求ASCII码的算法,将数据一位一位地转化为ASCII码,循环过程中可以看到CX依次减1,减小至0时不再执行LOP循环:
继续执行至第一个数据转化结束,查看内存单元情况,与预期结果进行比较,
第一个待转换数据35H=00110101B,其对应ASCII码确实与内存单元中显示相同,
详见图片:
第二个待转换数据分析过程与第一个数据相同,转化结束后同样与预期结果进行比较:
第二个待转换数据AB48H=1010101101001000B,其对应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
·在IBMPC/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平台复位,然后点击绿色按钮运行;
八、实验结果:
(源程序代码,必要的中文注释,以及运行结果,包括截图或者拍照)
(一)源程序代码及中文注释:
CODESEGMENT
ASSUMECS:
CODE,DS:
CODE,ES:
CODE
ORG3400H
H8:
JMPP8259
ZXKEQU0FFDCH;数字管字形码端口地址
ZWKEQU0FFDDH;数字管字位码端口地址
LEDDB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;LED
DB88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0DEH,0F3H
BUFDB?
?
?
?
?
?
;预留6个字节空间存放的是需要显示的字符,如123456
PORT0EQU0FFE0H;偶地址
PORT1EQU0FFE1H;奇地址
P8259:
CLI;关中断
CALLWP;初始化显示“P.”
MOVAX,OFFSETINT8359
MOVBX,0038H;6号中断向量表
MOV[BX],AX
MOVBX,003AH
MOVAX,0000H
MOV[BX],AX
MOVAX,OFFSETINT8259
MOVBX,003CH;7号中断向量表
MOV[BX],AX