实验一:简单程序设计实验(1)编写一个32位无符号数除法的程序,要求将存放在NUM1中的32位无符号数与存放在NUM2中的16位无符号数相除,结果存放在NUM3和NUM4中。程序流程图略。参考源程序:DATASEGMENTNUM1DD2A8B7654HNUM2DW5ABCHNUM3DW?NUM4DW?DATAENDSCODESEGMENTASSUMEDS:DATA,CS:CODESTART:MOVAX,DATA;数据段寄存器初始化MOVDS,AXMOVAX,WORDPTRNUM1MOVDX,WORDPTRNUM1+2DIVNUM2MOVNUM3,AXMOVNUM4,DXMOVAH,4CH;正常返回DOS系统INT21HCODEENDSENDSTART(2)编写一个拆字程序。要求将存放在ARY单元的2位十六进制数X1X2拆为X1和X2两部分,并以0X1和0X2的形式分别存入ARY+1和ARY+2单元中。程序流程图略。参考源程序:DATASEGMENTARYDB2AH,?,?DATAENDSCODESEGMENTASSUMEDS:DATA,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVSI,OFFSETARY;取ARY的偏移地址MOVAL,[SI];取16进制数至ALMOVBL,ALANDAL,0F0H;取16进制数的高四位,即X1SHRAL,4MOV[SI+1],AL;存0X1MOVAL,BLANDAL,0FH;取16进制数的低四位,即X2MOV[SI+2],AL;存0X2MOVAH,4CHINT21HCODEENDSENDSTART实验二:分支程序设计实验(1)编写一个字符比较程序,比较3个无符号字节数A,B,C的大小,并根据比较结果对变量K赋值:如果3个数不相等,则K=0;如果3个数中有两个相等,则K=1;如果3个数都相等,则K=2。程序流程图略。参考源程序:DATASEGMENT;定义待比较数A、B、C,比较结果KADB20HBDB20HCDB20HKDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,ACMPAL,B;对A、B进行比较,不相等则转到COMP2JNECOMP2;相等则比较A、CCMPAL,CJNEK1;A、C不相等则K=1JMPK2;A、C相等则K=2COMP2:MOVBL,BCMPBL,CJEK1;对B、C进行比较,相等则K=1CMPAL,CJEK1;对A、C进行比较,相等则K=1K0:MOVK,0JMPEXITK1:MOVK,1JMPEXITK2:MOVK,2EXIT:MOVAH,4CHINT21HCODEENDSENDSTART(2)编写一个能实现下列表达式的程序:⎧N=⎨A+BA≤B设A,B,C为小于128的正整数。⎩A−B+C程序流程图略。参考源程序:DATASEGMENTABADB22H;定义A、B、C、NBDB10HCDB01HNDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,ACMPAL,BJGCALCUL;A小于或等于B则N=A+BADDAL,BJMPEXITCALCUL:SUBAL,BADCAL,CEXIT:MOVN,ALMOVAH,4CHINT21HCODEENDSENDSTART实验三循环程序设计实验(1)将字符串STRN(以“$”结尾)中的每一个字符均加上偶校验位,并统计有多少个字符因含有奇数个“1”而加上了校验位。统计结果存于N单元中。程序流程图略。参考源程序:DATASEGMENTSTRNDB'What$';任意定义一个字串,以“$”结尾COUNTEQU$-STRNNDB?BUFDBCOUNTDUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,DATAMOVES,AXLEASI,STRNLEADI,BUFMOVCX,COUNTMOVAL,0LP1:MOVBL,[SI];逐个取字符进行判断ANDBL,BL;自己和自己做与运算JPNEXT;根据PF标志位的变化进行跳转INCALORBL,80HNEXT:MOV[DI],BLINCSIINCDILOOPLP1MOVN,ALMOVAH,4CHINT21HCODEENDSENDSTART(2)在FIRST开始的一片连续的数据区中存放着100个数据,编写一个程序,统计第1个数据‘0’之前的数据个数。程序流程图略。参考源程序:DATASEGMENTFIRSTDB10H,24H,34H,73H,20H,44H,03H,36H,41H;任取9个数做演示COUNTEQU$-FIRSTNUMDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDL,0;计数值初始为0MOVCX,COUNTMOVBX,OFFSETFIRSTLP1:MOVAL,[BX];每次取一个数,与0比较CMPAL,00HJNENEXTJMPEXIT;找到0则退出NEXT:INCDL;没找到0则计数值加1INCBXLOOPLP1EXIT:MOVNUM,DLMOVAH,4CHINT21HCODEENDSENDSTART实验四:子程序设计实验将BUF开始的10个单元中两位十六进制数转换成ASCII码,并在屏幕上显示出来。要求码型转换通过子程序HEXASC实现,参数传送采用寄存器传送方式。程序流程图略。参考源程序:(1)实现方法一:远过程调用DATASEGMENTBUFDB10H,2FH,0D0H,0FEH,33H,0F0H,20H,10H,3DH,0A2HCOUNTEQU$-BUF;定义任意长度的一段BUFDATAENDSSTACK1SEGMENTSTACKDB100DUP(?);设置足够深度的栈区STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AXMOVSI,OFFSETBUFMOVCX,COUNTAGAIN:MOVAL,[SI];逐个取数MOVBL,ALSHRAL,4ANDAL,0FH;先对高字节部分转换(寄存器AL传参)CALLFARPTRHEXASC;调用子程序MOVDL,ALMOVAH,02H;显示高字节部分对应的字符INT21HMOVAL,BLANDAL,0FH;再对低字节部分转换(寄存器AL传参)CALLFARPTRHEXASC;调用子程序MOVDL,ALMOVAH,02H;显示低字节部分对应的字符INT21HMOVDL,20HMOVAH,02H;显示空格INT21HINCSILOOPAGAINMOVAH,4CHINT21HCODEENDSCODEBSEGMENTASSUMECS:CODEBHEXASCPROCFARCMPAL,09H;判断是不是数字JAHEXATOF;是字母则转到HEXATOFADDAL,30H;是数字则对应到数字的ASCII码JMPENDHEXHEXATOF:ADDAL,37H;是字母则对应到字母的ASCII码ENDHEX:RETHEXASCENDPCODEBENDSENDSTART(2)实现方法二:近过程调用DATASEGMENTBUFDB10H,2FH,0D0H,0FEH,33H,0F0H,20H,10H,3DH,0A2HCOUNTEQU$-BUF;定义任意长度的一段BUFDATAENDSSTACK1SEGMENTSTACKDB100DUP(?);设置足够深度的栈区STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AXMOVSI,OFFSETBUFMOVCX,COUNTAGAIN:MOVAL,[SI];逐个取数MOVBL,ALSHRAL,4ANDAL,0FH;先对高字节部分做转换CALLHEXASCMOVDL,AL;显示高字节部分对应的字符MOVAH,02HINT21HMOVAL,BLANDAL,0FH;再对低字节部分做转换CALLHEXASCMOVDL,AL;显示低字节部分对应的字符MOVAH,02HINT21HMOVDL,20H;显示空格MOVAH,02HINT21HINCSI;继续循环或退出LOOPAGAINMOVAH,4CHINT21HHEXASCPROCNEARCMPAL,09HJAHEXATOFADDAL,30HJMPENDHEXHEXATOF:ADDAL,37HENDHEX:RETHEXASCENDPCODEENDSENDSTART实验五:DOS中断调用实验(1)如果从键盘上依次输入的是一个数字和一个字母,则输出“RIGHT”标记后结束程序,否则输出标记“ERROR”后转向原出错处重做。试编程实现该功能。程序流程图略。参考源程序:DATASEGMENTMSGDB0AH,0DH,'RIGHT',0AH,0DH,'$'WRNDB0AH,0DH,'ERROR',0AH,0DH,'$'DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXAGAIN:MOVAH,01H;等待用户输入1个字符并显示INT21HCMPAL,39HJAEMSGCMPAL,30HJBEMSG;判断输入是否是数字,不是则报错MOVAH,01H;等待用户输入1个字符并显示INT21HCMPAL,'A'JBEMSGCMPAL,'Z';判断输入是否是大写字母,不是则继续JBEXIT;判断是不是小写字母CMPAL,'a'JBEMSGCMPAL,'z'JBEXIT;不是字母则报错,是字母则转到EXITEMSG:LEADX,WRNMOVAH,09HINT21HJMPAGAINEXIT:MOVDX,OFFSETMSGMOVAH,09H;显示“RIGHT”并退出INT21HMOVAH,4CHINT21HCODEENDSENDSTART(2)编写一程序分类统计字符个数:即接收键入的一串字符(字符个数不超过50个,该字符串用回车作为结束),并按数字、字母和其它字符分类计数,然后将结果存入digit、letter和other3个存储单元中,并显示结果。程序流程图略。参考源程序:DATASEGMENTMSG1DB0AH,0DH,'Numberofdigit:',20H,'$'MSG2DB0AH,0DH,'Numberofletters:',20H,'$'MSG3DB0AH,0DH,'Numberofothercharacters:',20H,'$'BUFDB50DB0DB50DUP(?);设置足够深的栈区DIGITDB?LETTERDB?OTHERDB?DATAENDSSTACK1SEGMENTSTACKDB100DUP(?)STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AXMOVAH,0AH;等待用户输入字符串并显示MOVDX,OFFSETBUFINT21HMOVSI,OFFSETBUFMOVCL,[SI+1]MOVCH,00HMOVAL,00HMOVAH,00HMOVBH,00HAGAIN:MOVBL,[SI+2]CMPBL,30HJBOTH;ASCII码小于30H则归类为“其它”CMPBL,3AHMOVLETTER,BHMOVOTHER,ALMOVDX,OFFSETMSG1MOVAH,09HINT21HMOVAL,DIGITCALLDISP;显示“数字”有多少个MOVDX,OFFSETMSG2MOVAH,09HINT21HMOVAL,LETTERCALLDISP;显示“字母”有多少个MOVDX,OFFSETM