北邮微机原理软件实验报告

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

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

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

资源描述

微机原理软件实验报告实验二分支、循环程序设计一.实验目的1.开始独立进行汇编语言程序设计。2.掌握基本分支,循环程序设计。3.掌握最简单的DOS功能调用。二.实验内容1.安排一个数据区,内存有若干个正数,负数和零。每类数的个数都不超过9。2.编写一个程序统计数据区中正数,负数和零的个数。3.将统计结果在屏幕上显示。三.流程图10开始DS,SS,CX,BX初始化与0相比Z=Z+1BX=BX+2结束数送入AX结果小于0NYB=B+1A=A+1CX=0Y显示数据N四.源代码DATASEGMENTZDW0;数据中0的个数ADW0;数据中大于0的个数BDW0;数据中小于0的个数NUMDW9,8,0,-7,6,-5,-4,3,2,-1,0,-8,-1,9,0,0,1;设定的一组数据,其中4个0,7个正数,6个负数,符合题目要求NDW($-NUM)/2;该组数据的个数TYPE0DB0DH,0AH,'Numberofzeros:$'TYPE1DB0DH,0AH,'Numberofgreaterthan0:$'TYPE2DB0DH,0AH,'Numberoflessthan0:$'LOCATEDWTYPE0,TYPE1,TYPE2DATAENDSSTACKSEGMENTSTACKDW128DUP(?)STACKENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVAX,STACKMOVSS,AX;初始化DS、SS指向STAMOVBX,OFFSETNUM;将NUM中第一个数字的地址送入BXMOVCX,N;将N中数字个数送入CXLOOP1:MOVAX,[BX];取出NUM中的第一个数字CMPAX,0;与零相比JZIFZ;判断结果为是0,跳转到IFZ处继续执行SALAX,1JCIFL;判断结果是小于0,跳转到IFLINCWORDPTRA;否则,A自加,然后继续执行程序JMPCONTINUEIFL:INCWORDPTRB;B计数加1JMPCONTINUEIFZ:INCZ;Z计数加1CONTINUE:ADDBX,2;指针+2,继续送入下一数字LOOPLOOP1;循环CX次判断MOVCX,3;共显示3个字符串XORBX,BXDISP:MOVDX,LOCATE[BX]MOVAH,09H;DOS09号功能调用,显示字符串INT21HMOVDX,Z[BX]ADDDX,'0';转换为ASCII码MOVAH,02H;DOS02号功能调用,显示字符INT21HADDBX,2;指针+2(DW)LOOPDISPMOVAX,4C00HINT21H;返回DOS系统CODEENDSENDSTART五.运行结果六.预习题1.十进制数0--9所对应的ASCII码是什么?如何将十进制数0--9在屏幕上显示出来?答:0—9的ASCII码值依次为:30H,31H,32H,33H,34H,35H,36H,37H,38H,39H。用待显示数加30H即可得到对应ASCII码,将待显示数的ASCII码值赋给DX,使用“INT21H”02号DOS功能调用显示字符。2.如何检验一个数为正,为负或为零?你能举出多少种不同的方法?答:方法1:用test指令检查该数最高位。若为0,则为正数。否则,检测其余位判断为负数或0。方法2:用cmp指令将该数与0相比,判断标志寄存器。SF⊕OF=0,为正数或0。否则为负数。实验三代码转换程序设计一.实验目的1.掌握几种最基本的代码转换方法。2.运用子程序进行程序设计。二.实验内容1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来。2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明。3.对输入要有检错措施,以防止非法字符输入,并有适当的提示。4.将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图。三.模块层次图及流程图START输入数据排序,显示检错存储并显示十进制转换排序显示输入数据开始检错错对B,BX,AL初始化BX指向的数与B比较小于大于比较结束AL中ASCII码值转换为NY此数赋值给B输出最小数结束回车YNBX=BX+1四.源代码DATASEGMENTADB100DUP(0)BDB100,0,'$'STRINGDB0DH,0AH,'ERRORINPUT',0DH,0AH,'$'STRING1DB0DH,0AH,'theminnumberis',0DH,0AH,'$'DATAENDSSTACKSEGMENTSTACKDW50DUP(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKINPUTPROC;子程序PUSHAX;保护寄存器内容PUSHBX;保护寄存器内容PUSHCX;保护寄存器内容PUSHDX;保护寄存器内容STAR:MOVCX,0;开始,表示输入的数是否可以构成两位十进制数MOVBX,OFFSETAAGAIN:MOVAH,01H;输入INT21HCMPAL,30H;比较是否合法JBSHOWCMPAL,39HJASHOWMOV[BX],AL;存储,判断是否一个字,不是继续输入,否则向下运行INCBXINCCXANDCX,1JNZAGAIN;CX若为0,输入了两个数,可以构成一个两位十进制数MOVCX,0;判断下一输入字符MOVAH,01H;输入INT21HMOV[BX],ALINCBXCMPAL,20H;判断是否空格:是,继续输入;否,判断是否为回车JZAGAINCMPAL,0DH;判断是否为回车JNZSHOW;都不是,就输入错误,重新输入JMPOKEY;是回车,就输入结束。否则结束子程序调用SHOW:MOVAH,09H;不合法显示错误重新输入MOVDX,OFFSETSTRINGINT21HJMPSTAROKEY:MOV[BX],AL;输入结束POPDXPOPCXPOPBXPOPAXRETINPUTENDPCHANGEPROCPUSHAXPUSHBXPUSHDXMOVBX,OFFSETAONCE:MOVAL,[BX];读数SUBAL,30H;转化为16进制数INCBXMOVDL,10;转化为16进制数MULDLMOVDH,[BX]SUBDH,30HINCBXADDAL,DH;结果CMPAL,B;比较哪个最小JBYESCMPBYTEPTR[BX],0DH;判断是否是回车JZLASTJMPONCEYES:MOVB,AL;最小数存于BCMPBYTEPTR[BX],0DHJZLASTINCBXJMPONCELAST:NOPMOVAL,B;将数的个位和十位分别存储AH存个位AL存十位MOVAH,0MOVDL,10DIVDLADDAH,30H;转换为ASCII码ADDAL,30HMOVB,AL;存到内存中MOVB+1,AHPOPDX;pop出原保存的寄存器数据POPBXPOPAXRETCHANGEENDPSTARTPROCFAR;主程序MOVAX,DATAMOVDS,AXCALLINPUT;调用输入子程序MOVAH,09HMOVDX,OFFSETSTRING1;显示提示性语句INT21HCALLCHANGE;调用比较子程序MOVAH,09HMOVDX,OFFSETB;显示最小数INT21HMOVAX,4C00HINT21HSTARTENDPCODEENDSENDSTART五.运行结果六.预习题1.如何将输入的两个字符(0--9)变为十进制或二进制数?答:将数的ASCII码值减去30H,即可得到对应的十进制数。2.如何将选出的最小值(二进制或十进制)变为ASCII码再进行显示?答:用DB定义一个字节型数据存放十进制数(高四位表示十位,低四位表示个位)。使用cmp指令,先比较高四位,若小于,则和已存的数交换;若等于,则继续比较低四位,小于则交换。若等于,数不变。3.你觉得采用二进制运算还是十进制运算更适合于这个实验?答:十进制更合适。实验四子程序设计一.实验目的1.进一步掌握子程序设计方法。2.进一步掌握基本的DOS功能调用。二.实验内容1.从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入2.统计检查每个学生的名次。3.将统计结果在屏幕上显示。4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜.输出应便于阅读.尽可能考虑美观。5.输入要有检错手段。三.流程图四.源代码检错开始初始化界面输入成绩调用排序子程序显示结果falsetrue结束DATASEGMENTBUFFERDB100DB?DB10DUP(?)STR1DB'pleaseinputthescoreofthestudents:',0DH,0AH,'$'STR2DB'error,pleaseinputthescoreagain:',0DH,0AH,'$'STR3DB'numrankscor',0DH,0AH,'$';提示语句的字符串VAR1DW?VAR2DW?CKDB?TABDB100DUP(?)DATAENDSSTACKSEGMENTSTACK'stack'DB100DUP('s')STACKENDSCODESEGMENTPARA'code'ASSUMECS:CODE,DS:DATA,SS:STACKSTARTPROCFARPUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AX;初始化DSLEADX,STR1MOVAH,09H;调用DOS09号功能显示字符串STR1INT21HINPUT:LEADX,BUFFERMOVAH,0AH;调用DOS0A号功能,从键盘输入字符串并存储INT21HLEADI,TABXORCX,CXMOVAH,30HMOVDH,31HLEABX,BUFFER+2CALLCHECK;调用检错子程序CMPCK,1JZINPUTCALLCOM;调用排序子程序MOVDL,0DHMOVAH,02H;调用DOS02号功能,显示DL字符INT21HMOVDL,0AHMOVAH,02HINT21HLEADX,STR3;调用DOS09号功能,显示字符串STR3MOVAH,09HINT21HCALLDISPY;调用送显程序RETSTARTENDPCHECKPROC;检验子程序NEXT1:MOVCK,0MOV[DI],AHINCDIMOV[DI],DHINCDICMPDH,39HJZL1INCDHJMPL2L1:MOVDH,30HINCAHL2:MOVAL,[BX]CMPAL,30HJBERRORCMPAL,39HJAERRORMOV[DI],ALINCDIINCBXMOVAL,[BX]CMPAL,30HJBERRORCMPAL,39HJAERRORMOV[DI],ALINCDIINCBXINCCXMOVAL,[BX]CMPAL,0DHJZFINISH1INCBXJMPNEXT1ERROR:LEADX,STR2;调用DOS09号功能,显示字符串STR2MOVAH,9INT21HMOVCK,1FINISH1:RETCHECKENDPCOMPROC;调用排序子程序COMP1:PUSHCXMOVVAR1,CXSHLCX,1SHLCX,1SUBCX,4MOVVAR2,CXPOPCXDECDIDECDIJMPCOTICOMP2:ADDDI,VAR2COTI:MOVBL,0MOVCX,VAR1DECCXAGAN:MOVAL,[DI]CMPAL,[DI-4]JAGOON1JBGOON3INCDIMOVAL,[DI]CMPAL,[DI-4]PUSHFDECDIPOPFJAGOON1JBEGOON3GOON1:MOVBL,-1PUSHCXMOVCX,4DECDIDECDIGOON2:MOVAL,[DI]XCHGAL,[DI-4]MOV[DI],ALINCDILOOPGOON2POPCXDECDIDECDIGOON3:DECDIDECDIDECDIDECDILOOPAGANCMPBL,0JNZCOMP2DECDIDECDIMOVCX,VAR1MOVBH,30HMOVBL,31

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

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

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

×
保存成功