北京邮电大学微机原理与接口技术软件件实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

微机原理软件实验·报告信息与通信工程学院微机原理软件实验报告班级:学号:姓名:序号:时间:2015-11-6——2015-11-29实验二分支,循环程序设计一、实验目的:微机原理软件实验·报告1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的DOS功能调用.二、实验内容:1.安排一个数据区(数据段),内存有若干个正数,负数和零.每类数的个数都不超过9。2.编写一个程序统计数据区中正数,负数和零的个数。3.将统计结果在屏幕上显示。4.(选做)统计出正奇数,正偶数,负奇数,负偶数以及零的个数。三、预习题:1、十进制数0--9所对应的ASCII码是什么?如何将十进制数0--9在屏幕上显示出来?答:十进制数0——9对应的二进制数为30H——39H。要屏显0-9的数码,只需将AH置成02H(DOS功能调用),然后将要显示的数码的ASCII码存进DL里,然后执行INT21H就可以打印字符。或者,若这些数码是以字符串的格式存储,则可以将AH置成09H,(最后以’$’字符结束,)然后将串首地址传给DS,然后执行INT21H就可以打印字符串。2、如何检验一个数为正,为负或为零?你能举出多少种不同的方法?答:可以将待检验数与0比较(使用CMP指令后用JZ指令判断ZF是否为零),也可以将待检验数与80H相与,判断ZF的值。二是和0相比是否相等,然后用该数(假设为8位)和10000000相与,取出符号位判断,可区分正负。本次试验中我使用的方法是与0比较,所有判决方法的核心思想要么是直接和0相比,要么使用逻辑或移位运算,取出符号进行判断。四、实验过程:流程图:定义数据段,将所需判别数据存入数据段,定义输出字符微机原理软件实验·报告是否大于0小于0等于0CX是否为0BX中的数与1相与,结果加到负偶数中负数个数加1正数个数加1CX=CX-10个数加1统计输出正数、负数、零,正负偶数,计算正负奇数输出结果结束BX中的数与1相与,结果加到正偶数中BX中的数和0比较微机原理软件实验·报告代码:DATASEGMENT;数据段BUFFDW4,0,37,99,-9,-2,-87,0,76,11,0,-34,-11,0,22;待判断数据COUNTEQU$-BUFF;COUNT的值为BUFF所占的字节数POSIDB?;正数ZERODB?;负数NEGTDB?;0POSIEVENDB0;正偶数POSIODDDB?;正奇数NEGTEVENDB0;负偶数NEGTODDDB?;负奇数POSICHARDB'Positive:$';用于打印提示的字符串定义NEGTCHARDB'Negtive:$'ZEROCHARDB'Zero:$'EVENCHARDB'Even:$'ODDCHARDB'Odd:$'CRDB0DH,0AH,'$';回车换行的ASCII码DATAENDSSTACKSEGMENTSTACK'STACK';堆栈段DB100DUP(?)STACKENDSCODESEGMENT;代码段ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKBEGIN:PUSHDSXORAX,AXPUSHAX;返回DOSMOVAX,DATA微机原理软件实验·报告MOVDS,AX;给DS真正赋值MOVCX,COUNTSHRCX,1;相当于除2,正好为BUFF中的数据个数MOVDX,0;设定初值:DH及DL分别为等于、大于零的个数MOVAH,0;设定初值:AH为小于零的个数LEABX,BUFF;把BUFF中的第一个数存到BXAGAIN:CMPWORDPTR[BX],0;BUFF中的第一个数与0进行比较JGEPOSITIVE;大于等于0时转POSITIVEINCAH;统计小于零的个数ADDWORDPTR[BX],1ANDNEGTEVEN,[BX];和1与之后的结果加到负偶数中JMPNEXTPOSITIVE:JZZERO;等于0时转ZEROINCDL;统计大于零的个数ADDWORDPTR[BX],1ANDPOSIEVEN,[BX];和1与之后的结果加到正偶数中JMPNEXTZERO:INCDH;统计等于零的个数NEXTINCBX;修改地址指针INCBXLOOPAGAIN;循环判断CX不为0MOVPOSI,DL;保存结果,正数MOVZERO,DH;0MOVNEGT,AH;负数MOVAH,POSIMOVAL,POSIEVENSUBAH,AL;计算正奇数个数MOVPOSIODD,AH微机原理软件实验·报告MOVAH,NEGTMOVAL,NEGTEVENSUBAH,ALMOVNEGTODD,AH;计算负奇数个数PRINT:;打印正数提示符和正数(奇偶)个数MOVAH,09HMOVDX,OFFSETPOSICHARINT21HMOVAH,02HMOVDL,POSIADDDL,30HINT21HMOVAH,09HMOVDX,OFFSETEVENCHARINT21HMOVAH,02HMOVDL,POSIEVENADDDL,30HINT21HMOVAH,09HMOVDX,OFFSETODDCHARINT21HMOVAH,02HMOVDL,POSIODDADDDL,30HINT21HMOVDX,OFFSETCRMOVAH,09H微机原理软件实验·报告INT21H;打印负数提示符和负数(奇偶)个数MOVAH,09HMOVDX,OFFSETNEGTCHARINT21HMOVAH,02HMOVDL,NEGTADDDL,30HINT21HMOVAH,09HMOVDX,OFFSETEVENCHARINT21HMOVAH,02HMOVDL,NEGTEVENADDDL,30HINT21HMOVAH,09HMOVDX,OFFSETODDCHARINT21HMOVAH,02HMOVDL,NEGTODDADDDL,30HINT21HMOVDX,OFFSETCRMOVAH,09HINT21HMOVAH,09HMOVDX,OFFSETZEROCHAR微机原理软件实验·报告INT21HMOVAH,02HMOVDL,ZEROADDDL,30HINT21HCODEENDSENDBEGIN;代码段结束结果分析:数据区待统计的数据为:4,0,37,99,-9,-2,-87,0,76,11,0,-34,-11,0,22实验结果如下图所示:本实验意在练习基本的分支、循环结构。关键的点在于和0比较,区分正负和零,然后在正数和负数中判断奇偶,这里巧妙地使用了和1与之后结果加和到偶数中,最后利用统计的数的个数减去偶数得奇数的方法。使得程序更加流畅和简洁,思路也更清晰。五、实验总结汇编程序同高级语言一样,在写代码前都要对实验做分析,设计好思路,这样写代码时思路才比较清晰,代码也比较容易写和查找错误。此次实验主要是循环和分支,也是用汇编语言编写的第一个程序,让我熟悉了汇编语言的基本写法,对很多理论课学到的知识都有了更深的了解。了解了怎样利用判别条件在不同的分支中跳转,循环的判别及循环过程。总而言之,此次实验收获还是很多的,不仅加深了对这两种结构的了解,提升了自己设计程序的能力,并且也提升了自己排除bug的能力,进一步熟悉了第一个实验的整个流程。实验三代码转换程序设计微机原理软件实验·报告一、实验目的:1.掌握几种最基本的代码转换方法;2.运用子程序进行程序设计.二、实验内容:1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来.2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明.3.对输入要有检错措施,以防止非法字符输入,并有适当的提示.4.将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图.三、预习题:1.如何将输入的两个字符(0--9)变为十进制或二进制数?答:两字符减去0的ASCII码(30H)后,高位数乘以十加上低位数,即变为十进制数。2.如何将选出的最小值(二进制或十进制)变为ASCII码再进行显示?答:本次实验是直接读入并存储数字的ASCII码,比较其大小,然后直接输出ASCII码。3.你觉得采用二进制运算还是十进制运算更适合于这个实验?答:相比二进制,采用十进制运算更简洁,但需要和ASCII码进行转换。可直接使用数字对应的ASCII比较,分别比较十位和个位,最后直接输出字符即可。四、实验过程:模块层次图:流程图:主程序BEGIN读取输入子程序找出最小数据子程序输出打印子程序微机原理软件实验·报告代码:DATASEGMENT;数据段INPUTDB100DUP(?)MINTMPDB'9'-30H,'9'-30H;置最小值的初始值为99COUNTDB0DIFERRORDB0D;用于判断调用输入子程序是否有错WELCOMEDB'Pleaseinputnumbers:','$';提示信息字符串OUTTIPDB'Minimumis:','$'CRDB0DH,0AH,'$';回车换行ERROR1DB'ERROR:Characterisnotvalid!','$';各种错误输入提示ERROR2DB'ERROR:Numbermustcontainstwodigits!','$'ERROR3DB'ERROR:Numberisempty!','$'ERROR4DB'ERROR:Needseparatechar!','$'DATAENDS微机原理软件实验·报告STACKSEGMENTSTACK'STACK';堆栈段DB100DUP(?)STACKENDSCODESEGMENT;代码段ASSUMECS:CODE,DS:DATA,SS:STACK,ES:DATABEGINPROCFARPUSHDS;返回DOSXORAX,AXPUSHAXMOVAX,DATA;真正给DS赋值MOVDS,AXMOVDX,OFFSETWELCOME;调用欢迎提示CALLPRINT;调用子程序MOVDX,OFFSETCR;回车换行CALLPRINTCALLMAIN;获取用户输入CMPIFERROR,0;判断输入过程是否有错JNZBACK;错误则直接返回DOSMOVDX,OFFSETCR;回车换行CALLPRINTCALLFINDMIN;查找最小数MOVDX,OFFSETOUTTIP;调用输出提示CALLPRINTMOVAH,02HMOVDL,MINTMP;输出最小值的十位ADDDL,30HINT21H微机原理软件实验·报告MOVAH,02HMOVDL,MINTMP[1];输出最小值的个位ADDDL,30HINT21HBEGINENDP;获取输入,出口参数为IFERROR,表示是否有错MAINPROCPUSHAX;保存现场PUSHBXPUSHCXPUSHDXPUSHDIMOVDI,0;数组偏移地址MOVCX,0;标识数字的位数GETLOOP:MOVAH,01H;从键盘读取一个字符INT21HCMPAL,0DH;和回车比较JEEXIT1;是回车则结束输入CMPCX,0;数字位数为空JECMPSPACE0CMPCX,1;数字位数为1JECMPSPACE1CMPCX,2;数字位数为2JECMPSPACE2CMPSPACE0:CMPAL,20HJEGETLOOP;数字位数为0且输入空格则忽略,继续输入JMPASCBIN;不是空格就读取该字符微机原理软件实验·报告CMPSPACE1:CMPAL,20HJEERR2;数字位数为1且输入空格则位数不是两位数出错JMPASCBIN;否则读取该字符CMPSPACE2:CMPAL,20HJNEERR4;数字位数为2后,不输入空格则分隔符错误XORCX,CX;输入空格则清零重新计数JMPGETLOOPASCBIN:SUBAL,30H;化为二进制数字JLERR1;小于则无效字符CMPAL,9;和9比较JGERR1;大于9则是无效字符MOVINPUT[DI],AL;保存输入的数INCCOUNT;统计输入的数字个数,为判断是否输入为两位数INCDI;向后移动数组INCCXJMPGETLOOPERR1:MOVIFERROR,1;输出错误1MOVDX,OFFSETERROR

1 / 37
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功