ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:55.28KB ,
资源ID:8702145      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8702145.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(大数阶乘与快速排序算法汇编教材.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

大数阶乘与快速排序算法汇编教材.docx

1、大数阶乘与快速排序算法汇编教材微机原理课程设计说明书设计题目:大数阶乘与排序专 业 班 级 学 生 指导教师 2014 年 春季 学期一课设目的与要求1.课设目的:检验和提高学生在汇编语言程序设计,微机原理与接口应用方面分析问题与解决问题的能力2.题目要求 :1).要求实现用汇编语言编写设计一个求解大数的阶乘精确值的程序;采用字节型数组存放阶乘结果的每个数字位,采用逐位相乘,再对每一位规格化来实现;输出结成结果的位数及尾零的个数。2).用汇编语言编写设计快速排序与希尔排序程序,注意合理使用堆栈,以避免堆栈溢出,进一步动态显示排序过程。二基本原理1.大数阶乘原理设计:我们在处理一个大于一定范围的

2、数的阶乘时,无论使用什么类型去保存运算结果都必然会发生溢出,这势必会导致运算结果出错。使用数组来模拟数字,这样无论结果数字有多大,只要数组的长度够长就能表示出来,用这个办法可以进行大数据的运算。2排序原理设计:快速排序原理:首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。三架构设计核心思想就是把计算结果每一位上的数字保存到一个数组成员中,例如:把112保存至数组中,保存结果应该是result0 2result1 1result2 1把整个数组看成一个数字,这个数字和一个数相乘的时候,需要每一位都

3、和这个乘数进行相乘运算还需要把前一为的进位加上。运算方法和小学数学是一样的,乘积的个位是当前位上应该表示的数字,10位以上的需要进位。因为乘数不可能大于10000,所以乘数和一个小于10的书相乘的时候不会大于100000,再加上前一位的进位用一个int型数据来保持这个结果就没有问题。写法如下:int 结果 = resultx * 乘数 + 进位;每一位的计算结果有了,把这个结果的个位数拿出来放到这个数组元素上:resultx = 结果%10;接下来的工作就是计算出进位:进位 = 结果 / 10;这样一位一位的把整个数组计算一遍,最后可能还有进位,用同样的方法,把进位的数值拆成单个数字,放到相应

4、的数组元素中。最后输出一下结果,从最高位吧数字打印一遍就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步中,没找到符合条件的值,即3中Aj不小于key,4中Ai不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交

5、换的时候i, j指针位置不变。另外,i=j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。希尔排序原理:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2d1重复上述的分组和排序,直至所取的增量dt=1(dtdt-ld2d1),即所有记录放在同一组中进行直接插入排序为止4方案实现与测试大数阶乘源代码:include io32.inc.datainfoMsg byte 请输入你要求的阶乘,13,10,0errorMsg byte 你输入的数小于0,13,10,0account byt

6、e 阶乘的位数为:,13,10,0zeroaccount byte 尾零的个数为:,13,10,0inputnum dword 0bufferNum dword 100000 dup (0),0temp dword 0arrayNum dword 1carry dword 0.codestart:mov eax,1mov bufferNum0,eaxmov eax,offset infoMsgcall dispmsgcall readsidmov inputnum ,eaxcmp eax,0jl DONE;输入的数小于0;输入的数不小于0mov ebx,2OUTER:cmp ebx,input

7、numjg FINISH;完成计算 外层循环用ebxmov ecx,1mov eax,0mov carry,eaxFLAG1:cmp ecx,arrayNumjg OUTIN;大于1跳出内循环 内层循环用ecxmov eax,ebxmul bufferNumecx*4-4add eax,carryadc edx,0;还要加进位标志,也就是说加了上一步的进位push ebxmov ebx,0ahdiv ebxpop ebxmov bufferNumecx*4-4,edxmov carry,eaxinc ecxjmp FLAG1OUTIN:cmp carry,0jz FLAG2mov eax,1a

8、dd 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,edx;保存余数到数组mov edx,0mov eax,carrypush ebxmov ebx,0ahdiv ebxpop ebxmov carry,eaxjmp OUTIN ;循环保存余数直到进位只剩个位FLAG2:inc ebxjmp OUTERFIN

9、ISH:;输出结果mov ecx,arrayNumFLAG3:cmp ecx,0jle OVERmov eax,bufferNumecx*4-4call dispsidmov eax,0dec ecxjmp FLAG3DONE:cmp edi,0je OVERmov eax,offset errorMsgcall dispmsgOVER:call dispcrlfMOV eax,offset accountcall dispmsgMOV eax,arrayNumcall dispuidcall dispcrlfmov ecx,1mov edi,0zero:mov eax,bufferNumec

10、x*4-4cmp eax,0jne F0inc ediinc ecxcmp ecx,arrayNumjge F0jmp zeroF0:MOV eax,offset zeroaccountcall dispmsgmov eax,edicall dispuidcall dispcrlfexit 0end start快速排序源代码:include io32.inc includelib msvcrt.lib ;这里是引入类库 相当于 #include了 printf PROTO C :PTR DWORD, :VARARG ;声明一下我们要用的函数头 MAXSIZE =1000.data count

11、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 快速(降序)排序结果如下:,10,13,0 notice byte .testing.,10,13,0.code dumparray PROC array:PTR DWORD, arrsize:DWORD mov eax,offset notice call dispmsg mov EBX, offset arrBytes

12、 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 printf, OFFSET szFormat1 RET dumparray ENDP readInArray proc pCount:DWORD xor ebx,ebx again: mov eax,offset in_msg call dispmsg xor eax,eax call readsid cmp eax,0 jl DO

13、NE mov arrBytes4*ebx,eax inc ebx jmp again DONE: mov count,ebx ret readInArray endpqsort PROC array:PTR DWORD, lowitem:DWORD, highitem:DWORD 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, EA

14、X 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 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, EA

15、X 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 arrB

16、ytes, 0, EAX mov eax,offset out_msg call dispmsg INVOKE dumparray, ADDR arrBytes, count RETend main大数阶乘测试结果截图:快速排序测试结果截图:5分析总结经过了一周的努力,我们终于完成本次课设任务。看似普普通通的题目真正动起手来还真心无从下手,困难重重。比如说是大数阶乘,首先由于它和我们传统意义上计算阶乘有着很大的区别,所以接受一个新的理念就是一件难事,然后把其转换为程序代码的操作又是一大难事。所以以后要多多动手,想的和做的还有很大区别。总之我们这周收获挺大,复习了算法,熟悉了汇编。六参考文献【1】 钱晓捷 ,微机原理与接口技术,西安,机械工业出版社,2008年【2】 胡元义 ,数据结构教程,西安,西安电子科技大学出版社,2010年

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1