




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、 设计题目编写计算N!的程序(数值N由键盘输入,结果在屏幕上输出。N的范围为0-65535,即刚好能被一个16位寄存器容纳)。二、 开发目的由于当N值较大时(N10),N的阶乘计算很繁琐并且计算容易出错。所以可以编写计算N!的程序,利用计算机强大的计算能力计算N!。这不仅能节省繁琐计算的时间,而且得到的N!的积比起手工算的要准确。三、 设计方案N的阶乘为1*2*3(N-1)*N,N的范围为(0000HFFFFH),N!以字为单位存在一个或几个定义的数据段中。若已算到(n-1)!,假如它占4个字的空间,接下来它乘以n的原理,如图1所示。 图1 (n-1)!* n的原理因此计算N!的算法可以这样编写,当前n!的值为被乘数,内容存在str2中,单位为字,n+1的值为乘数,存在str1中,单位也为字。被乘数从str2首地址中内容开始与乘数相乘,得到32位的积,它的低16位覆盖掉当前被乘数所在存储空间的内容。接着str2下一个字的内容与乘数相乘,也得到32位的积,前一个积的高16位与现在积的低16位相加,它们的和覆盖掉当前被乘数所在存储空间的内容,若它们的和有进位,把进位加到现在积的高16位。直到把str2中内容乘完。然后乘数增1,循环上面的内容。直到执行完(N-1)!*N输入的N为4位16进制数,输出也为16进制数。四、 程序流程图输入N值开始 判断N值长度N是否大于5 Y输出超出取值范围 N把N值从ASCH码转化为4位16进制数N=0? Y N 输出N!为1n1 m1mm*n 判断N!的积接下来的内容是否要存到附加段 Y nn+1 Nmm*nnn+1 nN? NnN? N Y 输出m,也就是N!Y结束五、程序清单data1 segment input1 db please input the number :,$ input2 db 10,?,10 dup(?) ;输入的16进制数 error db Out of range,$ output1 db The answer is 1,$ output2 db The answer is :,$ str1 dw 100 dup(?) ;保存1N(后一个数覆盖前一个数) str2 dw 7000h dup(?) ;N!乘积的值(1) p dw 100 dup(?) ;上一个乘积的高16位data1 endsdata2 segment str3 dw 7fffh dup(?) ;N!乘积的值(2)data2 ends code segment assume cs:code,ds:data1,es:data2 org 100h ;程序从偏移地址100h开始执行start: mov ax,data1 ;程序初始化 mov ds,ax mov ax,data2 mov es,ax ;初始化结束 mov ah,9 lea dx,input1 int 21h mov ah,2 ;回车 mov dl,0dh int 21h mov ah,2 ;换行 mov dl,0ah int 21h mov ah,0ah ;输入所需求的N值(N为16进制数) lea dx,input2 int 21h mov ah,2 mov dl,0dh int 21h mov ah,2 mov dl,0ah int 21h lea bx,input2 mov al,bx+1 ;判断输入的N值是否超过FFFFH cmp al,4 ja s1 mov cl,4 ;把输入的N值有ASCH码转成16进制数 mov ah,bx+2 mov al,bx+3 cmp al,39h ja abc1 def1: shl al,cl cmp ah,39h ja abc2 def2: shr ax,cl mov dh,al mov ah,bx+4 mov al,bx+5 cmp al,39h ja abc3 mov cl,4def3: shl al,cl cmp ah,39h ja abc4 def4: shr ax,cl mov dl,al ;转换结束 mov ax,dx ;判断N值是否为0 cmp ax,0 jz s2 jmp s3abc1: sub al,37h jmp def1abc2: sub ah,37h jmp def2abc3: sub al,37h jmp def3abc4: sub ah,37h jmp def4 s1: mov ah,9 ;若N值超过FFFFH的输出 lea dx,error int 21h jmp next s2: mov ah,9 ;N值为1的输出 lea dx,output1 int 21h jmp next s3: mov cx,ax ;计算N的阶乘 mov ax,1 mov str1,ax ;N从1开始,作为乘数 lea si,str2 mov si,ax ;N!的积从1开始,作为被乘数 mov ax,0 mov p,ax ;(n-1)!的乘积的低16位与n相乘后积的高16位 mov bx,1 ;开始N!的乘积占一个字空间 mov WORD ptrp+10,0 ;(n-1)!的乘积的高16位与n相乘后积的低16位和(n-1)!的乘积的低16位与n相乘后积的高16位的和的进位,初始进位为0 mov ah,9 lea dx,output2 int 21h mov ah,2 mov dl,0dh int 21h mov ah,2 mov dl,0ah int 21h lop2: mov p+2,bxlop3: mov ax,si ;(n-1)!的乘积从最低16位的内容与n相乘 mov dx,str1 mul dx clc add ax,p+10 ;前一次的进位与当前乘积的低16位内容相加 jnc k1 ;判断是否产生进位 mov WORD ptrp+10,1 add ax,p ;前一个积的高16位与现在积的低16位相加 jmp k2 k1: add ax,p jnc k3 ;判断是否产生进位 mov WORD ptrp+10,1 jmp k2k3: mov WORD ptrp+10,0 k2: mov si,ax mov p,dx add si,2 dec bx cmp bx,0 jnz lop3 mov bx,p+2 clc add dx,p+10 cmp dx,0 jz re ;判断(n-1)!乘积的最高16位内容与n的乘积的高16位是否为0 inc bx mov si,dx re: mov ax,str1 cmp ax,9000h ;判断是N!乘积的内容高位部分是否要存到es中 jnc re1 jmp re2re1: cmp cx,1 ja s4re2: inc WORD ptrstr1 ;乘数增1 lea si,str2 mov WORD ptrp,0 mov WORD ptrp+10,0 loop lop2 dec bx mov cx,bx lop4: add si,2 loop lop4 inc bx add bx,bx inc si jmp lop5 s4: inc WORD ptrstr1 ;若N的值超过8000h,8000h*8001h*8002h*N mov p+6,bx mov p+8,bx lea si,str2 lea di,str3 mov es:di,dx mov WORD ptrp,0 mov WORD ptrp+10,0 mov bx,1 dec cx lop6: mov p+4,bxlop7: mov ax,si mov dx,str1 mul dx clc add ax,p+10 jnc k4 mov WORD ptrp+10,1 add ax,p jmp k5 k4: add ax,p ;前一个积的高16位与现在积的低16位相加,产生进位 jnc k6 mov WORD ptrp+10,1 jmp k5k6: mov WORD ptrp+10,0 k5: mov si,ax add si,2 mov p,dx dec WORD ptrp+6 mov ax,p+6 cmp ax,0 jnz lop7 mov ax,p+8 mov p+6,axlop8: mov ax,es:di mov dx,str1 mul dx clc add ax,p+10 jnc k7 mov WORD ptrp+10,1 add ax,p jmp k8 k7: add ax,p ;前一个积的高16位与现在积的低16位相加,产生进位 jnc k9 mov WORD ptrp+10,1 jmp k8k9: mov WORD ptrp+10,0 k8: mov es:di,ax add di,2 mov p,dx dec bx cmp bx,0 jnz lop8 mov bx,p+4 clc add dx,p+10 cmp dx,0 jz re4 inc bx mov es:di,dx re4: inc WORD ptrstr1 lea si,str2 lea di,str3 mov WORD ptrp,0 mov WORD ptrp+10,0 dec cx cmp cx,0 jnz lop6 dec bx mov cx,bxlop9: add di,2 loop lop9 inc bx add bx,bx inc di lop10: dec bx ;若N8000h,输出N!乘积的高位内容 mov al,BYTE ptr es:di mov ch,al mov cl,4 shr al,cl cmp al,09h ja op3 add al,30h jmp ip3op3: add al,37hip3: mov ah,2 mov dl,al int 21h mov al,ch and al,0fh cmp al,09h ja op4 add al,30h jmp ip4op4: add al,37hip4: mov ah,2 mov dl,al int 21h dec di cmp bx,0 jnz lop10 mov bx,p+6 dec bx mov cx,bxlop11: add si,2 loop lop11 inc bx add bx,bx inc si lop5: dec bx ;输出N!的乘积 mov al,BYTE ptr si mov ch,al mov cl,4 shr al,cl cmp al,09h ja op1 add al,30h jmp ip1op1: add al,37hip1: mov ah,2 mov dl,al int 21h mov al,ch and al,0fh cmp al,09h ja op2 add al,30h jmp ip2op2: add al,37hip2: mov ah,2 mov dl,al int 21h dec si cmp bx,0 jnz lop5 next: mov ah,1 int 21h mov ah,4ch int 21hcode ends end start 六、程序运行结果与分析若输入的16进制数N为000A(10进制为10),程序运行后输出的N!应为375F00(H)。程序运行结果如图2所示。图2 N=000A 若输入的16进制数N为0064(10进制为100),虽然答案不能手算出来,但根据理论N!的低位应该为0。程序运行结果如图3所示。 图3 N=0064 根据这两个结果,我认为该程序应该是正确的。七、实验总结 本次实验是编写N!的程序。在这次实验中我遇到了许多困难,一些是自己考虑不周引起的,一些是自己知识掌握不牢靠引起的,还有一些是由于自己粗心引起的。所有的这些坎坷,都催化着我那稚嫩的程序慢慢地完善和严谨。 一开始我没考虑到阶乘乘积的前一个字中的内容与乘数相乘后的积的高16位与阶乘乘积的后一个字的内容与乘数相乘所得的积的高16位相加后,它们的和产生进位的问题。 在做到数据段已存不下阶乘的积,要把多出的数据放到附加段时。由于知识掌握的不牢靠,不知道附加段的数据传输要在di前
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 早餐店营销方案案例(3篇)
- 淘宝营销方案策划工作(3篇)
- 手机验证短信营销方案(3篇)
- 初中生安全培训内容课件
- 初中同学安全教育培训课件
- 创卫办迎检课件
- 内燃机车走行部课件
- 统编版语文六年级上册第五单元习作围绕中心意思写同步 公开课一等奖创新教学设计 学习任务单 分层练习
- 内燃机分解课件
- 先天性甲状腺低课件
- 透析患者血磷控制健康宣教
- catia考试题及答案
- 2025年中国跨境电商SaaS市场行业报告
- 记叙人称及叙述视角课件-2025年中考语文二轮专题
- 殡葬业务科管理制度
- JG/T 404-2013空气过滤器用滤料
- 大米委托加工合同范本
- 学校物品捐赠协议书
- 2025-2030国内地热能行业市场发展现状及竞争格局与投资发展前景研究报告
- 《财务报表分析课件》
- 《科研经费的使用与管理》课件
评论
0/150
提交评论