微机原理软件实验报告班级:201*******姓名:******学号:201*******微机原理软件实验·报告第1页实验一DEBUG的使用一、实验目的1.掌握汇编程序的编辑、编译、连接和执行的全过程;2.学习和掌握用DEBUG调试程序的方法。二、实验内容1.用编辑软件,输入以下汇编语言源程序:DATSEGMENTADB20BDB15YDB3DUP(0)ZDB0,0DATENDSSTASEGMENTSTACKDW50DUP(?)STAENDSCODSEGMENTASSUMECS:COD,DS:DATSTARPROCFARPUSHDSXORAX,AXPUSHAXMOVAX,DATMOVDS,AXMOVAX,STAMOVSS,AXMOVAL,AMOVZ,ALMOVZ+1,ALCALLSUB1MOVAL,BMOVZ,ALMOVZ+1,ALCALLSUB1MOVAL,AMOVZ,ALMOVAL,BMOVZ+1,AL微机原理软件实验·报告第2页CALLSUB1ADDWORDPTRY,AXADCBYTEPTR[Y+2],0RETSTARENDPSUB1PROCMOVAL,ZMOVAH,Z+1MULAHADDWORDPTRY,AXADCBYTEPTR[Y+2],0RETSUB1ENDPCODENDSENDSTAR2.通过编译,连接形成可执行文件。3.用DEBUG将可执行文件调入,并进行调试。1)用D命令观察数据区在内存中的具体内容,记录单元A和B的具体地址。2)用U命令对目标代码反汇编,观察反汇编后的结果。注意发现源程序的起始位置,并记录这个起始地址。3)用T命令作单步跟踪调试。比较每条指令执行后的结果和原来的理解是否一致,得出程序运行的结果:它们是写在什么单元,具体内容是什么;并判断结果是否正确。在子程序SUB1的入口处设一断点,用G命令执行程序。在断点处观察堆栈的内容,比较堆栈的内容和程序返回地址是否一致。4)用E命令修改单元A,B的内容,重新执行程序,并记录结果。5)用M命令和A命令对程序进行修改:将主程序中最后两条指令(ADD和ADC)修改为一条CALLSUB1指令,重新执行程序。6)退出DEBUG。4.重新使用编辑软件,把源程序最后一句中的STAR去掉。再次生成可执行文件,并用DEBUG调入内存。当使用U命令时,显示的结果与前一次(未加STAR)的结果有何不同?三、预习思考1.熟悉常用的DEBUG命令。答:常用的DEBUG命令如下图表所示。微机原理软件实验·报告第3页2.阅读并分析程序的功能。答:程序完成的功能是计算两个数的完全平方和,即计算222abab。3.若SS=2000H,SP=FFFFH,向堆栈中压入4字节数据后,如何用D命令显示压入堆栈的内?答:使用的命令是:-D2000:FFFB,即使用段基址加偏移量查看。四、实验过程1.编译和链接形成可执行文件。微机原理软件实验·报告第4页2.用debug命令对程序进行调试1)用D命令观察数据区在内存中的具体内容,记录单元A和B的具体地址。2)用U命令对目标代码反汇编,观察反汇编后的结果。注意发现源程序的起始位置,并记录这个起始地址。微机原理软件实验·报告第5页其中第一个红色框框住的076AH表示数据段的段地址,第二个红色方框框住的是A的偏移地址,第三个红色方框框住的是B的偏移地址。D指令后面跟随的是A的地址。黄色方框框住的分别是A和B的数值。3)用T命令作单步跟踪调试。比较每条指令执行后的结果和原来的理解是否一致,得出程序运行的结果:它们是写在什么单元,具体内容是什么;并判断结果是否正确。在子程序SUB1的入口处设一断点,用G命令执行程序。在断点处观察堆栈的内容,比较堆栈的内容和程序返回地址是否一致。在执行子程序之前:微机原理软件实验·报告第6页第一个红色方框框住的是callSUB1指令的位置和指令的内容。第二个红色方框g指令后面跟随的就是该断点的地址。单步执行后:可以在图中看到第一个红色方框显示的是子程序执行之前执行到的代码的地址。第二个红色方框显示的是子程序开始调用后代码执行的地址。显然此时前一步的CS和IP内容已经压栈,并且CS和IP指向了子程序的地址。4)用E命令修改单元A,B的内容,重新执行程序,并记录结果。第一个和第二个蓝色方框框住的是输入要修改内容的地址。第三个蓝色方框表示要查看的内存单元的地址。第一个和第二个绿色方框框住的是修改前后该地址存储的内容。第三个绿色方框表示的是修改后内存内存储的数值情况。5)用M命令和A命令对程序进行修改:将主程序中最后两条指令(ADD和ADC)修改为一条CALLSUB1指令,重新执行程序。将ADD和ADC指令修改为一条CALLSUB1指令:微机原理软件实验·报告第7页3.重新执行编译过程:把源程序最后一句中的STAR去掉。再次生成可执行文件,再次DEBUG。当使用U命令时,结果如下图所示。可以看到,没有ENDSTAR语句,编译器将不知道代码段的入口地址是多少,导致从数据段开始译码,后续译码全部紊乱。ENDSTAR的作用是指示编译器程序结束,同时告诉编译器程序执行时代码段的入口地址。五、实验总结此次实验是微机原理软件实验的第一次实验。上课期间我们更多的是学会单句汇编语言的书写和使用法则,很少深入到程序的底层和内部进行探究和调测。微机原理软件实验·报告第8页本次实验虽然内容比较简单,更多地涉及到了debug命令的操作和之行,而实际上更多考察了我们对于汇编语言与内存等存储单元的调用和关系。这和高级语言是极其不同的。这次实验我学会了汇编程序的基本调测方法,也体会到汇编的调试和高级语言调试调用的方法是具有很大差别。对于汇编语言程序的调用和调试,需要考虑到内存的每一个单元,在进行子程序调用的时候,还需要照顾到堆栈的进出关系。而高级语言则直接进行语言的书写而不必考虑到底层数据和存储单元的变化。我想这两者的区别,可以通过这次实验得到深刻的体会。实验二分支、循环程序设计一、实验目的1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的DOS功能调用。二、实验内容1.安排一个数据区,内存有若干个正数,负数和零。每类数的个数都不超过9。2.编写一个程序统计数据区中正数,负数和零的个数。3.将统计结果在屏幕上显示。4.(扩展题)统计出正奇数、正偶数,负奇数、负偶数以及零的个数。三、预习思考1.十进制数0~9所对应的ASCII码是什么?如何将十进制数0~9在屏幕上显示出来?答:0~9分别对应ASCII码的30H~39H。欲将十进制数0~9显示在屏幕上,只需要用二进制数0~9分别加上30H即可。2.如何检验一个数为正,为负或为零?你能举出多少种不同的方法?答:方法有多种,现举出两种。一是直接用CMP命令和0比较,然后用JZ等命令进行判断;二是和0相比是否相等,然后用该数(假设为8位)和10000000相与,取出符号位判断,可区分正负。其余方法大同小异,核心的思想是要么直接和0相比,要么使用逻辑或移位运算,取出符号为进行判断。四、实验过程(一)、流程图微机原理软件实验·报告第9页程序开始定义数据段的数据和变量CL=0?SI加1DI减1数据和0比较正数个数加1负数个数加10的个数加1打印统计结果结束偶数?偶数?Y,正偶数加1Y,负偶数加1N,正奇数加1N,负奇数加1微机原理软件实验·报告第10页二)、源代码DATASEGMENTNUMDB1,2,3,4,5,6,-2,-3,-4,-7,0,0,0,0LEQU$-NUM;数字长度PLDB?;正数个数NLDB?;负数个数ZERODB?;零的个数PEVENDB?;正偶数PODDDB?;正奇数NEVENDB?;负偶数NODDDB?;负奇数POSICHARDB'Positive:$'NEGTCHARDB'Negtive:$'ZEROCHARDB'Zero:$'EVENCHARDB'Even:$'ODDCHARDB'Odd:$'CRDB0DH,0AH,'$';回车换行的ASCII码DATAENDS;--------------------------------------------------------CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,OFFSETNUM;DECSI;受到下面程序代码预先将偏移地址减1MOVCL,L;数组长度赋予CLMOVAL,0LOP:CMPCL,0;循环控制条件:判断剩余数字个数是否为0JEPRINT;为0则跳出,执行打印过程INCSI;否则地址加1,开始检验下一个数字DECCL;剩余数字个数减1MOVBL,[SI];采用基址加变址寻址CMPBL,AL;和零比较JGP;是正数跳转至程序PJEZ;是零跳转至程序ZJLN;是负数跳转至程序NP:INCPL;正数个数加一TESTBX,01h;检验最后一位是否是0JZPEP;是0,即偶数则跳转至PEPINCPODD;不是0,则正奇数个数加1JMPLOPPEP:INCPEVEN;正偶数个数加1JMPLOP微机原理软件实验·报告第11页Z:INCZERO;0的个数加1JMPLOPN:INCNL;负数个数加1TESTBX,01h;检验最后一位是否为0;JZNEP;最后一位是0,则跳转到NEPINCNODD;否则最后一位是1,负奇数个数加1JMPLOP;NEP:INCNEVEN;负偶数个数加1JMPLOPPRINT:;打印正数提示符和正数(奇偶)个数MOVAH,09HMOVDX,OFFSETPOSICHARINT21HMOVAH,02HMOVDL,PLADDDL,30HINT21HMOVAH,09HMOVDX,OFFSETEVENCHARINT21HMOVAH,02HMOVDL,PEVENADDDL,30HINT21HMOVAH,09HMOVDX,OFFSETODDCHARINT21HMOVAH,02HMOVDL,PODDADDDL,30HINT21HMOVDX,OFFSETCRMOVAH,09HINT21H;--------------------------------------------------------;打印负数提示符和负数(奇偶)个数MOVAH,09HMOVDX,OFFSETNEGTCHARINT21HMOVAH,02HMOVDL,NLADDDL,30HINT21H微机原理软件实验·报告第12页MOVAH,09HMOVDX,OFFSETEVENCHARINT21HMOVAH,02HMOVDL,NEVENADDDL,30HINT21HMOVAH,09HMOVDX,OFFSETODDCHARINT21HMOVAH,02HMOVDL,NODDADDDL,30HINT21HMOVDX,OFFSETCRMOVAH,09HINT21HMOVAH,09HMOVDX,OFFSETZEROCHARINT21HMOVAH,02HMOVDL,ZEROADDDL,30HINT21HEXT:MOVAX,4C00HINT21HCODEENDSENDSTART(三)、实验分析数据区待统计的数据为:1,2,3,4,5,6,-2,-3,-4,-7,0,0,0,0实验结果如下图所示。本实验较为简单,意在练习基本的分支、循环结构。最重要的部分是数据和和0比较,区分正负和零,然后在正数和负数中判断奇偶。实际判断奇偶时,又在程序下分写了更小的分支,每次检验数据的最后一位是否是0,用到了TEXT指令,对所有的情况进行了讨论。微机原理软件实验·报告第13页且所有的计数过程都可以在LOP下完成,不用再另写程序统计个数,比较节省代码。五、实验总结本次实验内容比较简单,但是在进行代码编写时,需要非常用心地整理各个程序段的判断条件和跳转关系。当有大量判断和循环存在时,需要考虑清楚程序实现跳转的判断条件,以及该程序段跳转的方向。可以说,汇编从本质上并没有循环和分支,而高级语言从结构和形式上都是通过不同条件下的循环和递归调用实现。我们进行循环的时候,都是通过将IP重新赋