信息与通信工程学院微机原理软件实验报告班级:姓名:学号:班内序号:时间:微机原理软件实验·报告-1-实验一DEBUG的使用一、实验目的1.掌握汇编程序的编辑,编译,连接和执行的全过程;2.学习和掌握用DEBUG调试程序的方法。二、实验内容1.用编辑软件,输入以下汇编语言源程序:DATSEGMENTADB20;(自定)BDB15;(自定)YDB3DUP(0)ZDB0,0DATENDSSTASEGMENTSTACKDW50DUP(?)STAENDSCODSEGMENTASSUMECS:COD,DS:DATSTARPROCFARPUSHDSXORAX,AXPUSHAXMOVAX,DATMOVDS,AXMOVAX,STAMOVSS,AXMOVAL,AMOVZ,ALMOVZ+1,ALCALLSUB1MOVAL,B微机原理软件实验·报告-2-MOVZ,ALMOVZ+1,ALCALLSUB1MOVAL,AMOVZ,ALMOVAL,BMOVZ+1,ALCALLSUB1ADDWORDPTRY,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指令,重新执行程序。微机原理软件实验·报告-3-6)退出DEBUG。4.重新使用编辑软件,把源程序最后一句中的STAR去掉。再次生成可执行文件,并用DEBUG调入内存。当使用U命令时,显示的结果与前一次(未加STAR)的结果有何不同?三、预习题1.熟悉常用的DEBUG命令。答:2.阅读并分析程序的功能。答:程序完成的功能是计算两个数的完全平方和,即计算a2b22ab。3.若SS=2000H,SP=FFFFH,向堆栈中压入4字节数据后,如何用D命令显示压入堆栈的内容?答:使用的命令是:-D2000:FFFB。微机原理软件实验·报告-4-四、实验过程1.编译、链接形成可执行文件:2.用-u进行反汇编:对照汇编代码,可得:数据段地址为145AH:0000H,A的偏移地址为[0000H],B的偏移地址为[0001H]。、源程序起始地址为1462H:0000H。微机原理软件实验·报告-5-3.用d命令观察数据区中内存单元的具体内容,记录A、B的地址:2中已经获得A、B的具体地址,分别为:145AH:0000H,145AH:0001H,用d命令观察后看出A=14H=20D,B=0FH=15D。4.用E命令修改单元A、B的内容并用d命令查看,重新执行程序。A、B已经分别被修改为5和2。结果为31H=49D。5.得出程序运行结果:20*20+15*15+2*15*20=1225对应十六进制是04c9H结果存放在145AH:0002H和145AH:0003H中。5.单步调试最初寄存器内容:将DS压入堆栈,SP=SP-2-6-微机原理软件实验·报告将AX压入堆栈,SP=SP-2倒数第二行在调用子程序CALL003F调用后把IP和CS压入堆栈,SP=SP-4查看一下此时堆栈情况:-7-微机原理软件实验·报告子程序返回返回后把IP和CS弹出堆栈,SP=SP+4查看一下此时堆栈情况:之后过程与上述基本一致。与理解一致。-8-微机原理软件实验·报告6.设置断点查看堆栈:7.修改指令通过a命令直接修改程序指令,通过插入nop使CPU空闲。-9-微机原理软件实验·报告8.重新编辑译码错误,误将A、B变量中的数据按照指令进行译码;后续译码也错误,误将0000按照指令进行译码为ADD命令四、实验总结这是微机原理软件实验的第一次实验。平时只是注重理论上的学习,上机经验很少,以后需要加强联系。通过这次实验,我学会了汇编程序的debug方法,掌握了常用的debug命令,汇编的调试需要深入堆栈和内存区,关心每一个地址和指令,这也体现汇编语言是底层语言的特点。-10-微机原理软件实验·报告实验二分支、循环程序设计一、实验目的1.开始独立进行汇编语言程序设计;2.掌握基本分支、循环程序设计;3.掌握最简单的DOS功能调用。二、实验内容1.安排一个数据区,内存有若干个正数、负数和零。每类数的个数都不超过9。2.编写一个程序统计数据区中正数、负数和零的个数。3.将统计结果在屏幕上显示。三、预习题1.十进制数0--9所对应的ASCII码是什么?如何将十进制数0--9在屏幕上显示出来?答:十进制数0—9对应的ASCII码是30H—39H。在屏幕上显示的程序:MOVAL,30HMOVAH,02HINT21H2.如何检验一个数为正、为负或为零?你能举出多少种不同的方法?答:方法1:将待检验数与0比较,根据CMP之后的CF、OF、SF等进行判断;方法2:将待检验数与80H与,判断ZF的值。四、选做题统计出正奇数,正偶数,负奇数,负偶数以及零的个数。-11-微机原理软件实验·报告负偶数个数+1负奇数个数+1五、实验流程图开始初始化数据区取BUFF中第一个数与0比较0=00正数个数加1零个数加1负数个数加1跟01H进行与运算跟01H进行与运算结果为0结果为0正偶数个数+1正奇数个数+1指向下一个数保存统计情况是否比较完毕将当前结果送显结束-12-微机原理软件实验·报告六、源代码DATASEGMENT;数据段定义BUFFDW-5,10,9,0,-7,2,0,41,-42,18,0,34,-86,3,0,21,-63;在数据区存储4个正奇数,4个正偶数,4个0,2个负偶数,3个负奇数COUNTEQU$-BUFF;统计数据区BUFF所占字节数PLUSDB?;正数的个数EPEDB0;正偶数个数EPODB0;正奇数个数ZERODB?;零的个数MINUSDB?;负数的个数EMEDB0;负偶数个数EMODB0;负奇数个数STR1DB0DH,0AH,'positiveis:',20H,'$';输出提示语句STR2DB0DH,0AH,'negativeis:',20H,'$';STR3DB0DH,0AH,'zerois:',20H,'$';STR4DB0DH,0AH,'evenis:',20H,'$';STR5DB0DH,0AH,'oddis:',20H,'$';CRDB0DH,0AH,'$';回车换行的ASCII码DATAENDS;数据段终止STACKSEGMENTSTACK'STACK';堆栈段定义DB100DUP(?)STACKENDSCODESEGMENT;代码段定义ASSUMECS:CODE,DS:DATA,SS:STACK,ES:DATASTART:AGAIN:PLU:MOVAX,DATAMOVDS,AXMOVCX,COUNTSHRCX,1;除2计算BUFF中数据的个数MOVAH,0MOVDX,0;初始化,设DH、DL分别用于保存0和正数的个数LEABX,BUFFCMPWORDPTR[BX],0JGPLU;0JZEQUA;=0JLSMA;0INCDLTESTWORDPTR[BX],01H-13-微机原理软件实验·报告PLUSO:SMA:SMAO:EQUA:NEXT:JNEPLUSO;正奇数INCEPEJMPNEXTINCEPOJMPNEXTINCAHTESTWORDPTR[BX],01HJNESMAOINCEMEJMPNEXTINCEMOJMPNEXTINCDHINCBX;修正地址指针INCBXLOOPAGAIN;循环MOVPLUS,DLMOVZERO,DHMOVMINUS,AHPRINT:;--------------正数信息送显---------------MOVAH,09HMOVDX,OFFSETSTR1INT21HMOVAH,02HMOVDL,PLUSADDDL,30HINT21HMOVAH,09HMOVDX,OFFSETSTR4INT21HMOVAH,02HMOVDL,EPEADDDL,30H-14-微机原理软件实验·报告INT21HMOVAH,09HMOVDX,OFFSETSTR5INT21HMOVAH,02HMOVDL,EPOADDDL,30HINT21HMOVAH,09HMOVDX,OFFSETCRINT21H;--------------负数信息送显---------------MOVAH,09HMOVDX,OFFSETSTR2INT21HMOVAH,02HMOVDL,MINUSADDDL,30HINT21HMOVAH,09HMOVDX,OFFSETSTR4INT21HMOVAH,02HMOVDL,EMEADDDL,30HINT21HMOVAH,09HMOVDX,OFFSETSTR5INT21HMOVAH,02HMOVDL,EMOADDDL,30HINT21HMOVAH,09HMOVDX,OFFSETCRINT21H-15-微机原理软件实验·报告;--------------零信息送显---------------MOVAH,09HMOVDX,OFFSETSTR3INT21HMOVAH,02HMOVDL,ZEROADDDL,30HINT21HMOVAX,4C00HINT21HCODEENDSENDSTART七、程序运行结果-16-微机原理软件实验·报告八、实验分析:本实验较为简单,意在练习基本的分支、循环结构,关键在于与0比较来区分正负和零,然后在正数和负数中分别判断奇偶,无论正负数,跟01H进行与运算,ZF=0即为偶数,ZF=1即为奇数。九、实验总结实验过程中思路一定要清晰,汇编代码由各种跳转和逻辑结构组成,需要考虑代码间的逻辑关系,否则容易出错。语法错误通过DOS界面的报错比较容易改正,但逻辑错误要进行改正就难得多。此次程序设计考验了我对循环和分支程序结构的掌握,本实验需要讨论多种情况,由此也需要进行很多次跳转,必须明确下一步的跳转方向,考虑清待分析的情况,才能顺利完成数目的统计。-17-微机原理软件实验·报告执行输入检查实验三代码转换程序设计一、实验目的1.掌握几种最基本的代码转换方法;2.运用子程序进行程序设计。二、实验内容1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来;2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明;3.对输入要有检错措施,以防止非法字符输入,并有适当的提示;4.将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图。三、预习题1.如何将输入的两个字符(0--9)变为十进制或二进制数?答:将输入的两位数存在不同的位置,先将字符减去30H,再将十位数乘10D加上个位的值,即可得两个字符的十进制数。2.如何将选出的最小值(二进制或十进制)变为ASCII码再进行显示?答:选出最小值后可以通过除10D得到余数和商,商为高位,余数为地位,分别对这两个数加30H即可得到其ASCII码。3.你觉得采用二进制运算还是十进制运算更适合于这个实验?答:二进制。四、实验流程图1.流程图开始显获取用户输入示错误信息FLAG=0查找最小数结束-18-微机原理软件实验·报告查找最小数子程序流程图:开始Y比较完毕N比较第n个=数十位ASCII码和MIN的十位ASCII码比较第n个数个位ASCII码和MIN的个位ASCII码=把第n个数写