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

一、实验目的1. 理解阶乘的概念。
2. 掌握阶乘的计算方法。
3. 通过编程实现阶乘的计算。
二、实验原理阶乘(Factorial)是指一个正整数n的阶乘,记作n!,定义为从1乘到n的所有正整数的乘积。
即:n! = n × (n-1) × (n-2) × ... × 2 × 1当n=0时,0的阶乘定义为1,即0! = 1。
三、实验环境1. 操作系统:Windows 102. 编程语言:Python3.8.53. 编辑器:PyCharm四、实验步骤1. 设计一个函数,用于计算阶乘。
2. 通过用户输入,获取需要计算的阶乘数。
3. 调用函数,计算阶乘结果。
4. 输出阶乘结果。
五、实验代码```pythondef factorial(n):if n == 0:return 1else:return n factorial(n-1)# 获取用户输入num = int(input("请输入一个正整数:"))# 计算阶乘result = factorial(num)# 输出结果print(f"{num}的阶乘为:{result}")```六、实验结果与分析1. 当输入0时,程序输出结果为1,符合0的阶乘定义。
2. 当输入1时,程序输出结果为1,符合1的阶乘定义。
3. 当输入一个大于1的正整数时,程序能够正确计算出阶乘结果。
七、实验总结1. 通过本次实验,我们了解了阶乘的概念和计算方法。
2. 我们掌握了使用递归函数实现阶乘计算的方法。
3. 实验过程中,我们遇到了一些问题,如递归深度过大导致程序崩溃等,通过查阅资料和调试代码,成功解决了这些问题。
八、实验拓展1. 可以尝试使用循环结构实现阶乘计算。
2. 可以编写一个函数,用于计算任意正整数的阶乘。
3. 可以研究阶乘在数学、物理、计算机科学等领域的应用。
微机原理实验报告---汇编语言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相差很大。
输入正整数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以内数的阶乘班级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的阶乘)

目录一、实验要求.......................... . (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,对程序进行编译。
用汇编语言计算N阶乘(0到FFFFH)

用汇编语言计算N阶乘(0到FFFFH)一、设计题目编写计算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所示。
图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进制数。
四、程序流程图五、程序清单data1 segmentinput1 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(?) ;保存1—N(后一个数覆盖前一个数)str2 dw 7000h dup(?) ;N!乘积的值(1)p dw 100 dup(?) ;上一个乘积的高16位data1 endsdata2 segmentstr3 dw 7fffh dup(?) ;N!乘积的值(2)data2 endscode segmentassume cs:code,ds:data1,es:data2org 100h ;程序从偏移地址100h开始执行start: mov ax,data1 ;程序初始化mov ds,axmov ax,data2mov es,ax ;初始化结束mov ah,9lea dx,input1int 21hmov ah,2 ;回车mov dl,0dhint 21hmov ah,2 ;换行mov dl,0ahint 21hmov ah,0ah ;输入所需求的N值(N为16进制数)lea dx,input2int 21hmov ah,2mov dl,0dhint 21hmov ah,2mov dl,0ahint 21hlea bx,input2mov al,[bx+1] ;判断输入的N值是否超过FFFFH cmp al,4ja s1mov cl,4 ;把输入的N值有ASCH码转成16进制数mov ah,[bx+2]mov al,[bx+3]cmp al,39hja abc1def1: shl al,clcmp ah,39hja abc2def2: shr ax,clmov dh,almov ah,[bx+4]mov al,[bx+5]cmp al,39hja abc3mov cl,4def3: shl al,clcmp ah,39hja abc4def4: shr ax,clmov dl,al ;转换结束mov ax,dx ;判断N值是否为0cmp ax,0jz s2jmp s3abc1: sub al,37hjmp def1abc2: sub ah,37hjmp def2abc3: sub al,37hjmp def3abc4: sub ah,37hjmp def4s1: mov ah,9 ;若N值超过FFFFH的输出lea dx,errorint 21hjmp nexts2: mov ah,9 ;N值为1的输出lea dx,output1int 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 ptr[p+10],0 ;(n-1)!的乘积的高16位与n相乘后积的低16位和(n-1)!的乘积的低16位与n相乘后积的高16位的和的进位,初始进位为0 mov ah,9lea dx,output2int 21hmov ah,2mov dl,0dhint 21hmov ah,2mov dl,0ahint 21hlop2: mov [p+2],bxlop3: mov ax,[si] ;(n-1)!的乘积从最低16位的内容与n相乘mov dx,[str1]mul dxclcadd ax,[p+10] ;前一次的进位与当前乘积的低16位内容相加jnc k1 ;判断是否产生进位mov WORD ptr[p+10],1add ax,[p] ;前一个积的高16位与现在积的低16位相加jmp k2k1: add ax,[p]jnc k3 ;判断是否产生进位mov WORD ptr[p+10],1jmp k2k3: mov WORD ptr[p+10],0k2: mov [si],axmov [p],dxadd si,2dec bxcmp bx,0jnz lop3mov bx,[p+2]clcadd dx,[p+10]cmp dx,0jz re ;判断(n-1)!乘积的最高16位内容与n的乘积的高16位是否为0inc bxmov [si],dxre: mov ax,[str1]cmp ax,9000h ;判断是N!乘积的内容高位部分是否要存到es 中jnc re1jmp re2re1: cmp cx,1ja s4re2: inc WORD ptr[str1] ;乘数增1lea si,str2mov WORD ptr[p],0mov WORD ptr[p+10],0loop lop2dec bxmov cx,bxlop4: add si,2loop lop4inc bxadd bx,bxinc sijmp lop5s4: inc WORD ptr[str1] ;若N的值超过8000h,8000h*8001h*8002h*N mov [p+6],bxmov [p+8],bxlea si,str2lea di,str3mov es:[di],dxmov WORD ptr[p],0mov WORD ptr[p+10],0mov bx,1dec cxlop6: mov [p+4],bxlop7: mov ax,[si]mov dx,[str1]mul dxclcadd ax,[p+10]jnc k4mov WORD ptr[p+10],1add ax,[p]jmp k5k4: add ax,[p] ;前一个积的高16位与现在积的低16位相加,产生进位jnc k6mov WORD ptr[p+10],1jmp k5k6: mov WORD ptr[p+10],0k5: mov [si],axadd si,2mov [p],dxdec WORD ptr[p+6]mov ax,[p+6]cmp ax,0jnz lop7mov ax,[p+8]mov [p+6],axlop8: mov ax,es:[di]mov dx,[str1]mul dxclcadd ax,[p+10]jnc k7mov WORD ptr[p+10],1add ax,[p]jmp k8k7: add ax,[p] ;前一个积的高16位与现在积的低16位相加,产生进位jnc k9mov WORD ptr[p+10],1 jmp k8k9: mov WORD ptr[p+10],0 k8: mov es:[di],axadd di,2mov [p],dxdec bxcmp bx,0jnz lop8mov bx,[p+4]clcadd dx,[p+10]cmp dx,0jz re4inc bxmov es:[di],dxre4: inc WORD ptr[str1] lea si,str2lea di,str3mov WORD ptr[p],0mov WORD ptr[p+10],0 dec cxcmp cx,0jnz lop6dec bxmov cx,bxlop9: add di,2loop lop9inc bxinc dilop10: dec bx ;若N>8000h,输出N!乘积的高位内容mov al,BYTE ptr es:[di]mov ch,almov cl,4shr al,clcmp al,09hja op3add al,30hjmp ip3op3: add al,37hip3: mov ah,2mov dl,alint 21hmov al,chand al,0fhcmp al,09hja op4add al,30hjmp ip4op4: add al,37hip4: mov ah,2mov dl,alint 21hdec dicmp bx,0jnz lop10mov bx,[p+6]dec bxmov cx,bxlop11: add si,2loop lop11inc bxadd bx,bxinc silop5: dec bx ;输出N!的乘积mov al,BYTE ptr [si]mov ch,almov cl,4cmp al,09hja op1add al,30hjmp ip1op1: add al,37hip1: mov ah,2mov dl,alint 21hmov al,chand al,0fhcmp al,09hja op2add al,30hjmp ip2op2: add al,37hip2: mov ah,2mov dl,alint 21hdec sicmp bx,0jnz lop5next: mov ah,1int 21hmov ah,4chint 21hcode endsend start六、程序运行结果与分析若输入的16进制数N为000A(10进制为10),程序运行后输出的N!应为375F00(H)。
汇编语言实现阶乘

汇编语⾔实现阶乘java递归实现阶乘static int fact(int n) {if (n == 0) {return 1;}return fact(n - 1) * n;}public static void main(String[] args) {System.out.println(fact(5));}汇编实现阶乘# 开始递归函数调⽤addiu $sp, $0, 0x10010080 # 初始化栈地址# 压栈⼊参addiu $s0, $0, 5 # n=5sw $s0, 0($sp) # n=5 压栈addiu $sp, $sp, -4 # 栈指针-4jal FACT # 跳转fact函数(FACT只是标志位,并没有函数)跳转地址:a1nopj END # 跳转END,结束nopFACT: # fact函数体# 压栈返回地址sw $ra, 0($sp) # 跳转地址压栈:a1 a2 a3 a4 a5 a6addiu $sp, $sp, -4 # 栈指针-4#读取⼊参lw $s0, 8($sp) # 读取⼊参 n=5 4 3 2 1 0#压栈返回值sw $0, 0($sp) # 返回值压栈(占位)0 0 0 0 0 0addiu $sp, $sp, -4 # 栈指针-4#递归base条件# if (n == 0) { return 1}bne $s0, $0, RECURSION # 如果5!=0则跳转RECURSION 4!=0 3!=0 2!=0 1!=0nop# 读取下返回地址lw $t1, 8($sp) # a6# 出栈:返回值,返回地址addiu $sp, $sp, 8 # 站指针+8# 压栈返回值addiu $s0, $zero, 1 # return 1sw $s0, 0($sp) # 栈 a6->1addiu $sp, $sp, -4 # 栈指针-4jr $t1 # 跳转:a6nopRECURSION : # recursion# return fact(n-1) * n#压栈参数addiu $s1, $s0, -1 # 参数4 (n-1) 3 2 1 0sw $s1, 0($sp) # 参数压栈:4 3 2 1 0addiu $sp, $sp, -4 # 栈指针-4jal FACT # 跳转fact函数跳转地址:a2 a3 a4 a5 a6nop# 现在的栈是什么样⼦的?参数 | 返回地址 | 返回值 | ⼦函数的参数 | ⼦函数的返回值 | 当前SP# 当前参数lw $s0, 20($sp) # 加载参数:1 2 3 4 5# ⼦函数返回值lw $s1, 4($sp) # 返回值 1 1 2 6 24# 返回地址lw $t1, 16($sp) # 返回地址:a5 a4 a3 a2mult $s1, $s0 # 1X1 1x2 2x3 6x4 24x5mflo $s2 # 1x1=1 1x2=2 2x3=6 6x4=24 24x5=120# 出栈:addiu $sp, $sp, 16 # 栈指针+16# 返回值压栈sw $s2, 0($sp) # 栈a5->1 a4->2 a3->6 a2->24 a1->120addiu $sp, $sp, -4 # 栈指针-4jr $t1 # 跳转:a5 a4 a3 a2 a1nopEND:使⽤MARS模拟器编写汇编是完全⾯向过程的语⾔,是CPU指令的可读形式汇编从上往下顺序执⾏,⾼级语⾔中的流程控制语句如if,while等在汇编中就是各种跳转。
汇编语言实验报告

计算机学院实验报告(2016 ~2017学年度第二学期)课程名称汇编语言程序设计实验名称计算阶乘学号20154480506 姓名张扬专业班级5班软件工程地点第一实验楼教师凌云一.实验题目用汇编语言编写程序计算阶乘N!数值有键盘输入,结果在屏幕上面输出。
二.流程图三.实验代码代码要配合程序界面进行说明源代码:DATAS SEGMENTSTRING DB "Please input a number(0-10000):" ,0dh,0ah ;提示用户输入数字字串WRONGSTRING DB "Wrong input!!! Please input a number ! ",0ah,0dh,'$';用户输入错误提示INPUTBUFFER DB 6,?,6 DUP(?);开辟出(留出)6个初值未知的字节单元空间C10 DW 10 ;输入时进制转换的数N DW ? ;要求阶乘的数M DW ? ;步长T DW ? ;进位I DW ?OUTPUTBUFFER DW 30000 DUP(?);开辟出(留出)30000个初值未知的字单元空间DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXMAIN PROC ;主程序;----------------------------------------------CALL INPUT ;调用输入子程序CALL FAC ;调用递归实现阶乘MOV CX,DIROUTPUT: ;输出结果PUSH CXMOV DI,CXCALL OUTPUT ;显示输入的数字POP CXDEC CXCMP CX,0JGE ROUTPUTDISPLAYLENGTH: ;显示长度MOV Dl,0DHMOV AH,2INT 21HMOV Dl,0AHMOV AH,2INT 21hEXIT: ;退出MOV AH,07HINT 21HMOV AX,4C00HINT 21HMAIN ENDP;---------------------------------------------- INPUT PROC NEAR ;输入子程序LEA BX,STRING ;指向输入字符的地址 MOV CX, 33 ;循环的次数DISSTRING:MOV Dl,[BX]MOV AH,2 ;显示一个字符在屏幕上 INT 21HINC bxLOOP DISSTRING ;循环输出显示JMP INPUTINITWRONGINPUT: ;用户输入错误提示LEA DX,WRONGSTRINGMOV AH,9INT 21HINPUTINIT: ;输入初始化LEA DX,INPUTBUFFER ;装载输入缓冲区首地址MOV AH,0AH ;输入功能代码INT 21H ;从键盘输入一个数,以回车键结束 MOV AX,0 ;累加器清0MOV Cl,INPUTBUFFER+1 ;循环次数MOV CH,0LEA BX,INPUTBUFFER+2 ;装载字符存放区首地址INPUTONE: ;输入过程MUL C10 ;乘以要转换成的进制数MOV Dl,[BX]CMP Dl,'0' ;判断输入是否小于0JB WRONGINPUTCMP Dl,'9'JA WRONGINPUT ;判断某位上的数字是否大于9AND Dl,0FHADD Al,DlADC AH,0 ;带进位的加法INC BX ;加1LOOP INPUTONE ;循环输入MOV N,AX ;显示低位MOV Dl,0DHMOV AH,2INT 21HMOV Dl,0AH ;显示高位MOV AH,2INT 21HRETINPUT ENDP;----------------------------------------------FAC PROC NEARMOV CX,N ;取阶乘的次数nMOV I,1DMOV M,0DPUSH DXMOV DI,0DMOV AX,DIMOV BX,2Dmul BX ;计算n!=n*(n-1)!MOV SI,AX ;将n!的值保存在si中pop DXMOV OUTPUTBUFFER[SI],1D CTRLI:MOV T,0MOV DI,0DCTRLDI:CMP DI,M JBE DONE jmp CMPC DONE:PUSH DX MOV AX,DI MOV BX,2Dmul BX MOV SI,AXPOP DXMOV AX,OUTPUTBUFFER[SI] MOV BX,I MUL BX ADD AX,TADC DX,0MOV BX,10000 DIV BX MOV T,AXPUSH DX MOV AX,DI MOV BX,2D MUL BX MOV SI,AXPOP DXMOV OUTPUTBUFFER[SI],DX INC DIJMP CTRLDI CMPC:CMP T,0 JA THREE1 JMP NEXT THREE1:INC MMOV AX,T MOV OUTPUTBUFFER[SI+2],AXNEXT:INC ICMP CX,0JNG IF0LOOP CTRLIIF0:MOV DI,MRETFAC ENDP;---------------------------------------------OUTPUT PROC NEARC2:PUSH DXMOV AX,DIMOV BX,2Dmul BXMOV SI,AXPOP DXMOV BX,OUTPUTBUFFER[SI]BID PROC ;判断位数MOV CX,10000MOV AX,BXMOV DX,0DIV CXMOV BX,DXMOV CX,1000CALL DDIVMOV CX,100CALL DDIVMOV CX,10CALL DDIVMOV CX,1CALL DDIVRETBID ENDP;---------------------------------------------- DDIV PROC ;除法子程序MOV AX,BXMOV DX,0DIV CXMOV BX,DXMOV Dl,AlADD Dl,30HMOV ah,02HINT 21HRETDDIV ENDPRETOUTPUT ENDP;----------------------------------------------CODES ENDSEND START四.运行过程以及结果1. 输入数字4,显示的结果应该为24,下图表明结果正确2. 输入数字5,显示的结果应该为120,下图表明结果正确3. 当输入的字符不是数字而是其他时,程序会给出提示错误信息4. 输入数字6,显示的结果应该为720,下图表明结果正确5. 输入数字8,显示的结果应该为40320,下图表明结果正确6. 输入数字9,显示的结果应该为362880,下图表明结果正确7. 输入数字10,显示的结果应该为3628800,下图表明结果正确8. 输入数字15,显示的结果应该为1307674368000,下图表明结果正确9. 输入数字20,显示的结果应该为2432902008176640000,下图表明结果正确10. 输入数字30,由上面的运行结果得知,下图显示结果在理论上应该正确11. 输入数字80,由上面的运行结果得知,下图显示结果在理论上应该正确11. 输入数字100,由上面的运行结果得知,下图显示结果在理论上应该正确五.实验总结1. 本次实验的目的是通过对子程序的应用来实现对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] =十位上的数 .....以此类推。
实验七、计算N! 实验报告

实验七、计算N!实验报告【实验内容】编写COM文件格式程序,完成如下功能:1.从命令行接收一位十进制数据(0 … 9 ),存入AX寄存器。
2.计算接收数据的阶乘,3.在屏幕上以十进制数据显示结果【原理分析】输入与输出的程序已经给出,因此只需要编写程序实现阶乘的部分。
阶乘以函数递归调用实现,通过堆栈完成参数的传递,并将结果保存在DX: AX中。
【算法框图】【实验步骤】1.分析问题,画出算法框图。
2.编写COM格式汇编语言程序。
3.在DOS下编辑、汇编、连接程序。
4.用Debug调试程序。
5.在DOS下运行并分析结果。
【实验代码】code segment para 'code'assume cs:code, ds:code, es:code, ss:codeorg 100hmain proc nearcmp byte ptr ds:[80h], 2jnz errormov al, byte ptr ds:[82h]cmp al, '0'jb errorcmp al, '9'ja errorand al, 0fhxor ah, ahcall factor //调用n!函数push ax //将结果压栈,以免在下面输出时会被修改push dxlea dx, msgmov ah, 09hint 21hpop dx //将DX弹出pop ax //将AX弹出call DispResultjmp short ret_doserror:lea dx, err_msgmov ah, 09hint 21hret_dos:int 20hmain endpDispResult proc near ; 将结果转换为十进制并显示mov si, offset bufmov bx, 10loop1: div bxmov [si], dlor ax, axjz dispinc sixor dx, dxjmp short loop1disp: mov dl, [si]or dl, 30hmov ah, 2int 21hdec sicmp si, offset bufjnb dispmov dl, 0dhmov ah, 2int 21hmov dl, 0ahmov ah, 2int 21hretDispResult endpfactor proc near //阶乘函数cmp ax, 0 //比较AX与0jne nextmov ax, 1 //若AX=0,则将AX赋为1,DX清零,函数返回xor dx, dxjmp exitnext: push ax //若AX!=0,则将AX压栈,AX自减一,递归调用阶乘函数sub ax, 1call factorpop cx //较低一层函数返回后,将栈内的值(原本层中AX的值)弹出,mul cx //作为CX,并将AX乘上CX,函数返回exit:retfactor endpmsg db 'Result = $'err_msg db 'Error Parameter !', 0dh, 0ah, '$'buf db 10 dup(?)code endsend main【实验结果】5!=1200!=11!=19!=362880。
微机原理课程设计任务书-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的阶乘班级:姓名:学号:完成日期: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)微控器主要用来完成接受机器指令译码器送来的代码,使控制转向相应机器指令对应的首条微代码程序,对该条机器指令的功能进行解释或执行的工作。
汇编语言上机实验报告1

汇编语言上机实验报告1汇编语言上机实验报告1实验内容:1.编写一个程序,求解给定整数的阶乘并输出结果。
2.编写一个程序,求解斐波那契数列中的第n个数并输出结果。
实验步骤:1.阶乘程序:编写一个汇编程序,通过输入一个整数n,求解n的阶乘。
程序流程如下:1.1.定义变量n,用于保存输入的整数。
1.2.将n与0进行比较,如果n为0,则直接将1输出作为阶乘的结果,并跳转到程序结束;否则继续执行下一步。
1.3.将n的值保存到寄存器中,并将n减1,保存到n中。
1.4.将n与0进行比较,如果n为0,则直接跳转到程序结束;否则继续执行下一步。
1.5.将n的值与寄存器中保存的值相乘,将结果保存到寄存器中。
1.6.将n减1,保存到n中并跳转到第4步。
1.7.输出寄存器中的结果作为阶乘的结果,并跳转到程序结束。
2.斐波那契数列程序:编写一个汇编程序,通过输入一个整数n,求解斐波那契数列中的第n个数。
程序流程如下:2.1.定义变量n,用于保存输入的整数。
2.2.将n与0进行比较,如果n为0,则直接将0作为结果输出,并跳转到程序结束;否则继续执行下一步。
2.3.将n与1进行比较,如果n为1,则直接将1作为结果输出,并跳转到程序结束;否则继续执行下一步。
2.4.将n的值保存到寄存器中,并将n减1,保存到n中。
2.5.将n与0进行比较,如果n为0,则跳转到第9步;否则继续执行下一步。
2.6.将n减1,保存到n中并跳转到第7步。
2.7.将n的值与寄存器中保存的值相加,将结果保存到寄存器中。
2.8.将n减1,保存到n中并跳转到第5步。
2.9.输出寄存器中的结果作为斐波那契数列中第n个数的结果,并跳转到程序结束。
实验结果:1.阶乘程序运行结果:请输入一个整数:55的阶乘为:1202.斐波那契数列程序运行结果:请输入一个整数:6斐波那契数列中第6个数为:8实验总结:通过本次实验,我学习了如何在汇编语言中编写程序解决一些基本的数学问题。
阶乘算法实验报告

一、实验背景阶乘(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阶乘

一、实验目的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. 完成实验报告。
Linux下汇编语言------计算n的阶乘

Linux下汇编语⾔------计算n的阶乘⽤⾼级语⾔⽐⽅C语⾔写个阶乘⾮常easy,那如今就来熟悉下Linux使⽤AT&T汇编格式写⼀个程序来计算阶乘吧写法⼀是使⽤跳转指令实现。
写法⼆是使⽤函数来实现约定:本程序没有将结果打印在标准输出上。
须要使⽤GDB调试查看写法⼀#as filename.s -o filename.o#ld filename.o -o filename# gdb filename.section .data.section .text.globl _start_start:movl $1, %eax #result = 1movl $6, %ecx # n = 5cmpl $1, %ecxjle .loop_exit.start_loop:imull %ecx, %eaxsubl $1, %ecxcmpl $1, %ecxjge .start_loopmovl %eax, %ebxmovl $1, %eaxint $0x80.loop_exit:movl $1, %eaxint $0x80--------------------函数写法待更新-------------------------写法⼆:函数递归.section .data.section .text.globl _start_start:pushl $5call .JCmovl %eax, %ebxmovl $1, %eaxint $0x80.JC:pushl %ebpmovl %esp, %ebppushl %ebxsubl $4, %espmovl 8(%ebp), %ebx #get n = 5;movl $1, %eax #result = 1;cmpl $1, %ebxjle .L1leal -1(%ebx), %eaxmovl %eax, (%esp)call .JCimull %ebx, %eax.L1:addl $4, %esppopl %ebxpopl %ebpret查看结果:echo $?当然使⽤gdb来查看,会更明确。
采用汇编语言实现阶乘运算

汇编语言程序设计报告课程设计题目:采用汇编语言实现阶乘运算学号:********姓名:张子琦院系:测试与光电工程学院专业:测控技术与仪器指导教师:***采用汇编语言实现阶乘运算学生姓名:张子琦班级: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!

DA TA SEGMENTINPUT_TIPS DB 10, 13, "INPUT THE N (0~8): $"OUTPUT_TIPS DB 10, 13, "THE N! IS : $"DA TA ENDS;--------------------------------------------STACK SEGMENT;INPUT STACK SEGMENT CODE HEREDB 256 DUP(?)STACK ENDS;--------------------------------------------CODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX, DA TAMOV DS, AX;----------------------------------MOV DX, OFFSET INPUT_TIPSMOV AH, 9 ;显示字符串.INT 21HMOV AH, 1 ;输入到ALINT 21HCMP AL, '0'CMP AL, '8'JA EXITSUB AL, '0'MOV AH, 0CMP AX, 0 ;是0 吗?JNZ CMP_1MOV AX, 1 ;是0 就去显示1JMP DISPCMP_1:CMP AX, 1 ;是1 吗?JZ DISP ;是1 就去显示1MOV CX, AX ;非0 非1,就是其它数字,那么CALL FACTOR ;就用递归的方法去计算阶乘;----------------------------------DISP:PUSH AXMOV DX, OFFSET OUTPUT_TIPSMOV AH, 9 ;显示字符串.INT 21HPOP AXMOV BX, 10L1:MOV DX, 0DIV BXPUSH DXINC CXAND AX, AXJNZ L1L2:POP DXADD DL, 48MOV AH, 2INT 21HLOOP L2;----------------------------------EXIT:MOV AH, 4CHINT 21H;================================== FACTOR PROC NEAR ;阶乘.DEC CX ;CX=2~8CMP CX, 1 ;=1 ?JE FACTOR_E ;为1就退出PUSH CX ;非1压栈保存CALL FACTOR ;递归调用,把CX一次次的减一POP CX ;弹出一个个递减的数值MUL CX ;乘到AXFACTOR_E:RET ;AX=(2~8)!FACTOR ENDP ;简洁明了,无与伦比;==================================CODE ENDSEND START。
n的阶乘汇编语言

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;宏定义print_str macro x;宏定义输出字符串lea dx,xmov ah,9int 21hendm;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DATAS SEGMENT;此处输入数据段代码n dw ?;存放该数flag dw 0;判断是否输入为非数字str1 db 'input the number:$'str2 db '!=$'str3 db 0ah,0dh,'again?(enter means stop,others means continue):$'str4 db '-------------------------------the max num is 8!--------------------------------',0ah,0dh,'$' error db 0ah,0dh,'not a num!$'enter1 db 0ah,0dh,'$'DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码dw 20 dup(?)STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AX;此处输入代码段代码print_str str4begin1:print_str str1call input;将输入的数赋给ncmp flag,0jne again1mov dx,0mov ax,ncall outputprint_str str2mov dx,0mov ax,1mov bx,ncall rankcall outputagain1:print_str str3mov ah,1int 21hmov bl,alprint_str enter1cmp bl,0dhjne begin1MOV AH,4CHINT 21H;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;子程序input proc;输入push axpush bxpush cxmov bx,0mov ax,0mov cx,10loop1:xchg ax,bxmul clxchg ax,bxadd bx,axmov ah,1int 21hcmp al,0dhje end1sub al,30hjb error1cmp al,9ja error1cbwjmp loop1error1:print_str errormov flag,1jmp end2end1:print_str enter1mov flag,0mov n,bxpop cxpop bxpop axretinput endpoutput proc;输出push axpush bxpush cxpush dxmov cx,0loop2:mov bx,10div bxadd dx,30hpush dxinc cxcmp ax,0je end3cwdjmp loop2end3:pop dxmov ah,2int 21hloop end3pop dxpop cxpop bxpop axret output endprank proc;求阶层cmp bx,0jz end4mul bxdec bxcall rankretend4:mov bx,1mul bxrank endp CODES ENDSEND START。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微机原理实验报告-------颜色的排列组合方式
院系:自动化
班级:
学号:
姓名:
日期:
成绩:
1.题目
在实际中,有红黄蓝绿等7种颜色,按照排列组合方式,分别计算出有多少种排列方式?如果减少一种颜色,又有多少中排列呢?
2.题目分析
题目中给去n种(n=7)颜色,要求我们计算可能出现的组合种数,这是数学中常见的排列组合问题。
题目的意思是指的传统的排列组合,不许有重复颜色的,否则与生活习惯就不符合了。
这个咱们就熟悉了,对于n种颜色,应该有n
A种排列方式。
我们知道,
n
n
A在数值上就是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,0DH
MOV AH,2
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
ENDM
STACK SEGMENT STACK ;初始定义
DW 100 DUP(?)
STACK ENDS
DATA SEGMENT
STRING DB 'ENTER SORT OF COLOUR: ','$' ;输入提示字符串RESULT1 DB 5 DUP(0) ;用来存储结果的各位数字DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV DX,OFFSET STRING
MOV AH,9
INT 21H
MOV AH,1 ;输入样色的种类
INT 21H
SUB AH,AH
SUB AL,30H
MOV CX,AX ;颜色的种类用来控制循环
CRLF
MOV AX,1
MOV BX,1
LP:
MUL BX
INC BX
LOOP LP
LEA DI,RESULT1 ;LP循环求阶乘
MOV BX,10
MOV CX,4
LOOP1:
DIV BX
MOV [DI],DL ;LOOP1将16进制转为10进制INC DI
SUB DX,DX
LOOP LOOP1
DEC DI
MOV CX,4
DISPLAY: ;DISPLAY用来显示10进制的各位数字ADD BYTE PTR[DI],30H
MOV DL,[DI]
MOV AH,2
INT 21H
DEC DI
LOOP DISPLAY
MOV AX,4C00H
INT 21H
CODE ENDS
END START
5.运行结果
6. 结果讨论
排列中数是颜色种类n的阶乘,比较5种6种和7种的数值可发现,120,720和5450相差很大。
种类和排列方式不是成简单的线性关系,跳跃很大。
可以想象,当颜色总类增加到10种以上是,结果会更庞大。