




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、微机原理课程设计说明书设计题目:大数阶乘与排序专 业 班 级 学 生 指导教师 2014 年 春季 学期 目录目录1一课设目的与要求21.课设目的22.题目要求2二基本原理2 1.大数阶乘原理设计22.排序原理设计2三架构设计2四方案实现与测试3五分析总结6六参考文献6一课设目的与要求1.课设目的:检验和提高学生在汇编语言程序设计,微机原理与接口应用方面分析问题与解决问题的能力2.题目要求 :1).要求实现用汇编语言编写设计一个求解大数的阶乘精确值的程序;采用字节型数组存放阶乘结果的每个数字位,采用逐位相乘,再对每一位规格化来实现;输出结成结果的位数及尾零的个数。2).用汇编语言编写设计快速排
2、序与希尔排序程序,注意合理使用堆栈,以避免堆栈溢出,进一步动态显示排序过程。二基本原理1.大数阶乘原理设计:我们在处理一个大于一定范围的数的阶乘时,无论使用什么类型去保存运算结果都必然会发生溢出,这势必会导致运算结果出错。使用数组来模拟数字,这样无论结果数字有多大,只要数组的长度够长就能表示出来,用这个办法可以进行大数据的运算。2排序原理设计:快速排序原理:首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。三架构设计核心思想就是把计算结果每一位上的数字保存到一个数组成员中,例如:把112保存至数组
3、中,保存结果应该是result0 2result1 1result2 1把整个数组看成一个数字,这个数字和一个数相乘的时候,需要每一位都和这个乘数进行相乘运算还需要把前一为的进位加上。运算方法和小学数学是一样的,乘积的个位是当前位上应该表示的数字,10位以上的需要进位。因为乘数不可能大于10000,所以乘数和一个小于10的书相乘的时候不会大于100000,再加上前一位的进位用一个int型数据来保持这个结果就没有问题。写法如下:int 结果 = resultx * 乘数 + 进位;每一位的计算结果有了,把这个结果的个位数拿出来放到这个数组元素上:resultx = 结果%10;接下来的工作就是计
4、算出进位:进位 = 结果 / 10;这样一位一位的把整个数组计算一遍,最后可能还有进位,用同样的方法,把进位的数值拆成单个数字,放到相应的数组元素中。最后输出一下结果,从最高位吧数字打印一遍就OK了。一趟快速排序的算法是:1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;2)以第一个数组元素作为关键数据,赋值给key,即key=A0;3)从j开始向前搜索,即由后开始向前搜索(j-),找到第一个小于key的值Aj,将Aj赋给Ai;4)从i开始向后搜索,即由前开始向后搜索(i+),找到第一个大于key的Ai,将Ai赋给Aj;5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的
5、值,即3中Aj不小于key,4中Ai不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i=j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。希尔排序原理:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<<d2<d1),即所有记录放在同一组中进行直接插入排序为止4 方案实现与测试大数阶乘源代码:inc
6、lude io32.inc.datainfoMsg byte '请输入你要求的阶乘',13,10,0errorMsg byte '你输入的数小于0',13,10,0account byte '阶乘的位数为:',13,10,0zeroaccount byte '尾零的个数为:',13,10,0inputnum dword 0bufferNum dword 100000 dup (0),0temp dword 0arrayNum dword 1carry dword 0.codestart:mov eax,1mov bufferNum
7、0,eaxmov eax,offset infoMsgcall dispmsgcall readsidmov inputnum ,eaxcmp eax,0jl DONE;输入的数小于0;输入的数不小于0mov ebx,2OUTER:cmp ebx,inputnumjg FINISH;完成计算 外层循环用ebxmov ecx,1mov eax,0mov carry,eaxFLAG1:cmp ecx,arrayNumjg OUTIN;大于1跳出内循环 内层循环用ecxmov eax,ebxmul bufferNumecx*4-4add eax,carryadc edx,0;还要加进位标志,也就是说
8、加了上一步的进位push ebxmov ebx,0ahdiv ebxpop ebxmov bufferNumecx*4-4,edxmov carry,eaxinc ecxjmp FLAG1OUTIN:cmp carry,0jz FLAG2mov eax,1add arrayNum,eax;所用到的数组的个数mov edx,0mov eax,carrypush ebxmov ebx,0ahdiv ebxpop ebxpush edxmov eax,arrayNumpush ebxmov ebx,04hmul ebxpop ebxsub eax,4 pop edxmov bufferNumeax,
9、edx;保存余数到数组mov edx,0mov eax,carrypush ebxmov ebx,0ahdiv ebxpop ebxmov carry,eaxjmp OUTIN ;循环保存余数直到进位只剩个位FLAG2:inc ebxjmp OUTERFINISH:;输出结果mov ecx,arrayNumFLAG3:cmp ecx,0jle OVERmov eax,bufferNumecx*4-4call dispsidmov eax,0dec ecxjmp FLAG3DONE:cmp edi,0je OVERmov eax,offset errorMsgcall dispmsgOVER:c
10、all dispcrlfMOV eax,offset accountcall dispmsgMOV eax,arrayNumcall dispuidcall dispcrlfmov ecx,1mov edi,0zero:mov eax,bufferNumecx*4-4cmp eax,0jne F0inc ediinc ecxcmp ecx,arrayNumjge F0jmp zeroF0:MOV eax,offset zeroaccountcall dispmsgmov eax,edicall dispuidcall dispcrlfexit 0end start快速排序源代码:include
11、 io32.inc includelib msvcrt.lib ;这里是引入类库 相当于 #include了 printf PROTO C :PTR DWORD, :VARARG ;声明一下我们要用的函数头 MAXSIZE =1000.data count dword 0 arrBytes DWORD MAXSIZE dup (0) szFormat BYTE " %d", 09h, 0 szFormat1 BYTE 0ah, 0 ;换行 in_msg byte '请输入排序数据(-1 结束)',10,13,0 out_msg byte '快速(降序
12、)排序结果如下:',10,13,0 notice byte '.testing.',10,13,0.code dumparray PROC array:PTR DWORD, arrsize:DWORDmov eax,offset noticecall dispmsg mov EBX, offset arrBytes mov ECX, arrsize xor ESI, ESI Tag1:push ecx INVOKE printf, OFFSET szFormat, DWORD PTR EBX+ESI pop ecx add ESI, 4 LOOP Tag1 INVOKE
13、 printf, OFFSET szFormat1 RET dumparray ENDP readInArray proc pCount:DWORD xor ebx,ebx again:mov eax,offset in_msgcall dispmsgxor eax,eaxcall readsidcmp eax,0jl DONEmov arrBytes4*ebx,eaxinc ebxjmp again DONE:mov count,ebx ret readInArray endpqsort PROC array:PTR DWORD, lowitem:DWORD, highitem:DWORD
14、LOCAL pivot:DWORD ;定义局部变量 MOV EBX, array MOV EDX, lowitem MOV ESI, lowitem MOV EDI, highitem CMP ESI, EDI JGE TagEnd MOV EAX, DWORD PTR EBX+EDX*4 MOV pivot, EAX MOV EAX, EDI SUB EAX, ESI MOV ECX, EAX INC EDX Tag1: MOV EAX, pivot CMP EAX, DWORD PTR EBX+EDX*4 JL Tag2 JMP Tag3 Tag2: MOV EAX, DWORD PTR
15、EBX+EDX*4 XCHG EAX, DWORD PTR EBX+ESI*4+4 MOV DWORD PTR EBX+EDX*4, EAX MOV EAX, DWORD PTR EBX+ESI*4 XCHG EAX, DWORD PTR EBX+ESI*4+4 MOV DWORD PTR EBX+ESI*4, EAX INC ESI Tag3: INC EDX LOOP Tag1 DEC ESI PUSH ESI INVOKE qsort, array, lowitem, ESI POP ESI INC ESI INC ESI INVOKE qsort, array, ESI, highitem TagEnd: RETqsort ENDPmain : invoke readInArray ,addr count xor eax,eax INVOKE dumparray, ADDR arrBytes, count MOV EAX, count DEC EAX INVOKE qsort, ADDR arrBytes, 0, EAX mov eax,offset out_msg call dispmsg INVOKE dumparray, ADDR arrBytes, count RETend main大数阶乘测试结果截图:快速排序测试结果截图:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 急性肝衰竭护理查房
- 中班社会教育教案:电话
- 国外城市综合体案例赏析
- 陕西省榆林市定边县2025年数学四年级第二学期期末检测试题含解析
- 陕西省汉中市南郑区2025年数学三下期末综合测试模拟试题含解析
- 陕西省渭滨中学2025届高三模拟训练(三)物理试题含解析
- 陕西省西安工业大附属中学2024-2025学年初三下学期半期联合考试物理试题含解析
- 陕西省西安市碑林区实验小学2024-2025学年四年级数学第二学期期末经典模拟试题含解析
- 陕西省西安市阎良区2024-2025学年高三数学试题B版查缺补漏题含解析
- 妇科常见急腹症及急救护理措施
- 骨关节病的健康教育
- 静疗横断面调查护理
- DB45T 1056-2014 土地整治工程 第2部分:质量检验与评定规程
- 2025年3月《提振消费专项行动方案》解读学习课件
- 人教版 数学一年级下册 第三单元 100以内数的认识综合素养评价(含答案)
- 房屋市政工程生产安全重大事故隐患判定标准(2024版)宣传海报
- 2024年秋儿童发展问题的咨询与辅导终考期末大作业案例分析1-5答案
- DL∕T 796-2012 风力发电场安全规程
- 中医治疗失眠课件
- 2024年天津生态城投资开发有限公司招聘笔试参考题库附带答案详解
- 元素周期表中英文读音(共3页)
评论
0/150
提交评论