电子科技大学计算机科学与工程学院标准实验报告(实验)课程名称汇编语言与微机接口技术综合实验电子科技大学教务处制表电子科技大学实验报告(一)学生姓名:郫县英格拉姆学号:2014123456789指导教师:皮皮怪实验地点:主楼A2_412实验时间:2017年4月25日星期二一、实验室名称:主楼A2_412机房二、实验项目名称:汇编语言编程训练三、实验学时:3学时四、实验原理:(包括知识点,电路图,流程图)知识点(一)课后自学——使用DOSBox在win7x64位下搭建汇编环境1.软件安装a.安装3DOSBoxb.准备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,edit.com放置于D:\DEBUG目录下,我们就能在DOSBox下直接使用它们了。3.配置上面我们为使用DOSBox,要mount到我们本地目录,但是我们每一次打开DOSBox都要进行这两步,有点麻烦,可以通过下面的操作来保存配置。a.开始-所有程序-DOSBox-0.74-Options-DOSBox0.74Options,在文本的最后位置找到“[autoexec]”:[autoexec]#Linesinthissectionwillberunatstartup.#YoucanputyourMOUNTlineshere.b.然后将下面的2条命令写在此处:第一条命令的作用是mount目录,第二条命令的作用是mount之后切换到D盘符:mountCD:\DEBUGC:知识点(二)课堂讲述——相关知识介绍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.EXEb.DEBUG.EXE的用法在DOS的提示符下,如下键入:c.DEBUG.EXE的注意事项d.本实验课需要的DEBUG指令运行命令G、追踪命令T、继续命令P、显示内存单元内容命令D、退出命令Q修改内存单元内容命令E、检查和修改寄存器内容的命令R流程图五、实验电路(本次实验无电路图)六、实验内容:(介绍自己所选的实验内容)实验内容一:学习“第4章顺序、分支、循环程序例子.ppt”,按照要求完成下列题目并给出实验结果(至少选择两个):我选择1、21、利用学号查学生的数学成绩表在数据段中建立一个成绩表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.obj3、通过link命令连接目标文件,生成可执行文件project2.exe4、运行调试程序,参考LST文件,通过G命令、D命令进行调试,分析结果,(分析过程见报告第九部分)。实验二:题目:用“堆栈传递参数”的方式编程,将两个给定的二进制数(8位和16位)转换为ASCII码字符串。1.根据题目要求,建立汇编源程序,用Windows系统自带的记事本进行编辑,另存为projec4.asm,并保存至masm.exe所在目录中。2.汇编源程序文件,生成目标文件project4.obj3.通过link命令连接目标文件,生成可执行文件project4.exe4.运行调试程序,,通过G命令、D命令进行调试,分析结果(分析过程见报告第九部分)。八、实验结果:(源程序代码,必要的中文注释,以及运行结果,包括截图或者拍照)实验一第一题源代码及其注释如下:TITLETABLELOOKUPDATASEGMENT;数据段TABLEDB01,02,03,04,05,06,07,82,09,10DB11,12,13,14,15,16,17,18,19,20;为了便于调试,把82之外的数据进行特殊处理,使其数值等于所在的位置NUMDB8;学号为8MATHDB?DATAENDSSTACK1SEGMENTPARASTACK;堆栈段DW20HDUP(0)STACK1ENDSCOSEGSEGMENTASSUMECS:COSEG,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AX;装入DSMOVBX,OFFSETTABLE;BX指向表首地质XORAH,AH;AH清零MOVAL,NUM;NUM值赋给ALDECAL;因为实际学号从1开始XLAT;查表MOVMATH,AL;存结果MOVAH,4CHINT21HCOSEGENDSENDSTART运行结果介绍及截图、分析:运行调试程序,通过G命令、D命令进行调试,分析结果。查看PROJECT1.LST文件,可以分析出调试的方法,分析过程见图标记:根据上述分析输入指令g0013、d0015l1进行调试,结果见下图:结果分析:MATH中成绩为52h,对应十进制82,而在程序源代码中对成绩的定义情况如下,其中的学号为8对应的成绩确实为82:符合要求,实验成功。实验一:第二题源代码及其注释如下:DATASEGMENTARYDB01,16,02,03,04,05,06,07,08,09MAXDB?DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP(0)STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1BEGIN:MOVAX,DATAMOVDS,AX;装入DSMOVSI,OFFSETARY;SI指向ARY第一个元素MOVCX,9;CX做计数器MOVAL,[SI];取第一个元素到ALLOP:INCSI;SI指向后一个元素CMPAL,[SI];比较两个数JAEBIGER;前元素=后元素,则跳到BIGER进行处理MOVAL,[SI];取较大数到ALBIGER:LOOPLOP;循环执行LOOPMOVMAX,AL;存最大数MOVAH,4CHINT21HCODEENDSENDBEGIN运行结果介绍及截图、分析:运行调试程序,通过G命令、D命令进行调试,分析结果。查看PROJECT2.LST文件,可以分析出调试的方法,分析过程见图标记:根据上述分析输入指令g0019、d000al1进行调试,结果见下图:MATH中成绩为10h,对应十进制数16,确实是我编写的十个数中的最大数:符合要求,实验成功。实验二:堆栈传递参数,转化ASCII码代码及注释如下:DATASEGMENTBIN1DB35HBIN2DW0AB48HASCBUFDB20HDUP(?)DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP(65535);对应OFFFFH便于查看内存单元时确定堆栈位置STACK1ENDSCOSEGSEGMENTASSUMECS:COSEG,DS:DATA,SS:STACK1BEGIN:MOVAX,DATAMOVDS,AXXORAX,AX;清零AXMOVAH,BIN1;第一个数据送AHPUSHAX;待转换数据压栈MOVAX,8PUSHAX;待转换位数压栈LEADI,ASCBUFPUSHDI;存放ASCII码首址压栈CALLBINASC;调用转换子程序MOVAX,BIN2;第二个数据送AXPUSHAX;待转换数据压栈MOVAX,10HPUSHAX;待转换位数压栈ADDDI,8PUSHDI;DI+8压栈CALLBINASC;调用转换子程序MOVAH,4CHINT21HBINASCPROCPUSHAXPUSHCXPUSHDXPUSHDIMOVBP,SPMOVDI,[BP+10];从堆栈取入口参数MOVCX,[BP+12]MOVDX,[BP+14]LOP:ROLDX,1;LOP为将所给转化为ASCII的算法MOVAL,DLANDAL,1ADDAL,30HMOV[DI],ALINCDILOOPLOPPOPDIPOPDXPOPCXPOPAXRET6;返回并从堆栈中弹出6个字节BINASCENDPCOSEGENDSENDBEGIN分析:首先单步运行几条指令,通过d00查看内存单元状态,检测堆栈段等的设置是否成功:空间看起来有问题:上面显示00的部分是设置的ASCBUF应该有用32个字节,截图显示是45个;下面的STACK1应该有64个字节,截图显示是54个,但后面全部执行完毕后结果是正确的。在网络上查询过后得知应该是软件的原因。继续执行至将第一个待转换数据0035H压栈,查看内存单元,截图如下:同样的,执行至待转换位数、存放ASCII码首址成功入栈,与上图相似,省去截图,直至调用转化子程序,执行完一系列入栈操作和取入口参数、数据位数、待转换数据操作:进入标号为LOP的程序段,循环执行求ASCII码的算法,将数据一位一位地转化为ASCII码,循环过程中可以看到CX依次减1,减小至0时不再执行LOP循环:继续执行至第一个数据转化结束,查看内存单元情况,与预期结果进行比较,第一个待转换数据35H=00110101B,其对应ASCII码确实与内存单元中显示相同,详见图片:第二个待转换数据分析过程与第一个数据相同,转化结束后同样与预期结果进行比较:第二个待转换数据AB48H=1010101101001000B,其对应ASCII码确实与内存单元中显示相同,详见图片:九、结果分析和改进意见(完成每次留的问答题,以及实验过程中遇到的问题)汇编语言编程作为低级语言,与高级语言相比,可读性不如高级语言,更易出错,调试更麻烦,但是逻辑性很强,更接近机器,分析起来很有意思,每一步都是很小的操作,最后能达到目的。在堆栈传递参数的实验中,内存中显示00的部分是设置