资源描述:
《用总汇编语言计算N阶乘(0到FFFFH)》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、一、设计题目编写计算N!的程序(数值N由键盘输入,结果在屏幕上输出。N的范围为0-65535,即刚好能被一个16位寄存器容纳)。二、开发目的由于当N值较大时(N>10),N的阶乘计算很繁琐并且计算容易出错。所以可以编写计算N!的程序,利用计算机强大的计算能力计算N!。这不仅能节省繁琐计算的时间,而且得到的N!的积比起手工算的要准确。三、设计方案N的阶乘为1*2*3……(N-1)*N,N的范围为(0000H—FFFFH),N!以字为单位存在一个或几个定义的数据段中。若已算到(n-1)!,假如它占4个字的空间,接下来它乘以n的原理,如图1所示
2、。12图1(n-1)!*n的原理因此计算N!的算法可以这样编写,当前n!的值为被乘数,内容存在str2中,单位为字,n+1的值为乘数,存在str1中,单位也为字。被乘数从str2首地址中内容开始与乘数相乘,得到32位的积,它的低16位覆盖掉当前被乘数所在存储空间的内容。接着str2下一个字的内容与乘数相乘,也得到32位的积,前一个积的高16位与现在积的低16位相加,它们的和覆盖掉当前被乘数所在存储空间的内容,若它们的和有进位,把进位加到现在积的高16位。直到把str2中内容乘完。然后乘数增1,循环上面的内容。直到执行完(N-1)!*N输入
3、的N为4位16进制数,输出也为16进制数。一、程序流程图输入N值开始12判断N值长度N是否大于5Y输出超出取值范围N把N值从ASCH码转化为4位16进制数N=0?YN输出N!为1n←1m←1m←m*n判断N!的积接下来的内容是否要存到附加段Yn←n+1Nm←m*nn←n+112n>N?Nn>N?NY输出m,也就是N!Y结束五、程序清单data1segmentinput1db'pleaseinputthenumber:','$'input2db10,?,10dup(?);输入的16进制数errordb'Outofrange','$'outp
4、ut1db'Theansweris1','$'output2db'Theansweris:','$'str1dw100dup(?);保存1—N(后一个数覆盖前一个数)str2dw7000hdup(?);N!乘积的值(1)pdw100dup(?);上一个乘积的高16位data1endsdata2segmentstr3dw7fffhdup(?);N!乘积的值(2)data2endscodesegmentassumecs:code,ds:data1,es:data2org100h;程序从偏移地址100h开始执行start:movax,data1
5、;程序初始化movds,axmovax,data2moves,ax;初始化结束movah,9leadx,input1int21h12movah,2;回车movdl,0dhint21hmovah,2;换行movdl,0ahint21hmovah,0ah;输入所需求的N值(N为16进制数)leadx,input2int21hmovah,2movdl,0dhint21hmovah,2movdl,0ahint21hleabx,input2moval,[bx+1];判断输入的N值是否超过FFFFHcmpal,4jas1movcl,4;把输入的N值有
6、ASCH码转成16进制数movah,[bx+2]moval,[bx+3]cmpal,39hjaabc1def1:shlal,clcmpah,39hjaabc2def2:shrax,clmovdh,almovah,[bx+4]moval,[bx+5]cmpal,39hjaabc3movcl,4def3:shlal,clcmpah,39hjaabc4def4:shrax,clmovdl,al;转换结束movax,dx;判断N值是否为0cmpax,0jzs212jmps3abc1:subal,37hjmpdef1abc2:subah,37hjm
7、pdef2abc3:subal,37hjmpdef3abc4:subah,37hjmpdef4s1:movah,9;若N值超过FFFFH的输出leadx,errorint21hjmpnexts2:movah,9;N值为1的输出leadx,output1int21hjmpnexts3:movcx,ax;计算N的阶乘movax,1mov[str1],ax;N从1开始,作为乘数leasi,str2mov[si],ax;N!的积从1开始,作为被乘数movax,0mov[p],ax;(n-1)!的乘积的低16位与n相乘后积的高16位movbx,1;
8、开始N!的乘积占一个字空间movWORDptr[p+10],0;(n-1)!的乘积的高16位与n相乘后积的低16位和(n-1)!的乘积的低16位与n相乘后积的高16位的和的进位,初始进位为0m