您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 北邮微机原理软件实验
实验二分支、循环程序设计一、实验目的1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的DOS功能调用。二、实验任务及内容1.安排一个数据区,内存有若干个正数,负数和零。每类数的个数都不超过9。2.编写一个程序统计数据区中正数,负数和零的个数。3.将统计结果在屏幕上显示。三、回答预习题1.十进制数0--9所对应的ASCII码是什么?如何将十进制数0--9在屏幕上显示出来?(1)十进制数0到9对应ASCII码是30H到39H.(2)将十进制数加30H,然后赋值给DL,然后执行2号DOS功能调用.2.如何检验一个数为正,为负或为零?你能举出多少种不同的方法?(1)CMPOPRD,0,若为正数则可通过JG跳转;若为0可通过JZ跳转;若为负数可通过JL跳转。(2)SUBOPRD,0.然后根据标志寄存器的状态来判断正负零.若ZF=1,则为零.若SF=1,则为负数.若SF=0,则为正数四、程序流程图五、源程序PRINTSTRMACROSTR;打印输出字符串MOVAH,9MOVDX,SEGSTRMOVDS,DXMOVDX,OFFSETSTRINT21H是否为偶数结束负数个数+1是否为偶数正奇数个数+1正偶数个数+1正数个数+1负奇数个数+1负偶数个数+1大于0开始等于0零个数+1循环是否结束指向下一个数据是否是是否否是否ENDMPRINTNUMMACRONUM;打印输出单个数字MOVAH,2MOVDL,NUMADDDL,30HINT21HENDMDATASEGMENTNUMDB-1,2,4,2,-3,0,3,7,-2;待判定的数据COUNTEQU$-NUM;统计数据个数ZERODB0;统计数目的变量PLUSDB0MIMUSDB0PODDDB0PEVENDB0MODDDB0MEVENDB0ZEROSDB0DH,0AH,'ZERO:$';结果显示字符串PLUSSDB0DH,0AH,'+:$'MIMUSSDB0DH,0AH,'-:$'PODDSDB0DH,0AH,'+ODD:$'PEVENSDB0DH,0AH,'+EVEN:$'MODDSDB0DH,0AH,'-ODD:$'MEVENSDB0DH,0AH,'-EVEN:$'DATAENDSSTACKSEGMENTSTACK'STACK'STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTAR:MOVAX,DATAMOVDS,AXMOVSI,OFFSETNUM;NUM偏移地址给SIMOVCX,COUNT;统计数字的个数LOOP1:CMPBYTEPTR[SI],0;[si]所指的字节单元JGBIGGER;大于零跳转JZEQUAL;等于零跳转INCMIMUS;统计负数个数+1ANDBYTEPTR[SI],01H;判定为偶数奇数JZMIMUSE;负偶数跳转INCMODD;统计负奇数+1JMPLOOP2MIMUSE:INCMEVEN;统计负偶数+1JMPLOOP2BIGGER:INCPLUS;统计正数+1ANDBYTEPTR[SI],01H;判定偶数奇数JZBIGEVEN;正偶数跳转INCPODD;统计正奇数+1JMPLOOP2BIGEVEN:INCPEVEN;统计正偶数+1JMPLOOP2EQUAL:INCZERO;统计零+1LOOP2:INCSI;指向下一个数LOOPLOOP1;继续循环EXIT:PRINTSTRZEROS;结果显示PRINTNUMZEROPRINTSTRPLUSSPRINTNUMPLUSPRINTSTRPODDSPRINTNUMPODDPRINTSTRPEVENSPRINTNUMPEVENPRINTSTRMIMUSSPRINTNUMMIMUSPRINTSTRMODDSPRINTNUMMODDPRINTSTRMEVENSPRINTNUMMEVENMOVAH,4CHINT21HCODEENDSENDSTAR六、程序运行结果数据为-1,2,4,2,-3,0,3,7,-2。程序运行结果如下:七、实验总结、建议要求、心得体会经过这次实验,我独立进行了汇编语言程序设计。我掌握了基本分支,循环程序设计;熟悉了DOC功能调用输出字符串和单个字符的方法,了解了十进制0-9对应的ASCII码.掌握了宏的定义和使用方法.第一次进行汇编程序设计,我遇到的问题主要是不懂的怎么输出显示。比如换行回车怎么表示等。经过查找资料,我仔细看了ASCII码表,记住了一些常用的ASCII码.另外一个收获就是怎么判断正负零,并进行跳转.程序中我用了CMPOPRD,0来判断正负零,然后用JG,JL,JZ来跳转.总之这次实验让我熟悉了汇编编程,为下面的实验做好了准备实验三代码转换程序设计一、实验目的1.掌握几种最基本的代码转换方法;2.运用子程序进行程序设计。二、实验任务及内容1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来。2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明。3.对输入要有检错措施,以防止非法字符输入,并有适当的提示。4.将整个程序分解为若干模块,分别用子程序实现。在报告中要给出模块层次图。三、预习题1.如何将输入的两个字符(0–9)变为十进制或二进制数?输入的字符为ASCII码,将两个字符分别减30H,则分别得到实际的十位数的值,和个位数的值.它们分别占用一个字节的储存单元.2.如何将选出的最小值(二进制或十进制)变为ASCII码再进行显示?输入的字符是ASCII,范围在30H到39H.它们的大小顺序和十进制数0到9的顺序是一样的.我们可以直接用ASCII码进行比较,分别比较十位数和个位数.将比较结果ASCII码直接输出.不用转换为十进制或者二进制数.3.你觉得采用二进制运算还是十进制运算更适合于这个实验?我觉得直接用ASCII码进行比较更加方便,因为键盘输入的时候是ASCII码.输出显示的时候还是要用ASCII码.而且ASCII中0到9的大小顺序和十进制数0到9的顺序是一样,可以进行十位数和个位数的分别比较。四、分隔符结束符说明在本程序中,以“,”为两位十进制数的分隔符,“.”为输入结束标志五、层次模块图六、程序流程图子程序:显示结果子程序:检错主程序子程序:查找最小值输入成绩七、源程序PRINTSTRMACROSTR;打印输出字符串结束输入分隔符开始输入十位数输入个位数是否在1~9之间调用子程序找最小值输出最小值是否在1~9之间输出错误提示是否为‘。’是否为‘,’是是是否是否否否MOVAH,9MOVDX,SEGSTRMOVDS,DXMOVDX,OFFSETSTRINT21HENDMDATASEGMENTNUMDB40DUP(?),'$';存放输入的数字EERORSDB0DH,0AH,'EEROR!!!INPUTAGAIN:',0DH,0AH,'$';错误提示字符串MINSDB0DH,0AH,'MINNUMBERIS:','$';最小值提示字符串DATAENDSSTACKSEGMENTSTACK'STACK'STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTAR:MOVAX,DATAMOVDS,AXMOVSI,OFFSETNUM;NUM的偏移地址给SIMOVCX,0;统计两位数的个数PUTNUM:MOVAH,1;输入十位数INT21HCMPAL,30HJLERROR;小于30h,错误CMPAL,3AHJGERROR;大于3Ah,错误MOVBYTEPTR[SI],AL;写入十位数INCSI;指向下一个地址MOVAH,1;输入个位数INT21HCMPAL,30HJLERROR;小于30h,出错CMPAL,3AHJGERROR;大于3Ah,出错MOVBYTEPTR[SI],AL;写入个位数INCSI;指向下一个地址INCCX;输入两位数的个数+1MOVAH,1;输入分隔符INT21HCMPAL,',';如果是’,’,则继续输入JZPUTNUMCMPAL,'.';如果是’.’,则结束输入JZEXITJMPERROR;其他情况,则输出错误ERROR:PRINTSTREERORS;输出错误提示MOVSI,OFFSETNUM;SI重新指向NUMMOVCX,0;CX置零JMPPUTNUMEXIT:CALLGETMIN;调用子程序找最小值PRINTSTRMINS;输出提示字符串MOVAH,02HMOVDL,BH;显示十位数INT21HMOVAH,02HMOVDL,BL;显示个位数INT21HMOVAH,4CHINT21HGETMINPROCMOVSI,OFFSETNUM;SI指向NUM偏移地址MOVBH,[SI];十位数MOVBL,[SI+1];个位数LOOP0:CMPBH,[SI];比较十位数JBLOOP1;小于的话,跳转JZSHIEQ;等于的话,跳转MOVBH,[SI];将小的数给BXMOVBL,[SI+1]JMPLOOP1SHIEQ:CMPBL,[SI+1];比较个位数JBELOOP1MOVBL,[SI+1];将小的数给BXLOOP1:ADDSI,2;指向下一个两位数DECCX;个数-1CMPCX,0JNELOOP0RETGETMINENDPCODEENDSENDSTAR八、程序运行结果以逗号’,’为间隔符,以句号’.’结束符每输入2个数字字符,就输入一个逗号,表示继续,或者句号表示结束.其他情况一律报错九、实验总结、建议要求、心得体会这次实验的关键是检错模块和查找最小值模块。关于检错模块,我的设计是每输入一个字符,就进行一次检错判断。第一个输入的字符表示十位数,其ASCII码值应该在30H和39H之间,其他输入一律报错。第二个输入的字符表示个位数,ASCII码应该在30H和39H之间。其他输入一律报错。第三个输入的字符是分隔符或者结束符,如果输入是’,’,则继续输入,如果输入是’.’,则结束输入。其他情况一律报错。每输入3个字符,则CX+1,进行统计输入数据个数。关于查找最小值模块,我的设计是直接用ASCII码进行比较。首先将第一个数赋值给MIN,然后MIN分别和后面的数比较。先比较代表十位数的ASCII码值,再比较代表个位数的ASCII码值,通过判断将小的数赋值给MIN。通过子程序的设计和调用,让整个程序的编写变的简单。特别是调试程序时候,能知道问题具体出在那个子程序里面,是输入模块错了,还是查找最小值模块错了。总之通过使用子程序让整个程序的编写变的更加有效率。这次实验需要改进的地方,我认为应该在子程序里面进行现场保护。因为子程序比较简单,真不知道该保护什么寄存器。不过在下面的实验四中,一开始没保护好子程序现场,让我吃了一点苦头。我得到教训是,子程序的保护现场是很重要的。实验四子程序设计一、实验目的1.进一步掌握子程序设计方法;2.进一步掌握基本的DOS功能调用。二、实验任务及内容1.从键盘上输入某班学生的某科目成绩,输入按学生的学号由小到大的顺序输入。2.统计检查每个学生的名次。3.将统计结果在屏幕上显示。4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜。输出应便于阅读。尽可能考虑美观。5.输入要有检错手段。三、预习题1.如何确定一个学生在这门科目中的名次?对学生的成绩进行从大到小的排序,就能确定学生在这门科目的名次2.你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单?在排序算法中,有冒泡排序,有快速排序.不过因为在实验三中我已经编写了查找最小值的程序.我打算修改这个程序,让它查找最大值,然后循环调用这个程序,每次找出一个最大值.循环的次数为学生个数.这样就完成了排序的任务了.3.模块层次图。4.输出显示的形式。排名学号成绩1XXXX2XXXX3XXXX4XXXX5XXXX子程序:显示结果子程序:检错主程序子程序:对成绩进行排序输入成绩四、分隔符结束符说明在本程序中,以“,”为两位十进制数的分隔符,“.”为输入结束标志五、程序流程图结束开始输入分隔符输入十位数输入个位数是否在1~9之间?调用子程序找最大值输
本文标题:北邮微机原理软件实验
链接地址:https://www.777doc.com/doc-3170521 .html