微机原理课程设计报告计算N的阶乘

合集下载

计算机硬件课程设计——计算N!的程序

计算机硬件课程设计——计算N!的程序

目录一、设计题目 (2)二、开发目的 (2)三、设计方案以及论证 (2)四、程序流程图 (2)五、程序清单 (5)六、程序运行结果分析与预测 (9)七、总结 (9)参考文献 (9)一、设计题目编写计算N!的程序(数值N由键盘输入,结果在屏幕上输出。

N的范围为0-65535,即刚好能被一个16位寄存器容纳)。

二、开发目的随着科技的发展数学中的问题解决方案有多种多样,计算机的发展给人们在数学中无法用手工计算的问题得以解决,这次我们开发一道程序实现一个最大数可达到十六位的二进制数的阶乘。

三、设计方案以及论证对于N!,如果单纯的N计算阶乘,N值在一个很小的范围内计算起来是很简单,在计算机中也很好实现,但是当N值达到一定的数值就要考虑计算结果对于一个16为二进制的寄存器或存储器是否能够容纳。

若果不能容纳该怎么实现。

怎么样才能将这么一个大的数据存储起来就是此次实验重点讨论的问题,一般的在汇编语言中只能实现两个数相乘,当计算N!时是指N个数相乘,这样我们就要先两个数相乘,再将乘积存储在缓存中再与下一个数相乘,乘积再继续存储在缓存中,随着乘数的增多缓存的位数也不断增大,这样利用缓存就将一个很大的数存储起来。

四、程序流程图图一程序的主流程图①.根据题目要求将主流程图规划出如图一所示,首先是先定义各个基本段(数据段、堆栈段、代码段),之后是输入N值,这里调用INPUT_N子程序将要计算的N值输入并将输入的N值赋给BP,判断BP是否为1或0即是判断输入的N值是否为1或0,如果输入值为0或1,由于0或1的阶乘为1所以直接调用JGXS子程序显示结果1.若判断N值不为1或0将缓冲区初始化为N,而BP的值自减1这时判断BP是否为1,若为1则显示缓冲区的计算结果,若不为1将缓冲区的值与BP相乘,乘积存储在缓冲区中,然后循环,BP值自减1并重新判断BP的值是否为1,反复循环直到BP的值为1,最终将计算结果存储在缓冲区中,最后将缓冲区中的数据显示出来,N!计算结束。

微机原理实验报告---汇编语言n的阶乘

微机原理实验报告---汇编语言n的阶乘

微机原理实验报告-------颜色的排列组合方式院系:自动化班级:学号:姓名:日期:成绩:1.题目在实际中,有红黄蓝绿等7种颜色,按照排列组合方式,分别计算出有多少种排列方式?如果减少一种颜色,又有多少中排列呢?2.题目分析题目中给去n种(n=7)颜色,要求我们计算可能出现的组合种数,这是数学中常见的排列组合问题。

题目的意思是指的传统的排列组合,不许有重复颜色的,否则与生活习惯就不符合了。

这个咱们就熟悉了,对于n种颜色,应该有nA种排列方式。

我们知道,nnA在数值上就是n的阶乘,现在程序的对象成为求阶乘了。

n对于阶乘,我的思路是利用循环,设计一个累加变量兼被乘数x,用n来作为结束判断,当x>n时,累乘循环结束,现在就得到了相应的种类数。

但是内存中的数值是以16进制存放的,还需要一步进制转换才能进行显示。

我的算法是:开辟5个空间的变量result1存放个位数字,给bx赋值10,(※)把dx清零,用{dx,ax}除以bx,得到的余数放在dx中,就是个位数的十进制表示,在转放到result1的第一个地址中。

此时商数存在ax中,再重复(※)之后的内容,直到全部转化完。

显示的算法是十进制数字加上30h,变为ASCII码,利用INT 21H中断循环显示各位数字。

程序还给阅读者提供了选择权,允许读者进行输入,当读者输入一个数据n(n<=7)时,程序会根据输入,显示出相应的运算结果,这样当给定的样色种类变化时,就不用对程序本身进行更改了,可谓更加方便灵活。

3.程序框图4.程序编写CRLF MACRO ;定义回车换行的宏MOV DL,0DHMOV AH,2INT 21HMOV DL,0AHMOV AH,2INT 21HENDMSTACK SEGMENT STACK ;初始定义DW 100 DUP(?)STACK ENDSDATA SEGMENTSTRING DB 'ENTER SORT OF COLOUR: ','$' ;输入提示字符串RESULT1 DB 5 DUP(0) ;用来存储结果的各位数字DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV DX,OFFSET STRINGMOV AH,9INT 21HMOV AH,1 ;输入样色的种类INT 21HSUB AH,AHSUB AL,30HMOV CX,AX ;颜色的种类用来控制循环CRLFMOV AX,1MOV BX,1LP:MUL BXINC BXLOOP LPLEA DI,RESULT1 ;LP循环求阶乘MOV BX,10MOV CX,4LOOP1:DIV BXMOV [DI],DL ;LOOP1将16进制转为10进制INC DISUB DX,DXLOOP LOOP1DEC DIMOV CX,4DISPLAY: ;DISPLAY用来显示10进制的各位数字ADD BYTE PTR[DI],30HMOV DL,[DI]MOV AH,2INT 21HDEC DILOOP DISPLAYMOV AX,4C00HINT 21HCODE ENDSEND START5.运行结果6. 结果讨论排列中数是颜色种类n的阶乘,比较5种6种和7种的数值可发现,120,720和5450相差很大。

计算机原理课程设计阶乘

计算机原理课程设计阶乘

计算机原理课程设计阶乘一、课程目标知识目标:1. 学生能理解阶乘的概念,掌握计算阶乘的基本方法。

2. 学生能了解计算机中循环结构的应用,理解递归算法在计算阶乘中的实现过程。

3. 学生掌握计算机程序设计中阶乘相关问题的解决方法。

技能目标:1. 学生能运用所学知识编写计算阶乘的程序,具备一定的编程实践能力。

2. 学生能通过分析、设计、调试程序,提高问题解决能力和逻辑思维能力。

3. 学生能够运用递归思想优化计算阶乘的算法,提高编程技巧。

情感态度价值观目标:1. 学生对计算机科学产生兴趣,树立探究精神和创新意识。

2. 学生通过团队协作解决问题,培养沟通能力和团队精神。

3. 学生在解决问题的过程中,形成严谨、细致、负责的学习态度。

课程性质:本课程为计算机原理课程设计,旨在让学生通过实际操作,掌握计算阶乘的基本原理和方法,提高编程实践能力。

学生特点:本课程针对的是高年级学生,他们已经具备了一定的计算机编程基础,具有较强的逻辑思维能力和问题解决能力。

教学要求:课程要求学生在理解阶乘概念的基础上,学会编写计算阶乘的程序,并能对算法进行优化。

同时,注重培养学生的团队协作能力和创新精神。

通过本课程的学习,使学生能够将所学知识应用于实际问题中,提高综合运用能力。

二、教学内容1. 阶乘概念及其性质- 阶乘定义- 阶乘的数学性质2. 计算阶乘的方法- 递推法- 递归法- 循环法3. 计算机程序设计中的阶乘实现- 编程语言的选择- 阶乘程序设计- 程序调试与优化4. 阶乘应用案例- 阶乘在数学问题中的应用- 阶乘在计算机科学中的应用5. 教学案例分析与讨论- 案例展示- 案例分析与讨论- 团队协作解决问题教学内容安排与进度:第一课时:阶乘概念及其性质,学习阶乘定义和数学性质。

第二课时:计算阶乘的方法,学习递推法、递归法和循环法。

第三课时:计算机程序设计中的阶乘实现,进行编程实践和程序调试。

第四课时:阶乘应用案例,探讨阶乘在数学和计算机科学中的应用。

输入正整数n,计算n的阶乘c++实验报告

输入正整数n,计算n的阶乘c++实验报告

输⼊正整数n,计算n的阶乘c++实验报告实验五⼀、实验内容1、掌握3种循环结构:while,do-while,for的区别与联系,以及他们之间相互转换的⽅法,并能正确使⽤他们.2,掌握与循环语句相关的break语句和continue语句的使⽤⽅法.⼆、实验⽬的1、掌握3种循环结构:while,do-while,for的区别与联系,以及他们之间相互转换的⽅法,并能正确使⽤他们.2,掌握与循环语句相关的break语句和continue语句的使⽤⽅法.三、实验步骤实践教程例题11.输⼊正整数n,计算n的阶乘.2.实践教程例2输⼊若⼲字符,统计其中数字字符.⽩字符和其它字符的个数,输⼊EOF结束.3、实践教程例3N个⼈围坐成⼀圈,从1开始顺序编号;游戏开始,从第⼀个⼈开始由1到m循环报数,报到m的⼈退出圈外,问最后留下的那个⼈原来的序号。

4`书2.3设计程序将输⼊的百分制成绩转换为五分制输出,90分以上为5分,80~89为4分,70~79为3分,60~69为两分,60分以下为1分。

书2.5编译打印如下图形** * ** * * * ** * * * * * ** * ** * ** * *4、书2.7 输⼊n,求1!+2!+3!+…+n!。

四、实验数据及处理结果实践教程例1#includeusing namespace std;int main (){double result=0;cout<<"请输⼊正整数:"<cin>>n;if(n<1){cout<<"输⼊错误!"<return 1;}result=1;for(i=2;i<=n;i++)result*=i;cout<return 0;}实践教程例2#includeusing namespace std;int main(){int c;int nWhite,nOther,nDigit;nWhite=nOther=nDigit=0;c=cin.get();while(c!=EOF){switch(c){case'0':case'1':case'2':case'3':case'4': case'5':case'6':case'7':case'8':case'9': nDigit++;break;case' ':case'\n':case'\t':nWhite++;break;default:nOther++;break;}}cout<<"digits="<<'\t'<cout<<"White space="<<'\t'<cout<<"Other Chars="<<'\t'<return 0;}实践教程例3#includeusing namespace std;int main(){const int n=4;const int m=2;char jose[n];int i,j=0,k;for(i=0;ifor(k=n;k>=1;k--){i=0;while(i!=m){if(jose[j]==1){i++;if(i==m){jose[j]=0;}}}j=(j+1)/n;}cout<<"The one left at last is "<<(j-1)< return 0;}书2.3#includeusing namespace std;int mark,result;cout<<"??ê?è?°ù·3é?¨:"<cin>>mark;if(mark<0){cout<<"è±??"<return 0;}switch(mark/10){case 9:case 10:result =5;cout<<"ê?3·3é?¨£o"<break;case 8:result=4;cout<<"ê?3·3é?¨:"<break;case 7:result=3;cout<<"ê?3·3é?¨:"<break;case 6:result=2;cout<<"ê?3·3é?¨:"<break;case 5:case 4:case 3:case 2:case 1:case 0: result=0;cout<<"ê?3·3é?¨:"<break;default:cout<<"ê?è?′í?ó!"<}return 0;}#includeusing namespace std;int main(){int i,j;for(i=1;i<=4;i++){for(j=4-i;j>0;j--)cout<<" ";for(j=1;j<=2*i-1;j++)cout<<"*";cout<< endl;}for(i=1;i<=3;i++)cout<<" ***\n";return 0;}书2.7#includeusing namespace std;int main(){int n,i,jch=1;double result=0;cout<<"请输⼊正整数n:"<cin>>n;if(n<1){cout<<"输⼊错误!"<return 1;}result=1;for(i=2;i<=n;i++){jch*=i;result+=jch;}cout<return 0;五、思考讨论题或体会或对改进实验的建议什么时候需要使⽤,怎样正确的使⽤?。

微机原理 8以内的阶乘

微机原理 8以内的阶乘

汇编语言实验报告键盘输入求8以内数的阶乘班级10级机械实验班组员李超1001500321王茜1001510303时间 2012年11月6日组员签字一、实验目的1、掌握运用汇编语言编写程序,熟悉各指令的含义及用法2、熟练运用debug跟踪程序运行的进程3、学习使用汇编语言实现数学函数二、实验设备计算机(64位)三、实验内容编写程序:从键盘输入n(n<8)的值,实现n!,并将结果保存到result字单元中四、程序清单1、程序流程图2、程序代码data segmentstr1 db 'Please input the value of n:','$' ;定义显示字符串n dw ?result dw 2 dup (0) ;定义输入数n和结果保存单元result data endsstack segment stack 'stack'db 100 dup('s')stack endscode segment para 'code'assume cs:code,ds:data,ss:stacksta proc farpush dsxor ax,axpush axmov ax,datamov ds,axlea dx,str1mov ah,9hint 21h ;显示字符串调用指令mov ah,1hint 21h ;键盘输入调用指令sub al,30hcbw ;将n转码并拓展至AX寄存器mov n,axxor ax,axmov bx,offset n ;将n的偏移地址送至BX寄存器xor cx,cxmov cx,[bx] ;将n的值作为循环执行次数mov ax,1cmp cx,0jz la ;判断n是否为0 co: mul cxloop co ;循环执行段la: mov result,ax ;计算结果由AX寄存器送到result retcode endsend sta五、实验结果及分析1、实验结果示例n=0时计算n!=0001Hn=5时计算n!=0078Hn=7时计算n!=13B0H2、运行过程初始状态及语言指令输入值5判断5不为0,进入循环循环结束,赋值给result字单元六、实验体会计算机系统是一个十分复杂的整体,汇编语言作为一种较为低级的语言构成了我们现在看到的这个计算机系统。

微机课设报告(计算N的阶乘)

微机课设报告(计算N的阶乘)

目录一、实验要求.......................... . (3)二、实验内容 (3)三、实验思路 (3)四、实验过程 (5)五、实验总结 (12)一、实验要求实验目的(1)、堆栈传递参数的子程序调用方法。

(2)、序递归调用方法。

(3)、伪指令:PROC,ENDP,NEAR和FAR。

(4)、指令:CALL,RET,RET n。

(5)、T指令推出EXE文件的方法。

(6)、了解怎样在汇编语言一级上实现高级语言中的数学函数。

二、实验内容1、实验内容计算N!:编写计算N阶乘的程序,数值N由键盘输入,N的值要在0到65536之间(用一个16位的字表示),结果在显示器上显示。

2、实验步骤(1)、打开开始菜单,单击运行,在对话框中输入“cmd”,进入dos窗口。

(2)、输入cd\masm5 回车,在输入edit 回车,进入汇编窗口。

(3)、输入代码。

(4)、保存代码,后缀名为.asm。

(5)、回到dos窗口,输入masm文件名保存位置,文件名回车。

(6)、调试程序,根据提示回到汇编窗口,对代码进行修改,直至出现no error及no warrings。

三、实验思路、1、算法阶乘的定义为N!=N*(N-1)*(N-2)*……2*1,从走往右翼此计算,解雇保留在缓冲区BUF中。

缓冲区BUF按由低到高依次排列。

程序首先将BP初始为N,N 不等于0获1则将N送入BUF缓冲区最低自单元中。

然后使BP一次减1,直至变化到1为止。

每次让BP与BUF的字单元按照由低到高的次序香橙。

低位结果AX仍保存在相应的BUF自单元中,高位结果DX泽送到进位子单元CY 中,作为高字香橙时从低字来的进位,初始化CY为0。

计算结果的长度随着成绩运算而不断增长,由字单元LEN指示,LEN单元初始化为1。

当最高字单元与BP香橙时,若DX不为0,则结果长度要扩展。

2、流程图四、实验过程1、源程序CRLF MACRO ;回车,换行MOV AH,02HMOV DL,0DHINT 21HMOV AH,02HMOV DL,0AHINT 21HENDMDATA SEGMENTMESS1 DB 'INPUT THE NUMBER ACCORDING TO HEXNUM!',0DH,0AH,'$' MESS2 DB 'THE RESULT IS:$'ERROR DB 'INPUT ERROR!INPUT ONCE MORE!',0DH,0AH,'$'LEN DW 1CY DW ?BUF DW 256 DUP(0)DATA ENDSSTACK SEGMENT STACK 'STACK'DW 32 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART: MOV AX,DATAMOV DS,AXMOV ES,AXMOV AH,09HMOV DX,OFFSET MESS1INT 21H ;显示输入提示信息CALL GETNUM ;读取键入的N值MOV BP,DX ;N值送BPCMP BP,0JZ EEECMP BP,1JZ EEE ;N=0或N=1则转EEEMOV SI,OFFSET BUF ;缓冲区首址MOV [SI],DXXXX: DEC BP ;N值减1CMP BP,0001HJZ LLL ;若为1则转LLLXOR BX,BX ;偏移指针清0MOV WORD PTR CY,0 ;进位单元清0MOV CX,LEN ;当前结果长度送CXTTT: MOV AX,[SI+BX]MUL BP ;相乘ADD AX,CY ;加低位进位JNC JJJ ;结果无进位转JJJINC DX ;有进位将高位单元加1 JJJ: MOV [SI+BX],AX ;结果送缓冲区中MOV CY,DX ;高位单元送进位单元INC BXINC BX ;一个字长度LOOP TTT ;循环CMP DX,0000HJZ BBB ;最后一次的进位为0则转BBB INC WORD PTR LEN ;长度加1MOV [SI+BX],DX ;进位送缓冲区中BBB: JMP XXXEEE: MOV SI,OFFSET BUFMOV WORD PTR b[SI],1 ;结果为1LLL: MOV AH,09HMOV DX,OFFSET MESS2INT 21H ;显示表头MOV CX,LENMOV BX,CX ;长度DEC BXSHL BX,1 ;一个字为两个字节CCC: MOV AX,[SI+BX]CALL DISPDEC BXDEC BX ;显示结果LOOP CCCMOV AX,4C00H ;结束INT 21HDISP1 PROC NEAR ;显示字符(AL)MOV BL,ALMOV DL,BLMOV CL,04ROL DL,CLAND DL,0FHCALL DISPL ;显示高位MOV DL,BLAND DL,0FHCALL DISPL ;显示低位RETDISP1 ENDPDISPL PROC NEAR ;显示一位(DL=0XH)CMP DL,3AHJB DDDADD DL,27HDDD: MOV AH,02HINT 21HRETDISPL ENDPDISP PROC NEAR ;显示4位数(HEC) PUSH BXPUSH CXPUSH DXPUSH AXMOV AL,AHCALL DISP1POP AXCALL DISP1POP DXPOP CXPOP BXRETDISP ENDPGETNUM PROC NEAR ;字符匹配程序PUSH CXREGET:XOR DX,DXGGG: MOV AH,01HINT 21HCMP AL,0DHJZ PPPCMP AL,20HJZ PPPSUB AL,30HJB KKKCMP AL,0AHJB GETSCMP AL,11HJB KKKSUB AL,07HCMP AL,0FHJBE GETSCMP AL,2AHJB KKKCMP AL,2FHJA KKKGETS: MOV CL,04HSHL DX,CLXOR AH,AHADD DX,AXJMP GGGKKK: CRLFMOV AH,09HMOV DX,0FFSET ERROR INT 21HJMP REGETPPP: PUSH DXCRLFPOP DXPOP CXRETGETNUM ENDPCODE ENDSEND START2、测试结果输入程序把程序都输入进去后,进行调试,直至出现0个错误和0个警告!调试完程序之后,输入LINK,对程序进行编译。

微机原理课程设计 求阶成运算程序

微机原理课程设计 求阶成运算程序

一.引言微机原理和应用技术是我们电子类专业重要的基础专业课之一,要求有较强的自学能力和分析问题解决问题的能力以及实际动手能力。

其作用是为了培养学生善于用计算机作为工具。

实践性环节的主要内容为微机常用接口芯片应用的综合性设计,通过设计掌握汇编语言的编程、调试,常用接口芯片的使用方法,初步了解微机应用系统的开发过程及设计原则。

与其他课程不同的是,该课程设计对硬件有很高的依赖性。

因此,课程设计的灵活性受到一定的限制,必须有相应的实验平台支持。

1.1课程设计的必要性长期以来,注重书本知识,轻视实际动手能力是我们学习中普遍存在的现象。

进行课程设计的目的就是要改变这种状况,使我们既具有完备的理论知识,也能够解决在实际学习、生活工作中遇到的问题。

我们应该能够把学到的理论知识用到实际中去,将知识转变为实际的生产力,同时通过这些理论知识和实际的应用推动理论和实践的发展。

课程设计能够把课本中分布学习的知识,在设计中综合加以应用,进而得到巩固、加深和发展。

同时,我们通过学习查找、运用设计资料,完成工程设计所必备的基本训练。

通过课程设计,能够对所学的知识有更进一步的理解,并能掌握学习理论时没有注意的细节。

在实际工作中,只要有一个环节没有做好,整个体系都不能正常运行。

调试程序、排除故障有助于提高分析问题、解决问题的能力。

课程设计中碰到的挫折,有助于养成良好的学习习惯、严谨的工作作风。

1.2课程设计的目标一般来讲,课程设计比教学实验复杂一些,涉及的深度更广并更加接近实用。

目的是通过课程设计的综合训练,培养我们实际分析问题、编程和动手能力,最终帮助我们系统掌握该门课程的主要内容,更好的完成学习任务。

二.实验设计2.1实验内容:计算该数据的阶乘。

要求屏幕有提示信息和相应结果。

2.2实验流程图:YES2.3实验分析由于本实验计算的十以内的阶乘,所以求阶乘不是一个难点,难点在于如何将结果输出显示在屏幕上。

求阶乘可以采用递增法,从2开始依次乘到N,如N 等于AL 中的数值则跳出循环。

n的阶乘的公式

n的阶乘的公式

n的阶乘的公式n的阶乘是指从1乘到n的连续整数相乘的结果,通常用符号n!表示。

在数学中,n的阶乘是一个非常重要的概念,它在组合数学、概率论、微积分等领域都有广泛的应用。

本文将介绍n的阶乘的公式及其应用。

首先,我们来看n的阶乘的公式。

n的阶乘可以用递归或迭代的方式来计算。

递归的公式如下:n! = n * (n-1)!其中,n!表示n的阶乘,n-1!表示n-1的阶乘。

这个公式的意思是,n的阶乘等于n乘以n-1的阶乘。

递归的终止条件是n=0或n=1,此时n的阶乘为1。

另一种计算n的阶乘的方法是迭代。

迭代的公式如下:n! = 1 * 2 * 3 * ... * n这个公式的意思是,n的阶乘等于从1到n的连续整数相乘的结果。

迭代的过程中,我们从1开始,每次乘以下一个整数,直到乘到n为止。

n的阶乘的公式在实际应用中有很多用途。

首先,它在组合数学中被广泛使用。

组合数学研究的是集合的组合和排列问题,而n的阶乘正是用来计算排列的数量。

例如,如果有n个物体,要从中选取k个进行排列,那么排列的数量就是n的阶乘除以(n-k)的阶乘。

这个公式在排列组合问题的解决中起到了重要的作用。

其次,n的阶乘的公式在概率论中也有应用。

在概率论中,我们经常需要计算事件的可能性。

如果有n个事件,每个事件发生的概率相等且互不影响,那么这n个事件同时发生的概率就是它们各自发生概率的乘积。

而n的阶乘正好可以用来计算这个乘积。

例如,如果有6个骰子,每个骰子的点数是1到6之间的整数,那么同时掷出6个骰子,出现某个特定的点数的概率就是(1/6)^6,其中1/6是每个骰子出现特定点数的概率。

最后,n的阶乘的公式在微积分中也有应用。

在微积分中,我们经常需要计算函数的导数和积分。

而n的阶乘可以用来表示多项式函数的导数和积分。

例如,如果有一个多项式函数f(x) = a_n * x^n + a_(n-1) * x^(n-1) + ... + a_1 * x + a_0,其中a_i是常数,那么f(x)的n次导数就可以表示为f^(n)(x) = n! * a_n,其中f^(n)(x)表示f(x)的n次导数。

n的阶乘程序报告

n的阶乘程序报告

HUNAN UNIVERSITY 程序设计训练报告题目求n!学生姓名学生学号专业班级学院名称指导老师2013 年 7 月11 日目录第一部分程序功能简介 (3)第二部分本人完成的主要工作 (3)第三部分设计方案 (4)(一)设计分析 (4)(二)模块的功能及程序说明 (5)(三)核心源程序模块 (7)(四)核心算法流程图 (8)(五)操作方法简介 (9)(六)实验结果 (9)(七)设计体会 (10)第四部分附录 .................................................... 错误!未定义书签。

(一)程序中主要变量的功能说明.................... 错误!未定义书签。

(二)源程序代码................................................... 错误!未定义书签。

第一部分 程序功能简介该程序是求一个大数n 的阶乘(n!),n 的值范围从1~100之间变化。

输出结果从右往左每四个数之间用一个“ ,”隔开。

第二部分 本人完成的主要工作刚开始,我尝试着通过递归函数(如下)将100!的结果算出结果发现无法得到正确结果(100的阶乘输出为0),询问后知道由于100的阶乘结果太大,用长字符串也会溢出导致无法显示,所以只能将阶乘后结果的个、十、百、千...位依次赋数给数组a[200]来解决这一问题。

数组a[200]的引入也让n 阶乘结果的位数昭然若揭,又使用for 循环使输出结果从右往左每四个数之间用一个“ ,”隔开。

最终设计出一个程序求一个大正整数数的阶乘(n!),n 的值范围从1~100之间变化(输出结果从右往左每四个数之间用一个“ ,”隔开)。

然后对程序进行编译,运行,并不断完善细节,不断优化。

第三部分设计方案(一)设计分析1、解决结果的存放问题由于是求一个大数n的阶乘,结果的很大(会溢出),无法直接输出或得到结果,所以在经过探索及请教同学之后拟定用乘法的基本原理把用户给的数据求得阶乘后的结果的个、十、百、千...位依次赋数给数组a[200] ——即a[0] =个位上的数,a[1] =十位上的数 .....以此类推。

微机原理课程设计任务书-06-计算N的阶乘

微机原理课程设计任务书-06-计算N的阶乘

微型计算机原理及应用课程设计任务书题目:计算N的阶乘学生姓名:学号:班级:题目类型:软件工程(R)指导教师:一.微型计算机原理及应用课程设计内容汇编语言是微型计算机原理及应用的基础,微机主机和接口所要实现的功能都要通过汇编语言来实现。

尽管汇编语言程序设计编程效率低,但其运行效率高、速度快。

因此掌握汇编语言是学好微机原理和接口设计的第一步。

编写计算N!的程序。

数值由键盘输入,结果在屏幕上输出。

二.微型计算机原理及应用课程设计目的1、通过求N!,掌握在汇编语言一级如何实现高级语言中的数学函数;2、熟悉汇编语言程序的编译、链接过程;三.微型计算机原理及应用课程设计的要求1、N的范围在0-65535,即不超过一个16位寄存器的容量。

2、查阅文献资料,一般在5篇以上;3、完成算法设计和程序设计、调试;4、撰写课程设计说明书;5、做好答辩工作。

四.微型计算机原理及应用课程设计思路本设计的难点在于随着N的增大,其结果远非寄存器所能容纳,因此必须将结果放在一个内存缓冲区中。

然而乘法运算只限于两个字相乘,因此要确定好算法,依次从缓冲区中取数,进行两字相乘,并将DX中的高16位作为产生的进位。

阶乘的定义为N!=N×(N-1)×(N-2)×…×2×1,从左往右依次计算,结果保存在缓冲区BUF中。

缓冲区BUF按结果由低到高依次排列。

五.微型计算机原理及应用课程设计提交的成果1. 设计说明书一份,内容包括:1) 中文摘要100字;关键词3-5个;2) 前言;3) 设计内容;4) 设计目的;5) 设计要求;6) 设计思路(包含程序流程图);7) 软件使用说明书(核心界面说明);8) 设计总结、参考文献、致谢等。

2. 刻制光盘一张。

六.设计的主要参考文献1宋杰,汪志宏,江敏,微机原理与接口技术课程设计,机械工业出版社,2005.42 周明德,微型计算机系统原理及应用习题集、习题解答与实验指导,清华大学出版社,2005.73 张开成,微型计算机原理,西南师范大学出版社,2006.84 沈美明,温冬婵, IBM-PC汇编语言程序设计第2版,清华大学出版社,2006.55 戴梅萼,史嘉权, 微型机原理与技术-习题、实验和综合训练题集,清华大学出版社,2009.4 七.各阶段时间安排(共1周):2010年6月20日。

阶乘设计实验报告

阶乘设计实验报告

阶乘设计实验报告一.问题描述输入一个自然数n,求!n,同时统计结果中有多少个0。

即编写一个输入整数n,计算并输出阶乘和结果中0的个数的程序。

二.课题分析1.首先要输入自然数n,算出n的阶乘。

分析:由于n!=1*2*3*…*n,因此采用累乘的方法,用变量S(累乘器)来存放累计乘机(初值=1),用变量i来存放乘数(即被乘的数),i=1,2,3,,,,,n,接收到n后计算n!。

2.统计结果中有多少个0分析:在text1中得到自然数n阶乘的结果,运用字符串函数统计其0的个数。

设计中运用到len(x)和min(x,m,n)函数。

用len(x)计算text1中字符串所含字符的个数,mid(x)从字符串s(text1.text=s)的第m个字符开始截取n个字符,令Mid(Text1.Text, t, 1) = "0",d为累加器,每运行一次程序,执行d=d+1。

当t截取到最后一个为0的字符串时,退出循环。

3.疑问:·输入数据n时判断是否为自然数,vb语言如何编写判断自然数的程序?·N是否有范围限制,可以无限放大吗?4.程序设计基本步骤如下:(1)建立用户界面和对象属性在窗体上建立2个文本框,5个标签和1个命令按钮。

各对象的主要属性(思考如何排列设计能使界面看上去简单整洁)(2)编写事件代码注意事项:·声明变量,选择合适的数据类型。

·输入数据的方式,text和inputbox都可以,根据情况再做考虑。

·循环结构的使用,考虑for…next循环,注意结构的完整性,不要漏掉结束语句,嵌套结构尤其注意。

·统计结果中0的个数时,可以用字符串函数,考虑left(x),Right(x),mid(x,m,n),len(x),哪种方法可以完成运算。

·累乘法,累加法的使用。

三.流程图四.相关运行界面五.调试记录:第一次调试:出现实时错误,如图所示我原先声明s as long,用的数据类型是长整型,最大不超过2 147 483 647,而13的阶乘是6 227 020 800,超过long(长整型)数据类型的范围。

计算机组成原理实验报告 N的阶乘

计算机组成原理实验报告 N的阶乘

《计算机组成原理》课程设计报告课程设计题目:N的阶乘班级:姓名:学号:完成日期:2013/10/18一、课程设计步骤1、计算机的功能和用途:实现n!=n*n-1*n-2*..*2*1的功能2、程序设计目的(1)在掌握部件单元电路实验的基础上,进一步将其组成系统构造一台基本模型计算机。

(2)使用简单模型机和复杂模型机的部分机器指令,并编写相应的微程序,具体上机调试掌握整机概念。

(3)掌握微程序控制器的组成原理。

(4)掌握微程序的编写、写入,观察微程序的运行。

(5)通过课程设计,使学生将掌握的计算机组成基本理论应用于实践中,在实际操作中加深对计算机各部件的组成和工作原理的理解,掌握微程序计算机中指令和微指令的编码方法,深入理解机器指令在计算机中的运行过程。

3、程序设计基本原理(1)实验模型机结构[1] 运算器单元(ALU UINT)运算器单元由以下部分构成:两片74LS181构成了并-串型8位ALU;两个8位寄存器DR1和DR2为暂存工作寄存器,保存参数或中间运算结果。

ALU的S0~S3为运算控制端,Cn为最低进位输入,M为状态控制端。

ALU的输出通过三态门74LS245连到数据总线上,由ALU-B控制该三态门。

[2] 寄存器堆单元(REG UNIT)该部分由3片8位寄存器R0、R1、R2组成,它们用来保存操作数用中间运算结构等。

三个寄存器的输入输出均以连入数据总线,由LDRi和RS-B根据机器指令进行选通。

[3] 指令寄存器单元(INS UNIT)指令寄存器单元中指令寄存器(IR)构成模型机时用它作为指令译码电路的输入,实现程序的跳转,由LDIR控制其选通。

[4] 时序电路单元(STA TE UNIT)用于输出连续或单个方波信号,来控制机器的运行。

[5] 微控器电路单元(MICRO-CONTROLLER UNIT)微控器主要用来完成接受机器指令译码器送来的代码,使控制转向相应机器指令对应的首条微代码程序,对该条机器指令的功能进行解释或执行的工作。

采用汇编语言实现阶乘运算-推荐下载

采用汇编语言实现阶乘运算-推荐下载

microcomputer, the microcomputer host functions and interfaces to achieve should be achieved through the assembly language. Despite the low efficiency of assembly language programming programming, but it’s high operating efficiency, and speed. Therefore, the assembly language is the first step to learn Microcomputer Principle and Interface Design. Written calculation of N! Procedures. Numerical keyboard input, output results on the screen.
汇编语言程序设计报告
课程设计题目:采用汇编语言实现阶乘运算
学 号: 10081437 姓 名: 张子琦 院 系: 测试与光电工程学院 专 业: 测控技术与仪器 指导教师: 陈振华
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术通关,1系电过,力管根保线据护敷生高设产中技工资术艺料0不高试仅中卷可资配以料置解试技决卷术吊要是顶求指层,机配对组置电在不气进规设行范备继高进电中行保资空护料载高试与中卷带资问负料题荷试2下卷2,高总而中体且资配可料置保试时障卷,各调需类控要管试在路验最习;大题对限到设度位备内。进来在行确管调保路整机敷使组设其高过在中程正资1常料中工试,况卷要下安加与全强过,看度并22工且22作尽22下可22都能22可地护以缩1关正小于常故管工障路作高高;中中对资资于料料继试试电卷卷保破连护坏接进范管行围口整,处核或理对者高定对中值某资,些料审异试核常卷与高弯校中扁对资度图料固纸试定,卷盒编工位写况置复进.杂行保设自护备动层与处防装理腐置,跨高尤接中其地资要线料避弯试免曲卷错半调误径试高标方中高案资等,料,编试要5写、卷求重电保技要气护术设设装交备备置底4高调、动。中试电作管资高气,线料中课并敷3试资件且、设卷料中拒管技试试调绝路术验卷试动敷中方技作设包案术,技含以来术线及避槽系免、统不管启必架动要等方高多案中项;资方对料式整试,套卷为启突解动然决过停高程机中中。语高因文中此电资,气料电课试力件卷高中电中管气资壁设料薄备试、进卷接行保口调护不试装严工置等作调问并试题且技,进术合行,理过要利关求用运电管行力线高保敷中护设资装技料置术试做。卷到线技准缆术确敷指灵设导活原。。则对对:于于在调差分试动线过保盒程护处中装,高置当中高不资中同料资电试料压卷试回技卷路术调交问试叉题技时,术,作是应为指采调发用试电金人机属员一隔,变板需压进要器行在组隔事在开前发处掌生理握内;图部同纸故一资障线料时槽、,内设需,备要强制进电造行回厂外路家部须出电同具源时高高切中中断资资习料料题试试电卷卷源试切,验除线报从缆告而敷与采设相用完关高毕技中,术资要资料进料试行,卷检并主查且要和了保检解护测现装处场置理设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。

微机原理课程设计报告

微机原理课程设计报告

微机原理课程设计报告班级:电信科技0801姓名:学号: 3080504016一、目的结合微型计算机原理课程的学习,进一步巩固已学的知识,同时针对微型计算机原理知识的具体应用,学会对系统中DOS和BIOS的使用,学会使用EDIT软件,弄懂汇编程序的上机过程以及如何运用DEBUG软件进行汇编程序的调试。

二、内容1.字符串匹配设计为掌握提示信息的设置方法及读取键入信息的方法。

编写程序实现两个字符串比较。

如相同,则显示“MATCH”,否则,显示“NO MATCH”。

2.接收年、月、日信息并显示的设计为掌握响铃的使用方法。

并掌握年月日输入方法,编写程序,先显示“Input the data(xxxx/xx/xx):”并响铃一次,然后接收键盘输入的信息,最后显示出来。

3.响铃设计为掌握响铃的使用方法。

编写程序,从键盘接收输入字符,如是数字N,则响N次;如不是数字,则不响。

4.计算机钢琴的设计为掌握pc机扬声器发出不同频率声音的方法和进一步掌握利用系统功能调用从键盘上读取字符的方法。

编写程序,在程序运行时使PC机成为一架可弹奏的“钢琴”。

当按下数字键1-9时,会依次发出1,2,3,4,5,6,7,高音1,高音2九个音调,按回车后退出。

5.排序设计为掌握用汇编语言编写排序程序的思路和方法。

编写程序,从首地址为1000H开始存放35个数,要求设计程序将这些数由小到大排序,排序后的数,仍放在该区域中。

6.计算N的阶乘的设计为了解高级语言中的数学函数是怎样在汇编语言一级上实现的。

编写计算N!的程序。

数值由键盘输入,结果在屏幕上输出。

N的范围是0~FFFFH,即刚好能被一个16位寄存器容纳。

三、重点内容:本次课程设计中,我做的重点内容是计算机钢琴和N的阶乘设计,计算机钢琴是我感觉比较有趣,而N的阶乘设计花的时间做多,因此此处主要介绍N的阶乘的设计内容。

(1)流程图主程序的流程图如下:开始显示请输入数字N调用get 子程序,得到的N 放入BPSI 指向结果数据缓存区ANS初始化检测是否输入错误BP=0或1?BP 值放入ANS 首地址,默认长度放入L 中BP=BP-1BP=1?CY=0,BX=0结果缓存长度L 放入CX[SI+BX]*BPAX+C(上次相乘的进位数据)DX 加1有进位?AX 放入[SI+BX]中DX 放入进位缓存C 中BX=BX+2指向ANS 的下一个数据位置CX=CX-1CX=0?DX=0?结果长度L 加1DX 放入[SI+BX]单元内ANS 结果放1显示‘the result is ’调用显示子程序返回dos 结束YesNoYesNoNoYes YesNoYes No(2)源程序代码DATA SEGMENTANS DW 5000 DUP(?) ;运算结果缓存区 SS1 DB 'Please INPUT the number(END WITH H):','$' SS2 DB 'WRONG INPUT!','$' SS3 DB 'THE RESULT IS:','$'L DW 1 ;存结果长度C DW 0 ;存上次运算进位数据ZIXING DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,41H,42H,43H,44H,45H,46H ;显示时的字形码 DATA ENDS;---------------------------------------------------------------------------- CODE SEGMENTASSUME CS:CODE,DS:DATASTART PROC FARMOV AX,DATAMOV DS,AXMOV DX,OFFSET SS1MOV AH,9INT 21H ;输出'Please INPUT the number(END WITH H):' MOV BP,00HCALL GET ;调用取数据N子程序MOV DL,0AhMOV AH,02HINT 21HMOV DI,LCMP DI,0JE ENDD ;判断是否输入错误CMP BP,01HJNA ANSWER1 ;BP=0/1MOV SI,OFFSET ANSMOV [SI],BPMNEXT: DEC BP ;N不断减1直到N=1CMP BP,1JE ANSWERNMOV C,0XOR BX,BXMOV CX,L ;长度放CXM1: MOV AX,[SI+BX]MUL BP ;上次运算结果与BP相乘ADD AX,CADC DX,0HMOV [SI+BX],AXMOV C,DXINC BXINC BX ;指向下一单元DEC CX ;目前长度减1JNZ M1CMP DX,0JZ MNEXTMOV AX,LINC AXMOV L,AX ;长度加1MOV [SI+BX],DXJMP MNEXTANSWER1:MOV SI,OFFSET ANS ;如果N=1、0,结果为1 MOV AX,1MOV [SI],AXANSWERN:MOV AH,2 ;回车MOV DL,0DHINT 21HMOV DX,OFFSET SS3MOV AH,9INT 21HCALL DISPLAY ;显示结果MOV DL,48H ;最后加一个H表示是16进制MOV AH,2INT 21HENDD: MOV AH,4CH ;返回DOSINT 21HRETSTART ENDP;----------------------------------------------------------------- GET PROC NEARNE1: MOV AH,01HINT 21HCMP AL,29H ;先判断是否输入正确0~FJNA WRONGCMP AL,39HJA N1SUB AL,30HJMP ADN1: CMP AL,40HJNA WRONGCMP AL,46HJA WRONGSUB AL,37HAD: MOV AH,00HMOV CL,4SHL BP,CLADD AX,BP ;将取到的值放入BP中MOV BP,AXJMP NE1WRONG: CMP AL,48H ;判断结束标志JNE TWRONGRETTWRONG: MOV DX,OFFSET SS2 ;判断为错误输入MOV AH,09HINT 21HMOV AX,0MOV L,AXRETGET ENDP;------------------------------------------------------------DISPLAY PROC NEARMOV BX,L ;结果长度放入BXSHL BX,1AG1: SUB BX,2 ;运算得到正确的偏移值MOV DX,[BX+SI]MOV CH,4 ;每次输出4位AG2: MOV AX,DXAND AH,0F0HPUSH BXMOV BX,OFFSET ZIXINGMOV AL,AHMOV CL,4SHR AX,CLXLAT ;查表得到输出字形POP BXPUSH DXMOV DL,ALMOV AH,02HINT 21HPOP DXSHL DX,CLDEC CHJNZ AG2CMP BX,0 ;判断是否输完JNE AG1RETDISPLAY ENDP;---------------------------------------------------------------------CODE ENDSEND START四、心得体会经过了为期一周的微机原理课程设计,我又重新掌握了微机原理汇编这门语言。

阶乘算法实验报告

阶乘算法实验报告

一、实验背景阶乘(Factorial)是数学中一个重要的概念,它表示一个正整数n的所有正整数乘积。

用数学符号表示为n!,其中n为正整数。

阶乘在数学、物理、计算机科学等领域都有广泛的应用。

本实验旨在研究阶乘算法,通过编写程序计算给定正整数的阶乘。

二、实验目的1. 了解阶乘的定义和性质;2. 掌握阶乘算法的编写方法;3. 比较不同阶乘算法的效率;4. 分析阶乘算法在实际应用中的优缺点。

三、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm四、实验内容1. 阶乘算法的基本原理阶乘算法的核心思想是递归或循环。

递归方法利用函数自身调用实现阶乘的计算,而循环方法则通过循环结构实现。

2. 阶乘算法的编写(1)递归方法```pythondef factorial_recursive(n):if n == 0:return 1else:return n factorial_recursive(n-1)```(2)循环方法```pythondef factorial_loop(n):result = 1for i in range(1, n+1):result = ireturn result```3. 不同阶乘算法的效率比较为了比较递归方法和循环方法的效率,我们可以通过计算不同输入值下两种方法的执行时间。

```pythonimport timedef test_factorial_method(method, n):start_time = time.time()result = method(n)end_time = time.time()return end_time - start_time# 测试数据n_values = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50]# 比较递归方法和循环方法的效率recursive_time = [test_factorial_method(factorial_recursive, n) for n in n_values]loop_time = [test_factorial_method(factorial_loop, n) for n in n_values]print("递归方法执行时间:")print(recursive_time)print("循环方法执行时间:")print(loop_time)```4. 阶乘算法在实际应用中的优缺点分析阶乘算法在实际应用中具有以下优缺点:优点:(1)易于理解和实现;(2)能够计算较大正整数的阶乘;(3)在数学、物理、计算机科学等领域有广泛的应用。

汇编--n阶乘

汇编--n阶乘

一、实验目的1. 掌握子程序的设计方法;2. 掌握递归子程序的设计思想;3. 体会堆栈操作在子程序嵌套中的重要作用。

二、实验原理及基本技术路线图(方框原理图)一个子程序作为调用程序去调用另一子程序,这种关系称为子程序嵌套。

由于子程序嵌套对堆栈的使用很频繁,因此还要确保堆栈有足够空间,并要注意堆栈的正确状态,这包括CALL、RET、RET N、PUSH、POP、INT、IRET等与堆栈操作有关指令的正确使用。

在子程序嵌套的情况下,如果一个子程序调用的子程序就是它自身,这样的子程序称为递归子程序。

显然递归调用是子程序嵌套的一种特殊情况。

使用递归算法往往能设计出效率较高的程序。

设计递归子程序时,必须保证每一次后继调用都不能破坏它上一次调用时所生成的参数和中间结果,并且该过程不会修改它本身。

这就意味着当使用汇编语言设计递归子程序时,必须考虑每一次调用都应该把它的参数、寄存器和所有的中间结果保存到不同的存储区域。

最好的办法是利用堆栈来存储这些信息,一次调用所保存的信息称为一帧。

递归调用要使用大量的堆栈空间,一定要保证堆栈足够大,而且也要保证堆栈的正确使用,避免死机等不可预料的情况发生。

求N!算法流程图:三、所用仪器、材料(设备名称、型号、规格等) 1. 操作系统平台:Windows Server 2003 2. 汇编环境:Microsoft MASM 5.0 3. 文本编辑器:记事本 四、实验方法、步骤1. 将MASM5.0的文件置于C:\assembly\目录下;2. 将masm.exe和link.exe所在目录(C:\assembly\MASM5)添加到Path环境变量中;3.在C:\assembly\下新建一个JC.asm文件,打开JC.asm,输入汇编程序代码;4. 运行一个命令行窗口,将当前目录切换到C:\assembly\,然后输入命令:masm JC.asm [Enter],来汇编程序,根据汇编结果查看程序代码是否有语法错误,如有,则更正保存后重新汇编,直至没有错误为止,此时会生成JC.obj文件;5. 输入命令:link JC.obj [Enter],观察输出结果,如果没有错误,则生成JC.exe;6. 输入命令:debug JC.exe [Enter],调试程序,并记录运行过程;7. 完成实验报告。

n的阶乘程序设计

n的阶乘程序设计

n的阶乘程序设计n的阶乘是一个在计算机编程中常见的问题,它指的是一个正整数n的连乘积,通常表示为n!。

例如,5! = 5 × 4 × 3 × 2 × 1 = 120。

阶乘程序设计可以采用多种不同的方法,包括递归、迭代、尾递归优化等。

下面将详细介绍几种常见的阶乘程序设计方法。

1. 迭代法迭代法是一种使用循环来计算阶乘的方法。

它从1开始,逐步乘以2、3、...直到n。

这种方法的优点是简单易懂,且在计算过程中不需要额外的内存空间。

```pythondef factorial_iterative(n):result = 1for i in range(1, n + 1):result *= ireturn result```2. 递归法递归法是一种通过函数自我调用来解决问题的方法。

在阶乘问题中,递归函数可以定义为`n! = n * (n-1)!`,当n为1时,递归终止。

```pythondef factorial_recursive(n):if n == 1:return 1else:return n * factorial_recursive(n - 1)```递归方法虽然简洁,但当n较大时,可能会导致栈溢出错误。

3. 尾递归优化尾递归是一种特殊的递归形式,它可以被编译器优化以减少内存使用。

在尾递归中,递归调用是函数体中的最后一个操作。

```pythondef factorial_tail_recursive(n, accumulator=1):if n == 1:return accumulatorelse:return factorial_tail_recursive(n - 1, n * accumulator)```尾递归优化可以减少递归调用的内存消耗,但并非所有编译器都支持这种优化。

4. 动态规划动态规划是一种通过存储中间结果来避免重复计算的方法。

在阶乘问题中,可以预先计算较小的阶乘值,并用它们来构建较大的阶乘值。

n的阶乘

n的阶乘

C语言程序设计实验报告
1实验目的
(1)熟练函数的定义方法、调用方法、参数说明以及返回值;
(2)掌握实参与形参的对应关系,以及参数之间的“值传递”的方式;
(3)掌握函数的嵌套调用及递归调用的设计方法;
(4)在编程过程中加深理解函数调用的程序设计思想。

2实验内容
(1)编写一个求任意正整数n的阶乘的函数;
(2)编写整个程序;
(3)用scanf函数输入n的值;
(4)输出n的阶乘的值。

3算法描述流程图
4源程序
5测试数据
6,8,12
6运行结果
当输入数据为6时:
当输入数据为8时:
当输入数据为12时:
7出现问题及解决方法
忽略了n=0时的情况,将n=0和n=1单独列出来,直接给出阶乘的值。

8实验心得
能熟练的定义一个新的函数来实现程序的简化和执行,学会了编程计算n的阶乘的方法。

采用汇编语言实现阶乘运算

采用汇编语言实现阶乘运算

汇编语言程序设计报告课程设计题目:采用汇编语言实现阶乘运算学号:********姓名:张子琦院系:测试与光电工程学院专业:测控技术与仪器指导教师:***采用汇编语言实现阶乘运算学生姓名:张子琦班级:10081437指导老师:陈振华摘要:汇编语言是微型计算机原理及应用的基础,微机主机和接口所要实现的功能都要通过汇编语言来实现。

尽管汇编语言程序设计编程效率低,但其运行效率高、速度快。

因此掌握汇编语言是学好微机原理和接口设计的第一步。

编写计算N!的程序。

数值由键盘输入,结果在屏幕上输出。

[1]关键字:汇编语言 N!键盘输入屏幕输出指导老师签名:Factorial implemented in assembly language Student name :Ziqi Zhang Class:10081437Supervisor:Zhenhua ChenAbstract:Assembly language is the basis of the principles and applications of the microcomputer, the microcomputer host functions and interfaces to achieve should be achieved through the assembly language. Despite the low efficiency of assembly language programming programming, but it’s high operating effi ciency, and speed. Therefore, the assembly language is the first step to learn Microcomputer Principle and Interface Design. Written calculation of N! Procedures. Numerical keyboard input, output results on the screen.Key words:Assembly language N! Keyboard input Screen outputSignature of Supervisor:目录1 背景[2] (1)1.1汇编语言 (1)1.2设计概述 (2)2 功能描述 (2)3 详细设计 (2)3.1原理及设计思路 (2)3.2流程图 (3)3.3源程序代码[1][2] (4)4 运行过程 (8)4.1编译源程序 (8)4.2汇编 (8)4.3连接并生成可执行文件 (9)4.4运行程序 (9)5 心得体会 (10)6 参考文献 (10)7 致谢 (11)1 背景[2]1.1汇编语言汇编语言是直接面向处理器(Processor)的程序设计语言。

递归程序设计 求N阶乘

递归程序设计 求N阶乘

(一)实验名称递归程序设计求N阶乘(二)实验内容和要求设计一个汇编程序完成y=n!的计算。

要求:(1)能够根据用户输入的n值计算其阶乘,结果以十进制数显示;(2)基于递归程序结构,模块划分合理,具有清晰的入口和出口。

(三)实验目的(1)感受和学习递归程序的设计方法、技巧,完成递归程序设计(2)学会运用堆栈传递参数的方法和技巧(3)进一步感受和学习汇编语言程序设计的方法、技巧和调试过程(四)实验日期、时间和地点时间:2010年11月22日地点:微机高级实验室(五)实验环境(说明实验用的软硬件环境及调试软件)使用masm for windows(六)实验步骤(只写主要操作步骤,要简明扼要,还应该画出程序流程图或实验电路的具体连接图)(七)实验结果(经调试通过的源程序的所有代码,应包含必要的说明文字)DATAS SEGMENTOPE DW 0,0,0,0RESULT DB 16 DUP(0),'H',0DH,0AH,0AH,'$'NUM DB 3,0,3 DUP(0)MESS1 DB'Please input N(key Enter to quit):',0DH,0AH,'$' ERR_MESS DB'Error number,try again!',0DH,0AH,0AH,'$'FUNC DB 0,0,'!','=','$'DATAS ENDSSTACKS SEGMENT STACKDW 1000 DUP(?)STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSDS_STR MACRO BUF ;显示字符串的宏PUSH DXPUSH AXLEA DX,BUFMOV AH,09HINT 21HPOP AXPOP DXENDM ;——————————————————————————————————————SR_STR MACRO BUF;输入字符串的宏PUSH DXPUSH AXLEA DX,BUFMOV AH,0AHINT 21HPOP AXPOP DXENDM ;——————————————————————————————————————START:MOV AX,DATASMOV DS,AXMOV ES,AXLOP1:MOV CX,16;对RESULT清零LEA DI,RESULTMOV AL,0REP STOSBMOV CX,4;对OPE清零LEA DI,OPEMOV AX,0REP STOSWDS_STR MESS1;显示提示信息SR_STR NUM;输入NMOV DL,0AH;输出换行MOV AH,2HINT 21HCMP [NUM+1],0;直接回车则退出JZ OVERCMP [NUM+1],1JNZ LABEL_2CMP [NUM+2],'1';输入一位数,是1~9,则继续,否则输出错误信息,并跳转到开始JB ERR_NUMCMP [NUM+2],'9'JA ERR_NUMMOV BL,[NUM+2];把输入的ASCII码转换成数字存入BX中SUB BL,30HMOV BH,0JMP GO_ONLABEL_2:CMP [NUM+2],'1';输入二位数,是10~99,则继续,否则输出错误信息, JB ERR_NUMCMP [NUM+2],'9'JA ERR_NUMCMP [NUM+3],'0'JB ERR_NUMCMP [NUM+3],'9'JA ERR_NUMMOV AL,[NUM+2];把输入的ASCII码转换成数字存入BX中SUB AL,30HMOV BL,10MUL BLMOV BL,[NUM+3]SUB BL,30HMOV BH,0ADD BX,AXGO_ON:MOV [OPE],BX;循环初始化MOV CX,BXDEC CXJCXZ CX_ZERODO1:DEC BXCALL MUL_bigLOOP DO1JMP GO_ON1CX_ZERO:MOV [OPE],1GO_ON1:MOV AX,[OPE];将结果转换成ASCII码LEA DI,RESULTADD DI,15CALL BIN_TO_NUMMOV AX,[OPE+2]CALL BIN_TO_NUMMOV AX,[OPE+4]CALL BIN_TO_NUMMOV AX,[OPE+6]CALL BIN_TO_NUMCMP [NUM+1],1;输出'n!='JE NUM_EQU_1MOV AL,[NUM+2]MOV [FUNC],ALMOV AL,[NUM+3]MOV [FUNC+1],ALLEA DX,FUNCJMP OUTPUT_STRNUM_EQU_1:MOV AL,[NUM+2]MOV [FUNC+1],ALLEA DX,FUNCINC DXOUTPUT_STR:MOV AH,9HINT 21HLEA SI,RESULT;从第一个非零的地方输出结果,然后回到开始DEC SILOOP1:INC SICMP BYTE PTR [SI],30HLOOPZ LOOP1MOV AH,9HMOV DX,SIINT 21HJMP LOP1ERR_NUM:DS_STR ERR_MESS;输出错误信息,然后回到开始JMP LOP1OVER:MOV AH,4CHINT 21HMUL_big PROC NEAR;相乘,完成OP1和BX的乘,结果保存在OPE起始的四个字里PUSH AXPUSH SIPUSH DIPUSH CXPUSH DXMOV CX,BXDEC CXJCXZ NEXTMOV AX,[OPE]MOV SI,[OPE+2]MOV DI,[OPE+4]MOV DX,[OPE+6]DO:ADD [OPE],AXADC [OPE+2],SIADC [OPE+4],DIADC [OPE+6],DXLOOP DONEXT:POP DXPOP CXPOP DIPOP SIPOP AXRETMUL_big ENDPBIN_TO_NUM PROC NEAR;将AX中的十六进制数转换成相应ASCII码,结果保存在[DI]~[DI+3]中PUSH CXPUSH BXMOV CX,4AGAIN:PUSH CXMOV CX,4AGAIN1:RCR AX,1RCR BL,1LOOP AGAIN1SHR BL,1SHR BL,1SHR BL,1SHR BL,1CMP BL,9JBE LABEL_BEADD BL,7LABEL_BE:ADD BL,30HMOV [DI],BLDEC DIPOP CXLOOP AGAINPOP BXPOP CXRETBIN_TO_NUM ENDPCODES ENDSEND START。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

科技学院课程设计报告( 2012—2013 年度第一学期)课程:微机原理及应用题目:计算N的阶乘院系:动力工程系班级:学号:学生姓名:指导教师:设计周数:一周成绩:日期:2013年1 月11 日《微机原理及应用》课程设计任务书一、目的与要求1.通过对微机系统分析和具体设计,使学生加深对所学课程的理解。

2.掌握汇编语言程序设计的基本方法和典型接口电路的基本设计方法。

3.培养学生分析问题、解决问题的能力。

4.培养学生对微型计算机应用系统的基本设计能力。

5.提高学生的实践动手能力和创新能力。

二、主要内容设计题目:计算N的阶乘。

数值N由键盘输入,N的范围为0~65535,结果在屏幕上显示。

1.针对所选择的设计题目进行硬件设计,合理选用所需元器件,绘制系统结构框图、硬件接线图,并在实验系统上完成电路的连接和调试。

2.根据所选题目的要求对微机系统进行程序设计,绘制程序总体流程图并编写源程序上机调试。

3.写出课程设计报告,对整个设计过程进行归纳和综合,对设计中所存在的问题和不足进行分析和总结,提出解决的方法、措施、建议和对这次设计实践的认识和收获。

三、进度计划四、设计成果要求1.系统硬件设计合理,软件编程达到设计要求。

2.系统硬件结构图和软件流程图绘制清楚规范。

3.设计报告完整规范。

五、考核方式根据设计任务的完成情况、课程设计报告撰写情况及演示答辩情况采用五级记分制评定成绩。

学生姓名:指导教师:一、课程设计目的与要求1.通过对微机系统分析和具体设计,使学生加深对所学课程的理解。

2.掌握汇编语言程序设计的基本方法和典型接口电路的基本设计方法。

3.培养学生分析问题、解决问题的能力。

4.培养学生对微型计算机应用系统的基本设计能力。

5.提高学生的实践动手能力和创新能力二、课程设计正文1.程序正文CRLF MACROMOV AH,02HMOV DL,0DHINT 21HMOV AH,02HMOV DL,0AHINT 21HENDM ;回车换行DATA SEGMENTMESS1 DB ‘INPUT THE NUMBER ACCORDING TO HEXNUM!’,0DH,0AH, ‘$’ MESS2 DB ‘THE RESULT IS:’,0DH,0AH, ‘$’ERROR DB ‘INPUT ERROR!’,0DH,0AH, ‘$’LEN DW 1CYY DW ?BUF DW 256 DUP (0)DATA ENDSSTACK SEGMENTSTA DW 32 DUP (?)TOP DW ?STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKSTART: MOV AX,DATAMOV DS,AXMOV ES,AXMOV SP,TOPMOV AH,09HMOV DX,OFFSET MESS1INT 21H ;显示输入提示信息CALL GETNUM ;读取键入的N值MOV BP,DX ;N值送BPCMP BP,0JZ EEECMP BP,1JZ EEE ;N=0或N=1则转EEEMOV SI,OFFSET BUF ;缓冲区首址MOV [SI],DX ;缓冲区初始化为值NXXX: DEC BP ;N值减1CMP BP,0001HJZ LLL ;若为1则转LLLXOR BX,BX ;偏移指针清0MOV WORD PTR [CYY],0 ;进位单元请0MOV CX,[LEN] ;当前结果长度送CXTTT: MOV AX,[SI+BX]MUL BP ;相乘ADD AX,[CYY] ;加低位进位JNC JJJ ;结果元进位转JJJINC DX ;有进位将高位单元加1JJJ: MOV [SI+BX],AX ;结果送缓冲区中MOV [CYY],DX ;高位送进位单元INC BXINC BX ;1个字长度LOOP TTT ;循环CMP DX,0000HJZ BBB ;最后1次的进位为0则转BBBINC WORD PTR [LEN] ;长度加1MOV [SI+BX],DX ;进位送缓冲区中BBB: JMP XXXEEE: MOV SI,OFFSET BUFMOV WORD PTR [SI],1 ;结果为1LLL: MOV AH,09HMOV DX,OFFSET MESS2INT 21H ;显示表头MOV CX,[LEN]MOV BX,CX ;长度DEC BXSHL BX,1 ;1个字为2个字节CCC: MOV AX,[SI+BX]CALL DISPDEC BXDEC BX ;显示结果LOOP CCCMOV AX,4C00H ;结束INT 21HDISPP PROC NEARMOV BL,ALMOV DL,BLMOV CL,04ROL DL,CLAND DL,0FHCALL DISPLMOV DL,BLAND DL,0FHCALL DISPLRETDISPP ENDPDISPL PROC NEARADD DL,30HCMP DL,3AHJB DDDADD DL,27HDDD: MOV AH,02HINT 21HRETDISPL ENDPDISP PROC NEAR ;显示子程序,按十六进制数方式显示AX中的数PUSH BXPUSH CXPUSH DXPUSH AX ;入栈保存MOV AL,AHCALL DISPP ;显示高字节POP AXCALL DISPP ;显示低字节POP DXPOP CXPOP BXRETDISP ENDPGETNUM PROC NEARPUSH CXXOR DX,DXGGG: MOV AH,01HINT 21H ;读取键入字行的ASCⅡ码送ALCMP AL,0DHJZ PPPCMP AL,20HJZ PPP ;是回车键或空格键则转PPPSUB AL,30HJB KKK ;非字符转KKKCMP AL,0AHJB GETS ;在‘0~9’间转GETSCMP AL,11HJB KKK ;非字符转KKKSUB AL,07HCMP AL,0FHJBE GETS ;在‘A~F’间转GETSCMP AL,2AHJB KKKCMP AL,2FHJA KKK ;不在‘a~f’间转KKKSUB AL,20H ;‘a~f’的ASCⅡ码值→16进制数GETS: MOV CL,04SHL DX,CLXOR AH,AHADD DX,AX ;将本次键入的数字加进DX中JMP GGG ;接受下一个键入的数字KKK: MOV AH,09HMOV DX,OFFSET ERRORINT 21H ;显示输入出错信息PPP: PUSH DXCRLF ;回车换行POP DXPOP CXRETGETNUM ENDPCODE ENDSEND START2.程序框图计算N!的流程三、课程设计总结1、程序运行中的问题及解决方案在进行编程调试运行后,以输入5为例结果为0078H,但是运行DOS中显示的为007800,后面多显示为2个0,错误!返回DOS后,点击窗口——DOS,显示的为正常结果!2、心得体会此次课程设计我们收获颇多。

课程设计开始时我们要从各个方面上把握这个课题。

只有这样才能设计出合理的,全面的设计思路与方案,并且能较好反映着一个实际问题,并把课程设计理论与现实实际相联系起来,以达到该设计思路的适应性和本质性,最终达到素质化教育的要求。

通过三人的团队协作主动解决自己学科内的关键问题,这有助于提高我们的思维素质拓展的综合能力,并能本质上加强团队协作意识,是未来社会对我们大学生的硬性要求。

也是我们每个大学生必须具备的一项基本素质,能够提高我们透过现象看本质的基本技能和一定的创新思维能力。

课程设计中个人的力量是不及群体的力量的,我们三个人分工合作,做事的效率高了很多。

虽然有时候会为了一些细节争论不休,但最后得出的总是最好的结论。

而且课程设计也教会我们在团队中要善于与人相处,与人共事,不要一个人解决所有问题。

总之,这次课程设计对于我们有很大的帮助,通过课程设计,我更加深入地理解了微机原理课程上讲到的知识,同时加深了对于程序编写的认识,同时在自己编程时熟悉了汇编程序的编写过程和运行过程,最后还提高了自己的动手能力。

感谢老师的悉心指导。

四、参考文献[1]马平、姚万业、王炳谦编著《微机原理及应用》中国电力出版社2003年4月[2]戴梅萼、史嘉权编著《微型机原理与技术(习题、实验和综合训练习题集)》清华大学出版社第二版2009年4月[3]余春喧、施远征、左国玉编著《80X86微机原理与接口技术——习题解答与实验指导》机械工业出版社2008年3月[4]陆红伟编著《微机原理实验与课程设计指导书》中国电力出版社2006年8月。

相关文档
最新文档