您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 北邮微机原理软件实验报告
信息与通信工程学院微机原理软件实验报告班级:姓名:班内序号:学号:日期:年11月实验二分支,循环程序设计一.实验目的:1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的DOS功能调用.二.实验内容:1.安排一个数据区,内存有若干个正数,负数和零.每类数的个数都不超过9.2.编写一个程序统计数据区中正数,负数和零的个数.3.将统计结果在屏幕上显示.三.预习题:1.十进制数0--9所对应的ASCII码是什么?如何将十进制数0--9在屏幕上显示出来?答:十进制数0-9对应的ASCII码的30H~39H。将十进制数0~9显示在屏幕上,要用二进制数0~9后面分别加上30H。2.如何检验一个数为正,为负或为零?你能举出多少种不同的方法?答:可以将这个数跟零进行比较,利用指令CMP和JZ等进行判定;或者对该有符号数的第一位进行判定,判断是不是一,若为1,则是负数,反之再判定是0还是正数。四.选作题:统计出正奇数,正偶数,负奇数,负偶数以及零的个数.五.实验过程1.流程图开始定义各段并初始化获取数据长度工作指针指向当前数字2.源代码和0相比大于0等于0小于0除以20个数加一除以2判定余数正奇数加1不为0为0正偶数加1判余数不为0负奇数加1负偶数加1为0统计结果输出结果结束DATASEGMENTBUFFDW11,12,0,-59,85,78,15,0,-78,0,74,-45,47,0,12,-79;自定义需要判定的一组数字COUNTEQU$-BUFF;得到数据长度PLUSODB0PLUSJDB0ZERODB0MINUSODB0MINUSJDB0;分别用来存几种要求的数字STRING1DB'PLUSO,PLUSJ,ZERO,MINUSO,MINUSJ:','$'STRINGDB0,'',0,'',0,'',0,'',0,'','$';用来显示结果的字符串DATAENDSSTACKSEGMENTSTACK'STACK';定义堆栈段DB100DUP(0)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKBEGINPROCFARPUSHDSXORAX,AXPUSHAX;保证返回DOSMOVAX,DATAMOVDS,AXMOVCX,COUNTSHRCX,1;相当于对CX中的数除以2LEABX,BUFF;得到BUFF的偏移地址AGAIN:CMPWORDPTR[BX],0;将工作指针中的数与零进行比较JGEPLUJMPMINUSPLU:JZZER;判定为0MOVAX,WORDPTR[BX]MOVDL,2DIVDL;将结果除以2CMPAH,0JNZPLUJINCPLUSO;正偶数加一JMPNEXTPLUJ:INCPLUSJ;正奇数加一JMPNEXTMINUS:MOVAX,WORDPTR[BX]MOVDL,2IDIVDLCMPAH,0JNZMINJINCMINUSO;负偶数加一JMPNEXTMINJ:INCMINUSJ;负奇数加一JMPNEXTZER:INCZERO;0加一NEXT:INCBXINCBX;工作指针加2LOOPAGAINMOVBL,PLUSOADDBL,30H;将统计的数字加上30h变为ASCii码MOVPLUSO,BLMOVBL,PLUSJADDBL,30HMOVPLUSJ,BLMOVBL,ZEROADDBL,30HMOVZERO,BLMOVBL,MINUSOADDBL,30HMOVMINUSO,BLMOVBL,MINUSJADDBL,30HMOVMINUSJ,BLLEABX,STRING;将每个变量统一加到字符串对应位置MOVCL,PLUSOMOV[BX],CLMOVCL,PLUSJMOV[BX+2],CLMOVCL,ZEROMOV[BX+4],CLMOVCL,MINUSOMOV[BX+6],CLMOVCL,MINUSJMOV[BX+8],CLMOVAH,09H;打印字符串MOVDX,SEGSTRING1MOVDS,DXMOVDX,OFFSETSTRING1INT21HMOVAH,09H;打印结果MOVDX,SEGSTRINGMOVDS,DXMOVDX,OFFSETSTRINGINT21HRETBEGINENDPCODEENDSENDBEGIN3.实验结果分析实验区待统计的数为:11,12,0,-59,85,78,15,0,-78,0,74,-45,47,0,12,-79经过上述代码的编译链接执行后可以得到的结果如下图所示:经过手动检查发现符合实验的预期结果,则可验证实验的正确性。六.实验总结这道题实则是比较基础简单的一道,其核心在于循环结构和对数字判定的比较方法。对于刚开始编写汇编语言的我而言,还是遇到了不小的挑战。由于汇编语言它不同于C++的许多复杂特点,确实在刚开始的时候有点无从下手,但是经过反复地读书以及资料的查阅后基本掌握了基本的分支、循环程序的编写,数字的显示等基本功能,即掌握了最简单的DOS功能调用,还是感到很开心而且受益匪浅。实验三代码转换程序设计一.实验目的:1.掌握几种最基本的代码转换方法;2.运用子程序进行程序设计.二.实验内容:1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来.2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明.3.对输入要有检错措施,以防止非法字符输入,并有适当的提示.4.将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图.三.预习题:1.如何将输入的两个字符(0--9)变为十进制或二进制数?答:输入的0——9的字符为ASCII码,只需要将他们减去30H即可得到所需的机器数。2.如何将选出的最小值(二进制或十进制)变为ASCII码再进行显示?答:跟上一个问题类似,再输出时需要将选出的最小值变为ASCII码,方法很简单,即将数字加上30H即可。3.你觉得采用二进制运算还是十进制运算更适合于这个实验?答:采用二进制或者十进制都需要进行ASCII码到数字的转换和其反向转换,相比之下十进制的变换更方便,但换用新的思路可以大大简化编程负担。即直接使用数字对应的ASCII比较,分别比较十位和个位,最后直接输出字符即可。四.实验过程1.流程图开始定义数据堆栈初始化最小值十位输入是否空格是否是否回车是否输入合法否是输出结果结束与BH比较大于等于小于个位输入个位输入更新BH与BL比较小于更新BL个位输入更新BL大于2.源代码JUDGEMACRO;用来判定输入数据合不合法的宏CMPAL,'0'JBWRONGCMPAL,'9'JAWRONGENDMXIANSHIMACROX,Y;打印两位数XY的宏MOVAH,02HMOVDL,XINT21HMOVAH,02HMOVDL,YINT21HENDMINPUTMACRO;输入单个数据的宏MOVAH,01HINT21HENDMDATASEGMENT;定义数据段STRINGDB'THEMINNUMBERIS:','$';用于说明的字符串STRING1DB'INPUTISNOTOK!!!',0DH,0AH,'$'STRING2DB'PLEASEINPUTNUMBER:',0DH,0AH,'$'STRING3DB'PLEASEINPUTAGAIN.',0DH,0AH,'$'DATAENDSSTACKSEGMENT'STACK';定义堆栈段DB100DUP(0)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVDX,DATAMOVDS,DXMOVBH,'9';用来存最小值的寄存器,并初始化为最大的二位数99MOVBL,'9'MOVAH,09HMOVDX,SEGSTRING2MOVDS,DXMOVDX,OFFSETSTRING2INT21HSHURU:INPUT;开始输入数据CMPAL,20H;将输入的第一个数与空格进行比较JZSHURU;是空格则继续进行输入CMPAL,0DH;将输入的数据与回车进行比较,若输入回车则输入结束JZEXITJUDGE;判定数据是否合法CALLSHIBIWRONG:CALLNOTOK;输入不合法,报警且再次输入数据JMPSHURUEXIT:XIANSHI0DH,0AH;输入结束,打印出最小值的结果MOVAH,09HMOVDX,SEGSTRINGMOVDS,DXMOVDX,OFFSETSTRINGINT21HXIANSHIBH,BLJMPENDDOSENDDOS:MOVAX,4C00H;返回DOSINT21HNOTOKPROC;打印输出数据不合法并且返回SHURU进行重新输入的子程序MOVAH,09HMOVDX,SEGSTRING1MOVDS,DXMOVDX,OFFSETSTRING1INT21HMOVAH,09HMOVDX,SEGSTRING3MOVDS,DXMOVDX,OFFSETSTRING3INT21HRETNOTOKENDPSHIBIPROC;比较部分子程序CMPAL,BH;将输入的十位与BH中的十位进行比较JNANEXTJIXU:INPUT;比BH大,则说明输入不是最小数,继续输入JMPSHURUNEXT:JZXIANG;判断输入的十位与寄存器中的十位是否相等MOVBH,AL;更新寄存器中的最小值INPUTJUDGEMOVBL,ALJMPSHURUXIANG:INPUT;再输入第二位进行比较,若更小JUDGECMPAL,BLJASHURUMOVBL,AL;更新寄存器中的最小值JMPSHURURETSHIBIENDPCODEENDSENDSTART3.模块层次图4.实验结果分析在我的程序设计中,以空格为数据的分隔符,以回车为结束符。输入回车后会在屏幕上打印最小值的结果。在输入中如果输入的数据不恰当,会有提示说明输入不合法,并且支持再次输入,其结果图如下。说明:空格分隔符,回车为输入完毕确认,当输入不合法字符使,提示输出不正确,并可以继续输入,跟之前输入的数据进行比较。经过观察后发现,结果完全正确,说明了程序的正确性。五.实验总结这次实验学习并运用了子程序进行程序设计。子程序设计的最重要的地方在于入口参数、出口参数的设计与主程序之间的关系。还有子程序功能之前应该保护现场。本实验主要将子主程序输入模块比较模块输出模块报错模块程序设计在从键盘输入数字的功能,并设置标志,用于主程序确认输入是否正确。我在这次实验中由于刚开始写时对子程序的设计理解还不够到位因此遇到了不少困难,主要在于对子程序的调用位置以及怎样从一连串数据输入中找到最小数。后来查阅了不少资料后意识到了只需要在寄存器中存一个最小值,并初始化为最大值99,然后再输入时反复将寄存器中的值与输入的值进行比较即可并更新寄存器中的数据即可,最后在利用09H中断打印出来就可完成这一实验。总而言之,这个实验看似简单但是却是很多汇编编程的基础,学会了子程序的编写和调用对今后的编程大有裨益。实验四子程序设计一.实验目的:1.进一步掌握子程序设计方法;2.进一步掌握基本的DOS功能调用.二.实验内容:1.从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入.2.统计检查每个学生的名次.3.将统计结果在屏幕上显示.4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜.输出应便于阅读.尽可能考虑美观.5.输入要有检错手段.三.预习题:1.如何确定一个学生在这门科目中的名次?答:其实确定学生在该科目中的名次方法有很多,基本的思路是用一个足够的变量区域存下输入的学生数据信息,然后在对这些数据进行比较。比较的方法很多,最容易想到的有冒泡排序等,然后最方便的是在记下同学的学号后,依此找出成绩的最大值,往复进行,也可起到排名的作用。我在这里用到的是与上一个实验类似的思路,每一次寻找成绩中的最小值,再将他的学号和成绩依此压入栈,最后输出时再依此出栈,正好起到了排名的作用。2.你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单?答:在汇编语言中使用排序的各种方法其实都很不方便
本文标题:北邮微机原理软件实验报告
链接地址:https://www.777doc.com/doc-3170523 .html