用总汇编语言计算N阶乘0到FFFFH

上传人:痛*** 文档编号:101454603 上传时间:2022-06-05 格式:DOC 页数:13 大小:115.50KB
收藏 版权申诉 举报 下载
用总汇编语言计算N阶乘0到FFFFH_第1页
第1页 / 共13页
用总汇编语言计算N阶乘0到FFFFH_第2页
第2页 / 共13页
用总汇编语言计算N阶乘0到FFFFH_第3页
第3页 / 共13页
资源描述:

《用总汇编语言计算N阶乘0到FFFFH》由会员分享,可在线阅读,更多相关《用总汇编语言计算N阶乘0到FFFFH(13页珍藏版)》请在装配图网上搜索。

1、word一、 设计题目编写计算N!的程序数值N由键盘输入,结果在屏幕上输出。N的X围为0-65535,即刚好能被一个16位存放器容纳。二、 开发目的由于当N值较大时N10,N的阶乘计算很繁琐并且计算容易出错。所以可以编写计算N!的程序,利用计算机强大的计算能力计算N!。这不仅能节省繁琐计算的时间,而且得到的N!的积比起手工算的要准确。三、 设计方案N的阶乘为1*2*3(N-1)*N,N的X围为0000HFFFFH,N!以字为单位存在一个或几个定义的数据段中。假设已算到n-1!,假设它占4个字的空间,接下来它乘以n的原理,如图1所示。 图1 n-1!* n的原理因此计算N!的算法可以这样编写,当

2、前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输出超出取值X围 N把N值

3、从ASCH码转化为4位16进制数N=0? Y N 输出N!为1n1m1mm*n判断N!的积接下来的内容是否要存到附加段 Ynn+1 Nmm*nnn+1nN? 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后一

4、个数覆盖前一个数 str2 dw 7000h dup(?) ;N!乘积的值1 p dw 100 dup(?) ;上一个乘积的高16位data1 endsdata2 segment str3 dw 7fffh dup(?) ;N!乘积的值2data2 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 m

5、ov 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

6、 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

7、: sub ah,37h jmp def4s1: mov ah,9 ;假设N值超过FFFFH的输出 lea dx,error int 21h jmp next s2: mov ah,9 ;N值为1的输出 lea dx,output1 int 21h jmp nexts3: 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 WOR

8、D 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 21hlop2: 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 ptr

9、p+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

10、;判断是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,bxlop4: 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

11、,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

12、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

13、 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 dilop10: dec bx ;假设N8000h,输出N!乘积的高

14、位内容 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

15、: add si,2 loop lop11 inc bx add bx,bx inc silop5: 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 21

16、h dec si cmp bx,0 jnz lop5next: mov ah,1 int 21h mov ah,4ch int 21hcode ends end start 六、程序运行结果与分析假设输入的16进制数N为000A10进制为10,程序运行后输出的N!应为375F00(H)。程序运行结果如图2所示。图2 N=000A假设输入的16进制数N为006410进制为100,虽然答案不能手算出来,但根据理论N!的低位应该为0。程序运行结果如图3所示。 图3 N=0064 根据这两个结果,我认为该程序应该是正确的。七、实验总结本次实验是编写N!的程序。在这次实验中我遇到了许多困难,一些是自己考

17、虑不周引起的,一些是自己知识掌握不牢靠引起的,还有一些是由于自己粗心引起的。所有的这些坎坷,都催化着我那稚嫩的程序慢慢地完善和严谨。 一开始我没考虑到阶乘乘积的前一个字中的内容与乘数相乘后的积的高16位与阶乘乘积的后一个字的内容与乘数相乘所得的积的高16位相加后,它们的和产生进位的问题。 在做到数据段已存不下阶乘的积,要把多出的数据放到附加段时。由于知识掌握的不牢靠,不知道附加段的数据传输要在di前加es。导致程序输出一直出错。 在快完成程序时,由于自己的马虎。定义好附加段的内容后,忘加了dup?。导致算N很大时的阶乘一直出错。 虽然这次实验编写的难度很大,但我感到我的汇编能力比起以前有了很大的提高,同时也巩固我所学的知识。 最后,程序虽然能实现0到FFFFH的阶乘了,但我感到这程序还不友好。因为你输入的数据必须是4位16进制数,如果高位没有,必须加0,补足4位。这就多了一步,即要把所要求的10进制数先转成16进制数才能运行程序。所以我认为程序可以把输入局部优化,使输入10进制数,在程序中转成对应的16进制数。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!