微机原理课程设计-杨辉三角课程设计.doc_第1页
微机原理课程设计-杨辉三角课程设计.doc_第2页
微机原理课程设计-杨辉三角课程设计.doc_第3页
微机原理课程设计-杨辉三角课程设计.doc_第4页
微机原理课程设计-杨辉三角课程设计.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

常熟理工学院课程设计报告 课程设计报告课程 微机原理课程设计 题目 杨辉三角实现 系 别 物理与电子工程学院 年 级 09 专 业 电子信息工程 班 级 电信(2)班 学 号 1604092010 学生姓名 师骏 指导教师 职 称 设计时间 2012-3-192012-3-31 目 录引言 2第一章杨辉三角简介 21.1杨辉三角历史 21.2 杨辉三角性质 2第二章汇编语言简介 42.1 汇编语言概况 42.2汇编语言优点及缺点 4第三章程序设计流程图 6第四章子程序设计 74.1 输入子程序 74.2杨辉三角算法子程序 84.3计算输出数字长度子程序 94.4计行前数字间空格子程序 94.5输出子程序 11结束语 13参考文献 13附录 14附录A 14附录B 18杨辉三角实现引言中国古代数学家在数学的许多重要领域中处于遥遥领先的地位。中国古代数学史曾经有自己光辉灿烂的篇章,而杨辉三角的发现就是十分精彩的一页。杨辉三角形,又称贾宪三角形,帕斯卡三角形,是二项式系数在三角形中的一种几何排列。第一章 杨辉三角简介1.1 杨辉三角历史 北宋人贾宪约1050年首先使用“贾宪三角”进行高次开方运算。11世纪中国宋代数学家杨辉在详解九章算法里讨论这种形式的数表,并说明此表引自11世纪前半贾宪的释锁算术,并绘画了“古法七乘方图”。故此,杨辉三角又被称为“贾宪三角”。元朝数学家朱世杰在四元玉鉴(1303年)扩充了“贾宪三角”成“古法七乘方图”。意大利人称之为“塔塔利亚三角形”(Triangolo di Tartaglia)以纪念在16世纪发现一元三次方程解的塔塔利亚。在欧洲直到1623年以后,法国数学家帕斯卡在13岁时发现了“帕斯卡三角”。布莱士帕斯卡的著作Trait du triangle arithmtique(1655年)介绍了这个三角形。帕斯卡搜集了几个关于它的结果,并以此解决一些概率论上的问题,影响面广泛,Pierre Raymond de Montmort(1708年)和亚伯拉罕棣美弗(1730年)都用帕斯卡来称呼这个三角形。1.2 杨辉三角性质 1、每行数字左右对称,由1开始逐渐变大,然后变小,回到1。2、第n行的数字个数为n个。3、第n行数字和为2(n1)。(2的(n-1)次方)4、每个数字等于上一行的左右两个数字之和。可用此性质写出整个帕斯卡三角形。5、将第2n+1行第1个数,跟第2n+2行第3个数、第2n+3行第5个数连成一线,这些数的和是第2n个斐波那契数。将第2n行第2个数,跟第2n+1行第4个数、第2n+2行第6个数这些数之和是第2n-1个斐波那契数。6、第n行的第1个数为1,第二个数为1(n-1),第三个数为1(n-1)(n-2)/2,第四个数为1(n-1)(n-2)/2(n-3)/3依此类推。7.两个未知数和的n次方运算后的各项系数依次为杨辉三角的第(n+1)行。 图1-2-1 杨辉三角 图 1-2-2 杨辉三角数学公式第二章 汇编语言简介2.1 汇编语言概况根据本次设计要求:通过汇编语言编写汇编程序要求能够在提示信息下,从计算机键盘任意输入一个数据,在输出提示信息后显示相应的杨辉三角。下面对汇编语言作简单的介绍。汇编语言(AssemblyLanguage)是面向机器的程序设计语言。在汇编语合中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。于是汇编语言亦称为符号语言。使用汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理系统软件。汇编程序把汇编语言翻译成机器语言的过程称为汇编。汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。汇编语言,作为一门语言,对应于高级语言的编译器,需要一个“汇编器”来把汇编语言原文件汇编成机器可执行的代码。高级的汇编器如MASM,TASM等等为我们写汇编程序提供了很多类似于高级语言的特征,比如结构化、抽象等。在这样的环境中编写的汇编程序,有很大一部分是面向汇编器的伪指令,已经类同于高级语言。现在的汇编环境已经如此高级,即使全部用汇编语言来编写windows的应用程序也是可行的,但这不是汇编语言的长处。汇编语言的长处在于编写高效且需要对机器硬件精确控制的程序。2.2 汇编语言优点及缺点汇编语言直接同计算机的底层软件甚至硬件进行交互,它具有如下一些优点:(1)能够直接访问与硬件相关的存储器或I/O端口;(2)能够不受编译器的限制,对生成的二进制代码进行完全的控制;(3)能够对关键代码进行更准确的控制,避免因线程共同访问或者硬件设备共享引起的死锁;(4)能够根据特定的应用对代码做最佳的优化,提高运行速度;(5)能够最大限度地发挥硬件的功能。同时还应该认识到,汇编语言是一种层次非常低的语言,它仅仅高于直接手工编写二进制的机器指令码,因此不可避免地存在一些缺点:(1)编写的代码非常难懂,不好维护;(2)很容易产生bug,难于调试;(3)只能针对特定的体系结构和处理器进行优化;(4)开发效率很低,时间长且单调。第三章 程序设计流程图首先程序开始时在电脑上显示输入提示信息,提醒输入的操作数只能是1到10之间的正整数,超过这个范围或太小则显示提示信息输入的数过大。得到杨辉三角的阶数之后即调用一个算法子程序来求相应阶数的每一个数值,每求出一个数值即将其数压入堆栈中保存起来,方便以后输出数字时直接调用。算完之后,通过外层循环di计数输出每一行,与此同时又通过内层循环si计数输出一行中的每一个数,在输出数字时通过调用show子程序将数字均以十进制输出,在输出数值的时候通过showspace函数来控制数与数之间的空格及行前空格的输出,上半部分的数字输出之后将其所有数值及空格格式都存在一个预制的存储单元内,然后直接实现逆序输出,这样最终能在屏幕中打印出一个菱形的杨辉三角。主程序流程图如图3.1示: 图3.1 主程序流程图第四章 子程序设计4.1 输入子程序输入用int 16 ah为0这一功能,从键盘读字符,字符存在al中,输入时用cmp判断令其只能输入字符09每次输入的字符转化为十进制存并阔展为字存入ax中,再将ax与初始为0的bp交换,再将ax乘以十后与bp相加,结果存在bp中,再返回输入,这样就能输入两位数。shur proc push cx push bx xor bp,bp mov bx,10 mov cx,2input: mov ah,0 ;键盘输入数据存在al中 int 16h cmp al,0dh ;以回车结束输入 jz ok cmp al,0 ;只允许输入09 jb input cmp al,9 ja input mov ah,0eh ;显示有效输入 int 10h sub al,30h ;化ASCII为十进制 cbw ;字节扩展为字 xchg ax,bp mul bx ;扩大10倍 add bp,ax ;加一位loop inputok:nop ;数值结果在BP中 pop bx ;恢复用到的寄存器 pop cx retshur endp4.2杨辉三角算法子程序求某m行n列的数C(n, m)时采用递归的方法求出该数具体算法是: C(n, m) = 1 (n m) 即某位置组合数等于上一行左右两数之和,先算出左肩上的数并压栈保存,再次调用C过程求出右肩上的数并压栈保存,左肩与右肩的数相加从而可以求出下一行的组合数吗,其间存在递归调用,直至求出最大的那个数才返回初始调用的call的下一个语句。C procpush bp mov bp, sp sub sp, 2 ; 预留一个存储位置 mov bx, bp+6 ; 保存m到bx cmp bx, bp+4 ; 如果m n 返回1 jz L1 cmp bx, 0 ; 如果m = 0 返回1 jz L1 mov ax, bp+4 ; 保存n到ax dec ax; ax = ax - 1 dec bx; bx = bx - 1 push bx push ax call C ; 返回上一行左边的那个数 mov bp-2, ax ; 保存左肩膀上的数 mov ax, bp+4 ; 以下5句同理,返回上一行右肩膀上的数 dec ax push bp+6 push ax call C add ax, bp-2 ; 和左肩膀上的数相加得出该组合数 jmp L2L1: mov ax, 1L2: mov sp, bp pop bp ret 4 ; ax返回组合数C endp4.3 计算输出数字长度子程序将此数不断除以十,每除一次计数加1,当al即商为0时停止返回计数值即长度。例如:计算输出数字最大长度以便分配行间行前空格时,n阶的最大数应该是最后一行中间那个数即C(n, n/2) ,将此数不断除以十,每除一次计数加1,当al即商为0时停止返回计数值即最大长度。getdigit proc push dx mov bx, 10 xor dx, dxnext: cmp ax, 0 jle ok2 div bl and ax, 0ffh inc dx jmp nextok2: mov ax, dx pop dx retgetdigit endp4.4 计行前数字间空格子程序先定义一个可以接受输入ax个空格的子程序输出行前空格时,n阶杨辉三角的i行行前空格数=(n-i)*cl ,cl是最大长度,某数与下一个数字间空格数=数的最大长度cl+cl-该数的长度。具体程序如下:call showspace ; 输出行前空格 xor si, si ; 内存循环计数si,内层循环输出一行中的每个数 jmp cp2up2: inc si ; 更新dicp2: cmp si, di ; 测试循环条件,循环di次 jg done2 push si push di call C ; 获取该行的位于si位置的组合数,调用C(di, si) push ax ; 保存该组合数 push bx mov bx ,dx mov bx, ax inc dx inc dx pop bx call show ; 输出该数 mov ax, cx sub ax, 1 push bx mov bx ,dx mov bx, ax inc dx inc dx pop bx call showspace pop ax call getdigit ; 获取该组合数长度 mov bx, ax mov ax, cx sub ax, bx ; add ax, 1 push bx mov bx ,dx mov bx, ax inc dx inc dx pop bx call showspace jmp up2 ; 更新内层循环showspace: push dx mov bx, ax mov ah, 2 mov dl, nexts: cmp bx, 0 jle dones int 21h dec bx jmp nextsdones: pop dx4.5输出子程序 输出分为上半部分和下半部分,上半部分输出利用2号功能将每个数除以10将余数转化为字符倒序输出,下半部分是将算好的数以及行前行间空格数算好然后倒序输出。上半部分:show proc push dx mov bx, 10 cmp ax, 0 jz ok1 div bl push ax and ax, 00ffh call show pop dx mov dl, dh or dl, 30h mov ah, 2 int 21hok1: pop dxretshow endp下半部分: mov ax,da inc al mov bl,6 mul bl sub dx,ax dec dx dec dx mov cx,da l11: mov ax,cx mov bl,6 mul bl sub dx,ax dec dx dec dx mov bx,dx mov ax,bx call showspace ; 输出行前空格 push cxl12: inc dx inc dx mov bx,dx mov ax,bx call show ; 输出该数 inc dx inc dx mov bx,dx mov ax,bx call showspace ;输出数字间间隔空格 inc dx inc dx mov bx,dx mov ax,bx call showspace ;输出填充的空格loop l12 pop cx mov ax,cx mov bl,6 mul bl inc dx inc dx sub dx,ax dec dx dec dx push dx mov ah, 2 ; 以下5句实现换行 mov dl, 13 int 21h mov dl, 10 int 21h pop dxloop l11结束语本文主要介绍了利用汇编语言原理技术的一些知识,编写一个能在电脑屏幕上打印杨辉三角的程序代码,不仅能正序输出十阶内的杨辉三角也能倒序输出十阶内的杨辉三角。我们只是简单的了解了其中一点而已,最多只做到了十二阶杨辉三角的正序倒序输出,因此更应进行深入的研究与探讨。微机原理程序编写技术也有待于更深入的学习。参考文献1 朱金钧 麻新旗. 微型计算机原理及应用技术M(第二版). 北京:机械工业出版社,2005.2 王爽. 汇编语言M (第二版).北京:清华大学出版社,2003.附录附录A程序代码:- 20 data segment org 100h message db Input N(N m); 返回C(n, m),即n选m的个数; 算法是:; C(n, m) = 1 (n = m 或 m = 0); C(n, m) = C(n-1, m-1) + C(n-1, m) (n m); 即某位置组合数等于上一行左右两数之和C proc push bp mov bp, sp sub sp, 2 ; 预留一个存储位置 mov bx, bp+6 ; 保存m到bx cmp bx, bp+4 ; 如果m = n 返回1 jz L1 cmp bx, 0 ; 如果m = 0 返回1 jz L1 mov ax, bp+4 ; 保存n到ax dec ax; ax = ax - 1 dec bx; bx = bx - 1 push bx push ax call C; 返回上一行左边的那个数 mov bp-2, ax ; 保存左肩膀上的数 mov ax, bp+4 ; 以下5句同理,返回上一行右肩膀上的数 dec ax push bp+6 push ax call C add ax, bp-2 ; 和左肩膀上的数相加得出该组合数 jmp L2L1: mov ax,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论