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

上传人:M****1 文档编号:548273331 上传时间:2022-11-09 格式:DOCX 页数:9 大小:84.03KB
返回 下载 相关 举报
用汇编语言计算N阶乘(0到FFFFH)_第1页
第1页 / 共9页
用汇编语言计算N阶乘(0到FFFFH)_第2页
第2页 / 共9页
用汇编语言计算N阶乘(0到FFFFH)_第3页
第3页 / 共9页
用汇编语言计算N阶乘(0到FFFFH)_第4页
第4页 / 共9页
用汇编语言计算N阶乘(0到FFFFH)_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《用汇编语言计算N阶乘(0到FFFFH)》由会员分享,可在线阅读,更多相关《用汇编语言计算N阶乘(0到FFFFH)(9页珍藏版)》请在金锄头文库上搜索。

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

2、此计算N!的算法可以这样编写,当前n!的值为被乘数,内容存在 str2 中,单位为字, n+1 的值为乘数, 存在 str1 中,单位也为字。被乘数从 str2 首地址中内容开始与乘数相乘,得到 32 位的积,它的低 16 位覆盖掉 当前被乘数所在存储空间的内容。接着str2下一个字的内容与乘数相乘, 也得到 32 位的积,前一个积的高 16 位与现在积的低 16位相加,它们的和 覆盖掉当前被乘数所在存储空间的内容,若它们的和有进位,把进位加到现 在积的高16位。直到把str2中内容乘完。然后乘数增1,循环上面的内容。 直到执行完(N-l)! *N输入的N为4位16进制数,输出也为16进制数。

3、四、程序流程图/输出超出取 值范围Nn清单五、程Ndatal segme ntinput1 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(?) str2 dw 7000h dup(?) p dw 100 dup(?)data1 endsdata2 segmentstr3 dw 7fffh dup(?)data2 en

4、ds code segment assume cs:code,ds:data1,es:data2;保存1N (后一个数覆盖前一个数) ;N!乘积的值(1);上一个乘积的高16位;N!乘积的值(2)org 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 lea dx,input2 int 21h mov ah,2 mov dl,0dh

5、int 21h mov ah,2 mov dl,0ah;初始化结束;回车;换行;输入所需求的N值(N为16进制数);程序从偏移地址100h开始执行 ;程序初始化int 21hlea bx,input2 mov al,bx+1;判断输入的N值是否超过FFFFHcmp al,4ja s1mov cl,4;把输入的N值有ASCH码转成16进制数def1:mov ah,bx+2 mov al,bx+3 cmp al,39h ja abc1 shl al,cldef2:cmp ah,39h ja abc2 shr ax,cldef3:mov dh,al mov ah,bx+4 mov al,bx+5 c

6、mp al,39h ja abc3mov cl,4 shl al,cldef4:cmp ah,39h ja abc4 shr ax,clmov dl,al;转换结束mov ax,dx;判断 N 值是否为 0abc1:cmp ax,0jz s2jmp s3 sub al,37habc2:jmp def1 sub ah,37habc3:jmp def2 sub al,37habc4:jmp def3 sub ah,37hs1:jmp def4mov ah,9;若N值超过FFFFH的输出s2:lea dx,error int 21h jmp next mov ah,9; N 值为 1 的输出lea

7、dx,output1 int 21hjmp nexts3:mov cx,ax ;计算 N 的阶乘mov ax,1mov str1,ax;N 从 1 开始,作为乘数lea si,str2mov si,ax; N !的积从1开始,作为被乘数mov ax,0mov 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 位的和的进位,初始进位为0mov ah,9lea dx,output2int 21hm

8、ov ah,2mov dl,0dhint 21hmov ah,2mov dl,0ahint 21hlop2:mov p+2,bxlop3:mov ax,si;(n-1) !的乘积从最低16位的内容与 n 相乘mov dx,str1mul dxclcadd ax,p+10;前一次的进位与当前乘积的低 16位内容相加jnc k1;判断是否产生进位mov WORD ptrp+10,1add ax,p;前一个积的咼 16位与现在积的低16位相加jmp k2k1:add ax,pjnc k3;判断是否产生进位mov WORD ptrp+10,1jmp k2k3:mov WORD ptrp+10,0k2:

9、mov si,ax mov p,dx add si,2 dec bx cmp bx,0jnz lop3mov bx,p+2clcadd dx,p+10cmp dx,0jz re;判断(n-1)!乘积的最高16位内容与n的乘积的高 16 位是否为 0inc bxmov si,dxre:mov ax,str1cmp ax,9000h;判断是N!乘积的内容咼位部分是否要存到es中jnc re1jmp re2re1:cmp cx,1ja s4re2:inc WORD ptrstr1;乘数增 1lea si,str2mov WORD ptrp,0mov WORD ptrp+10,0loop lop2de

10、c bxmov cx,bxlop4:add si,2 loop lop4inc bx add bx,bx inc sijmp lop5s4:inc WORD ptrstr1 ;若 N 的值超过 8000h,8000h*8001h*8002h*N mov p+6,bxmov p+8,bxlea si,str2lea di,str3mov es:di,dxmov WORD ptrp,0mov WORD ptrp+10,0mov bx,1dec cxlop6:mov p+4,bxlop7:mov ax,simov dx,str1mul dxclcadd ax,p+10jnc k4mov WORD p

11、trp+10,1 add ax,pjmp k5k4:add ax,p;前一个积的高 16 位与现在积的低 16 位相加,产生进位jnc k6mov WORD ptrp+10,1jmp k5k6:mov WORD ptrp+10,0k5: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:dimov dx,str1mul dxclcadd ax,p+10jnc k7mov WORD ptrp+10,1add ax,pjmp k8k7

12、:add ax,p;前一个积的高 16 位与现在积的低 16 位相加,产生进位jnc k9mov WORD ptrp+10,1jmp k8k9:mov WORD ptrp+10,0k8: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+10cmp dx,0jz re4 inc bxmov es:di,dxre4:inc WORD ptrstr1lea si,str2lea di,str3mov WORD ptrp,0 mov WORD ptrp+10,0 dec cxcmp cx,0j

13、nz lop6dec bxmov cx,bxlop9:add di,2 loop lop9 inc bx add bx,bx inc dilop10:dec bx若N8000h,输出N!乘积的高位内容mov al,BYTE ptr es:dimov ch,almov cl,4shr al,clcmp al,09hja op3add al,30hjmp 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:

14、mov ah,2mov dl,al int 21hdec dicmp bx,0jnz lop10 mov bx,p+6 dec bx mov cx,bx lop11: add si,2loop lop11 inc bx add bx,bx inc siIop5:dec bx;输出N!的乘积mov al,BYTE ptr simov ch,aI mov cI,4 shr aI,cI cmp aI,09h ja op1 add aI,30h jmp ip1op1:add aI,37hip1:mov ah,2mov dI,aIint 21h mov aI,ch and aI,0fh cmp aI,09h ja op2 add aI,30h jmp ip2op2:add aI,37hip2:mov ah,2mov dI,aIint 21h dec sicmp bx

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号