人人范文网 范文大全

微机原理课程设计——输出杨辉三角

发布时间:2020-03-02 16:00:17 来源:范文大全 收藏本文 下载本文 手机版

目录

第一章 绪论 ...................................................................................................................................1 第二章 分析与设计 .......................................................................................................................2 2.1 题目 .......................................................................................................................................................2 2.2 要求 .......................................................................................................................................................2 2.3 方案设计与论证 ...................................................................................................................................3 2.3.1 整体设计思路 ...........................................................................................................................3 2.3.2 方案选择 ...................................................................................................................................3 2.4 结构框图 ...............................................................................................................................................4 3.1 宏定义换行 ...........................................................................................................................................5 3.2 阶数输入过程 .......................................................................................................................................5 3.3 数据判断功能 .......................................................................................................................................6 3.4 询问继续模块 ...................................................................7 3.5 数值计算模块 .......................................................................................................................................7 3.6 显示模块 ...............................................................................................................................................9 3.6.1 数据显示 .................................................................9 3.6.2 空格显示 ................................................................10

第四章 实验结果及问题处理 .....................................................................................................12 4.1 实验结果 .............................................................................................................................................12 4.2出现的问题以及解决的方案 ..............................................................................................................13 4.2.1 数据输入问题 .........................................................................................................................13 4.2.2 除法溢出问题 .........................................................................................................................13 4.2.3 数据计算问题 .........................................................................................................................14 第五章 总结与体会 .....................................................................................................................15 参考文献 .......................................................................................................................................17 附录 ...............................................................................................................................................18

第一章 绪论

随着电子计算机技术的不断发展,微型计算机系统的功能越来越强,而关于计算机的程序设计语言也经历了一个发展的过程。从最基本的机器语言到汇编语言,并发展到高级的智能化语言,如visual C++、Visual Basic等。

汇编语言(Aembly Language)是一种采用助记符表示的程序设计语言,即用助记符来表示指令的操作码和操作数,用符号或标号代表地址、常量或变量。助记符一般都是英文单词的缩写,便于识别和记忆。使用汇编语言编写的程序称为汇编语言源程序。汇编语言源程序不能由机器直接执行,而必须翻译成有机器代码组成的目标程序,这个翻译的过程称为汇编。把汇编语言源程序翻译成目标程序的软件称为汇编程序。

汇编语言与机器语言密切相关,它们之间有明显的对应关系。一条汇编语言指令对应一条机器语言代码,所以汇编语言和机器语言一样都是面向机器的语言。使用汇编语言进行程序设计能充分利用机器的硬件功能和结构特点,从而有效地加快程序的执行速度,减少程序占用的存储空间。所以汇编语言大量用于编写计算机系统程序、实时通信程序和实时控制程序等。

汇编语言作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但重要性却勿庸置疑,因为它能够完成许多其它语言所无法完成的功能。就拿Linux内核来讲,虽然绝大部分代码是用C语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码,其中主要是在Linux的启动部分。由于这部分代码与硬件的关系非常密切,即使是C语言也会有些力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬件的性能。

1

第二章 分析与设计

2.1 题目

汇编显示杨辉三角

2.2 要求

基本内容:在提示信息下,从计算机键盘输入一个满足要求的数据,在输出提示信息后显示相应的杨辉三角。

具体要求如下:

(1) 要有提示信息的输出显示,例如程序执行时直接显示输出提示信息“Please input a number:”然后等待用户从计算机键盘输入具体数值,例如输入“4”,然后换行显示下一步提示信息,例如“The YangHui triangle:”最后显示通过程序获得的杨辉三角如下:

(2) 分析杨辉三角具体算法,计算结果要求正确。输出的杨辉三角要求上下左右对称显示,上下分别为两个等腰三角形的形式,即要求分析总结每行行首空格数量,及三角中各个数之间空格的安排方法; (3) 要求最少要能够输出10阶的杨辉三角;

(4) 提高要求:增大阶数(最少到20阶),可任意选择正反三角显示。

2

2.3 方案设计与论证

2.3.1 整体设计思路

本课题要求用汇编显示杨辉三角形,首先得了解什么是杨辉三角形。杨辉三角形,又称贾宪三角形,帕斯卡三角形,是二项式系数在三角形中的一种几何排列。其每一行的数据都有其特定的规律,杨辉三角形又有其独特的性质:

1、每行数字左右对称,由1开始逐渐变大,然后变小,最后回到1。

2、第n行的数字个数为n个。

3、第n行数字和为2^(n-1)。

4、每个数字等于上一行的左右两个数字之和,故可用此性质写出整个帕斯卡三角形。

5、第n行的第1个数为1,第二个数为1×(n-1),第三个数为1×(n-1)×(n-2)/2,第四个数为1×(n-1)×(n-2)/2×(n-3)/3···依此类推。

在熟悉了杨辉三角形的产生原理,杨辉三角形内各数据的计算方法之后,再在掌握了相关汇编知识以及一定编程能力的基础上,我们对课题进行了相关分析,总体来说,这个课题的关键点分为以下部分,厘清这些关键点也是作为明确整体设计思路的重要过程:

(1)、提示信息的显示。题目明确要求显示中要有提示信息,实际上,根据需要,在本课题中我们又加了一些功能,当然也必须要增加额外的提示信息。

(2)、阶数的输入功能。通过DOS系统功能调用,确定需要显示杨辉三角形的行数与大小,能够实现简单的人机交互。

(3)、编程得到需要在杨辉三角中显示的数。基于以下思想:第n行的第1个数为1,第二个数为1×(n-1),第三个数为1×(n-1)×(n-2)/2,第四个数为1×(n-1)×(n-2)/2×(n-3)/3···依此类推。

(4)、某数的显示及换行。为了显示的规范和美观,必须考虑到数与数之间的空格数,当然,某数的显示是能够完整输出杨辉三角形的基础和前提。

(5)、新增功能,判断输入数据是否满足条件,判断是否继续执行。考虑到本程序的使用范围及使用者能连续使用显示杨辉三角形的方便性,特增加了数据判断和询问继续功能,使用者想要继续执行即输入“Y”,程序自动从头开始执行,若输入“N”,则退出。 2.3.2 方案选择

1.对于阶数输入功能,我们想到两种方案。

方案(1):参考相关文献上得知,可以通过DOS系统功能调用:键盘输入单字符——

13

号系统功能调用,同时实现字符的输入与显示。

调用格式:MOV INT

AH,1 21H 说明:1号功能调用无入口参数,执行时系统首先等待键盘输入,待程序员按下任何一键,系统先检查是否是Ctrl-Break键。如果是则退出,否则将键入的字符的ASCII码置入AL寄存器,并在屏幕上显示该字符。

方案(2):同样是DOS系统功能调用,键盘输入字符串——0AH号系统功能调用。 说明:其功能是将键盘输入的字符串写入到内存缓冲区,因此调用之前必须事先定义一个缓冲区。缓冲区的第一个字节给出用来存放键入的字符数,第二个留给系统填写实际键入的字符个数,从第三字节开始用来存放键入的字符串,最后键入回车( ↙)键表示字符结束。

对于方案(1),格式简单,使用方便,易于理解,但是对于输入多位数,相对有点复杂。对于方案(2),从实际编程水平出发,不太能够娴熟的使用该系统功能,调用格式复杂,而且鉴于该程序输入的位数不超过两位,所以我们最后选择了方案(1)。

2.4 结构框图

在编写程序之前,明确其整个思路的流程图是相当重要的,所以我们花了一些时间来画出流程图,根据流程图来写实际程序。如图2.4.1为本程序的总体汇编思路图。

图2.4.1 程序总体流程图

4

第三章 实验程序及分析

3.1 宏定义换行

为了简化汇编语言源程序,可以把一些频繁出现的程序段定义为“宏指令”,当遇到这段程序时,只要按宏指令名调用即可,不必重复写许多指令,汇编程序在遇到宏指令时将其期待成相应的代码,这样就有效地缩短汇编语言源程序的长度,使源程序易读,也减少了由于重复书写而引起的错误。在本课题中,为了显示杨辉三角,必然需要多次使用换行代码,故将换行代码定义为“宏指令”,有以上所述的诸多好处。宏定义如下:

HUANH

MACRO

; 宏名为HUANH

; 使用2号功能,显示器输出字符 ; 13即ASCII为0DH是回车符

; DOS系统功能调用

; 10即ASCII为0AH是换行符 ; DOS系统功能调用 ; 宏定义结束

MOV AH, 2

MOV DL, 13 INT 21H

MOV DL, 10 INT 21H ENDM

3.2 阶数输入过程

过程是程序的一部分,它可以被程序调用。每次可调用一个过程,当过程中的指令执行之后,控制返回调用它的地方。过程的定义是用过程定义伪指令完成的。过程的定义有三个注意点:①、过程名是自定义符,定义开始和结束时的过程名必须相同。②、过程名有三个属性:段地址,偏移量和距离属性(NEAR和FAR),汇编程序在汇编时根据过程类型生成段内或段间的调用或返回指令代码。③、在一个过程中,可以有多个RET指令。一个过程总是通过RET指令返回,RET常作为过程的最后一条指令。在了解以上说明及注意点的基础上,我们根据实际需要定义了一个实现阶数输入功能的过程。具体定义如下:

SHURU

PROC XOR

BP,BP MOV BX,10 MOV CX,3

; 控制输入位数,外加一位回车

5

; 输入过程定义,数字存在BP

input:

MOV AH,1 INT CMP JZ

SUB 21H

; DOS功能调用,键盘输入和显示数据

AL,0DH OK AL,30H

; 判断是否以回车结束输入

; 将ASCII码转为16进制数

; 字节扩展为字,为了下一条交换指令 CBW

XCHG AX,BP MUL ADD BX

; 扩大10倍 ; 加一位 BP,AX

LOOP input RET

; 返回调用过程的地方 ; 过程定义结束 OK: SHURU

ENDP

3.3 数据判断功能

在第一套程序编写完毕,试运行时,我们发现,本程序能够支持输入的数据最大值为14,当数据大于等于15时,则程序出现除法溢出问题,并且自动关闭,所以为了能让使用者不至于输入不合法的数据,我们特增加了数据判断功能,输入数据满足条件,允许执行。否则,提示输入数据超过范围,要求重新输入。程序段如下:

MAIN: MOV

DX,OFFSET MSG

; 输出字符串,请输入一个数 ; 9号功能调用,输出字符串 MOV AH,9 INT 21H CALL SHURU CMP JB BP,15 MZTJ

; 调用输入函数,显示输入的数 ; 输入的数存在BP,与15比较 ; 满足条件,允许执行 ; 否则换行 HUANH MOV DX,OFFSET ERROR ; 准备显示错误信息

MOV AH,9

INT 21H

HUANH

; 继续换行

JMP MAIN

; 无条件跳转到MAIN,重新开始 6

MZTJ: HUANH

··· ··· ···

3.4 询问继续模块

在首套程序编写完毕运行时,每次我们只能运行一次显示杨辉三角的程序,以后还得重新键入相关命令,才能运行,如此调试程序,效率低下,且可能混乱我们对现象的记录。所以考虑到我们调试程序的高效性及对于使用者的便利性,我们又增加了一个询问继续模块,当第一次杨辉三角显示完毕,提示是否继续,如果键入“Y”,则程序自动重新开始执行;如果键入“N”,则程序运行结束,退出。程序段如下:

input1: HUANH MOV DX,OFFSET CON

; 显示提问字符串,继续?

MOV AH,9

INT

21H

; 判断是否继续 ; 键盘输入数据 MOV AH,1 INT CMP JNZ HUANH JMP 21H AL,59H exit1

; 判断输入的是否是Y NEAR PTR MAIN

; 段内直接近转移,可以转移到段内的任何一个位置 ; 结束程序,返回DOS exit1:

MOV AH,4CH

INT 21H 3.5 数值计算模块

本段数值计算,是正确显示杨辉三角的关键,所以能否找到一种既简便又能保证计算正确性的方法,是我们本阶段工作的中心,我们参阅了很多资料,从几种计算方法中,选取了最符合我们实际编程水平的,又在保证计算正确性的基础上,写出了如下的程序段,它的思想是基于:第n行的第1个数为1,第二个数为1×(n-1),第三个数为1×(n-1)×

7

(n-2)/2,第四个数为1×(n-1)×(n-2)/2×(n-3)/3···依此类推。

如图3.5.1为本段程序的流程图,文字描述即为上段。

Calculate:DEC

MUL

DIV

INC

CMP

JZ

PUSH

MOV

CALL

MOV

SUB

CALL

POP

CALL ok1:RET

图3.6.1

数值计算流程图

b ; b每次减1相乘

b c ; 除以c,再加1 c b,0 ; b是否为0 ok1 AX ; 保存所得数据

d,0 ; 此处d为位数,为了显示后面的空格 ShowNum AX,6 ; 预设,总共显示的空格数为6个单位 AX,d ; 还需显示多少空格

Showspace1 AX

Calculate ; 继续执行 8

3.6 显示模块

3.6.1 数据显示

得到杨辉三角中的某一个数后,接下来的任务就是如何将它显示出来。不能完成这项工作,就不能完成整个课题。我们小组在参考平时微机实验的基础上,自己分析,找到了一种正确的显示方法:可以将某数不断除以10,取出余数显示,直到商为0,停止除法。例如:要显示的数是345,除以10后,商为34,余数为5,5压入堆栈。然后将34除以10,商为3,余数为4,4压入堆栈。最后将3除以10,商为0,余数为3,3压入堆栈。弹出堆栈,依次显示,在汇编中,使用无符号数除法指令DIV OP。指令DIV BL,被除数存在AX中,整数商存在AL,余数存在AH。所以在除以10后,只需将AH中的值取出,下一次除法,可以用逻辑指令AND将其高八位屏蔽,调用2号功能,依次显示。

为了能充分体现我们编程的思想,如图3.6.1是数据显示部分的流程图,以下编写的程序也是基于这种思想。

图3.6.1

数据显示流程图

具体程序段如下:

ShowNum: MOV BX, 10

; BX中存除数10

9

CMP AX, 0 JZ

INC d ok2

; 除法运算是否完毕

; 此处d为位数,以确定输出的空格数 ; 除以10,整数商存在AL,余数存在AH DIV BL PUSH AX

AND AX, 00FFH ; 屏蔽高八位,取商 CALL

SHOWNum POP DX

; 取出高八位,即为要显示的余数 ; 转为ASCII码

MOV DL, DH OR DL, 30H

MOV AH, 2 INT RET 21H ok2: 3.6.2 空格显示

空格的显示,是为了调整整体杨辉三角的布局,使其输出为美观的等腰三角形。前期,我们采用在方格纸上试书写的方式,确定需要显示的空格数。实际编程中,使用到了3中空格形式,第一种是首数字1之前的空格,定义为AHEAD,第二种是首数字1后面的空格,定义为BETWEEN,第三种是和需显示的数字位数相关的空格,定义为BACK,具体在程序中定义如下:AHEAD

DB

BETWEEN DB

BACK

DB

\'

$\' \'

$\' \' $\' 定义了这三种空格后,需要将其显示,这里我们使用DOS功能调用,9号系统功能调用——输出字符串。功能是将指定的内存缓冲区中的字符串在屏幕上显示出来,缓冲区的字符串以“$”为结束标志。

Showspace: MOV BX, AX

nexts: MOV AH, 9 MOV DX,OFFSET AHEAD CMP BX, 0

; BX减1,控制输出的空格数

; 首行显示空格,空格数即为输入的阶数

JZ dones

10

dones: INT DEC JMP RET 21H BX nexts

; 完成显示,返回 ; AX为6-数据位数 Showspace1: MOV BX, AX

MOV AH, 9

MOV DX,OFFSET BACK next: CMP BX, 0

JZ done

INT 21H

DEC BX

JMP next done: RET

11

第四章 实验结果及问题处理

4.1 实验结果

通过对程序的多次完善,现在能够达到的要求为:最小输出1阶,最大输出14阶的正反杨辉三角形,能够判断输入数据是否合法,能够询问是否继续输出,当输入阶数较小时,也能够很好的显示输出,输出的正反杨辉三角形美观、清晰,实现了题目所提出的基本要求,对于遇到的一些问题,将在下节讨论,下面附上一些运行调试图片。

如图4.1.1和图4.1.2为正反杨辉三角显示图, 图4.1.3为当输入阶数超出范围时的提示错误信息,并要求重新输入数据。

图4.1.1

11阶杨辉三角

图4.1.2

继续输出的4阶和6阶杨辉三角

12

图4.1.3

输入阶数不合法的提示界面

4.2出现的问题以及解决的方案

4.2.1 数据输入问题

对于数据输入,我们当初考虑到了两种方法,在方案选择中已论证了两种方法各自的优缺点,本来想使用0AH号系统功能调用,因为它能直接得到输入的字符串,而不像1号系统功能调用那样,只能够输入单字符,但是使用0AH号系统功能调用实际编写程序时,却不清楚输入的字符串存放在内存的哪个区域,虽然参考文献上有相关说明,但是我们还是未能取出输入的字符串,这对于我们是极大的打击,因为阶数输入是完成整个课题的第一步,这一步基础不做好,更不要提后面的计算、显示了。

在要求首先能实现功能的情况下,我们还是选择了1号系统功能调用,但是要加一个循环控制,控制输入最大位数和ENTER的ASCII码判断输入结束语句,因为是输入的单字符,其ASCII码存在AL寄存器中,所以对于2位数,必须要先将其ASCII码转为16进制数,将首先输入的数乘以10,再加上第二次输入的数,得到实际键入的数值。基于以上思想,我们写出了上述3.2节的阶数输入功能程序。 4.2.2 除法溢出问题

由查阅资料可知,对于高阶的杨辉三角形,其内部的数据会变得相当大,当阶数为15阶时,其最大的数已经超过65536,在数学上65536并不是一个特殊的数,但是在计算机系统中,65536=2^16,在8086CPU内部,有8个16为的内部寄存器,当然累加器AX

13

也为16位,AX中能存放的最大的数为65536,分为高八位(AH)和低八位(AL),使用汇编的无符号数除法指令DIV OP,指令中给出的操作数是除数,它可以是8位/16位通用寄存器及存储器;被除数隐含在AX(字节除)或DX、AX(字除法)中。

查阅资料得到,可以使用特定指令,实现整数商存至AX,余数存至DX中,这样能够提高数值的上限,但是随之而来的问题是,对于编程的复杂度的提高,杨辉三角的显示格式问题,数据除以10取余数的显示问题,从而影响到整个课题。所以考虑到限定的时间,输出的美观等因素,取折中选择,我们只做到了14阶,对于大于等于15阶的阶数输入,我们增加了判断语句,避免除法溢出问题。 4.2.3 数据计算问题

众所周知,杨辉三角形中的数据是有规律排列的,在上文整体设计思路中已经阐述了一些规律。对于数据的计算,我们一开始考虑到的是某数等于其上一行左右两数之和,依照此规律也可以写出整个杨辉三角形,而且不需要进行乘除法运算,不会出现除法溢出问题。但是如何得到这个数的上一行的左右两数,这两个数该存在哪里,却是一个不容忽视的问题,而且会占用很大的内存空间。

后来我们查阅资料,又得到一些规律,即第n行的第1个数为1,第二个数为1×(n-1),第三个数为1×(n-1)×(n-2)/2,第四个数为1×(n-1)×(n-2)/2×(n-3)/3···依此类推。这样可以用DEC n和INC c,用乘除法指令就可运算出正确结果,但是前提是输入的阶数有限制,上一节已经论证。为了能知道这一行到底要运算多少次,我们又加了一个CX控制其运算次数,在计算前,对某一行的n,都要进行压栈保护。综上所述,我们写出了上节结束输入模块的程序。事实表明,这样的方法能够计算出正确的数值。

14

第五章 总结与体会

微机原理与接口技术,是我们电子科学与技术专业学生的专业课,由此可知,这门课对于我们的意义是多么重大。所以,在做这次微机的课程设计时,更是不敢怠慢。唯恐不能正确得到设计效果。

这次我们的课程设计的题目是:汇编显示杨辉三角。刚拿到这个题目的时候,确实不知道从何下手,但是有句话说得好:不逼自己一把,怎么知道自己不可以?我们首先从什么是杨辉三角下手,查阅了相关资料,总结体会了杨辉三角的一些规律,这些规律能够在我们编程过程中得以体现,所以这个过程是必须的。

接下来,在熟悉了杨辉三角的基础上,我们结合编程,总结了有几个工作要做,一是:字符串的显示;二是:杨辉三角值得计算;三是:这些数值的显示;四是:输出的排版问题,保证输出美观正确。把整个课题,分为以上四个部分后,各个击破,从而高效的完成整个课题是一种很实用、有效的方法。虽然在这个过程中遇到了不少问题,但是我们小组成员都很积极的讨论解决问题的方法。最后通过整合,得到了整个程序。总体来说,这个程序虽然还不完美,但是代表着我们这一段时间以来的成果,我们都很欣慰,能够实现题目的要求。

这次微机原理课程设计历时两个星期,在整整两星期的日子里,可以说苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。以前在上课的时候,老师经常强调在写一个程序的时候,一定要事先把程序原理方框图化出来,但是我开始总觉得这样做没必要,很浪费时间。但是,这次课程设计完全改变了我以前的那种错误的认识,以前我接触的那些程序都是很短、很基础的,但是在课程设计中碰到的那些需要很多代码才能完成的任务,画程序方框图是很有必要的。因为通过程序方框图,在做设计的过程中,我们每一步要做什么,每一步要完成什么任务都有一个很清楚的思路,而且在程序测试的过程中也有利于查错。

其次,以前对于编程工具的使用还处于一知半解的状态上,但是经过一段上机的实践,对于怎么去排错、查错,怎么去看每一步的运行结果,怎么去了解每个寄存器的内容以确保程序的正确性上都有了很大程度的提高。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服

15

务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。

这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在老师的辛勤指导下,终于游逆而解。同时学得到很多实用的知识,在此我表示感谢!同时,对给过我帮助的所有同学表示忠心的感谢!

16

参考文献

[1] 朱金钧,麻新旗,等.微型计算机原理及应用技术.机械工业出版社,第2版.

17

附录

汇编输出杨辉三角程序代码: HUANH MACRO

; 宏定义5句代码实现换行

MOV

AH, 2

DL, 13 21H DL, 10 21H

MOV

INT

MOV

INT ENDM

DATA SEGMENT

MSG

RESULT CON DB DB DB

\'Please input a number: $\' \'The YiangHui triangle:$\'

\'Do you want to continue?(Y/N): $\' \'Data out of range!$\' ERROR

DB

AHEAD

DB

\'

$\' BETWEEN DB BACK a

DB DW DW DW DW

\'

$\' \' $\' ? ? ? ?

;记录位数,控制空格数

;a为阶数 ;b是行数 b c

d

DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA

;输入子程序,数字存在BP SHURU PROC

XOR

MOV

MOV BP,BP BX,10 CX,3

;控制输入位数,外加一位回车

18

input:

MOV

INT AH,1

21H

;键盘输入数据

CMP

JZ AL,0DH

OK AL,30H

;以回车结束输入

SUB

CBW

;化ASCII为HEX ;字节扩展为字

OK:

SHURU START:

MAIN:

MZTJ:

XCHG MUL

ADD

LOOP

RET ENDP MOV

MOV

MOV

MOV

INT

CALL

CMP JB

HUANH MOV MOV

INT

HUANH JMP

HUANH MOV

MOV AX,BP BX

;扩大10倍 BP,AX

;加一位

input AX,DATA DS,AX

DX,OFFSET MSG ; 输出字符串,请输入一个数 AH,9 21H SHURU

; 调用输入函数,显示输入的数BP,15

; 输入的数在BP里 MZTJ

; 满足条件

DX,OFFSET ERROR

; 准备显示错误信息

AH,9

21H

MAIN DX,OFFSET RESULT ; 显示提示字符串

AH,9

INT

HUANH

MOV

CALL

MOV

MOV

INT

CMP

JZ

MOV

MOV

MOV

DEC

CALL

exit: HUANH MOV

CALL

MOV

MOV

INT

JMP

yhsj: MOV

HUANH

DEC

MOV

CALL

MOV

MOV

INT

MOV 21H

AX,BP

;准备显示杨辉三角,AX=BP=阶数

Showspace DL,\'1\'

;第一行显示空格完毕,输出\'1\' AH,2 21H BP,1

;阶数BP与1比较

exit b,2

;b=2 CX,BP ;CX为阶数 a,BP ;a为阶数 a

yhsj AX,BP

;准备显示杨辉三角,AX=BP=阶数

Showspace DL,\'1\'

;第一行显示空格完毕,输出\'1\' AH,2 21H NEAR PTR input1 c,1

;杨辉三角

BP AX,BP Showspace

;控制首数字前面的空格数 DL,\'1\'

;首数字必为1

AH,2 21H DX,OFFSET BETWEEN

20

MOV

INT

MOV

PUSH

CALL

POP

INC

DEC

CMP

JA

DEC

CMP

JZ

CALL

ok3:

HUANH

INC

MOV

CALL

MOV

MOV

INT

input1: HUANH MOV

MOV

INT

MOV

INT

CMP

JNZ

HUANH AH,9 21H AX,1 b Calculate b b

;b为行数

CX CX,1 yhsj b b,2 ok3 fyhsj a AX,a Showspace DL,\'1\' AH,2 21H

;判断是否继续

DX,OFFSET CON ;显示提问字符串,继续? AH,9 21H AH,1

;键盘输入数据

21H AL,59H

;以回车结束输入 exit1

21

JMP exit1: MOV

INT

fyhsj: MOV

HUANH

INC

MOV

CALL

MOV

MOV

INT

MOV

MOV

INT

MOV

DEC

PUSH

CALL

POP

INC

CMP

JB

RET Showspace:

MOV

MOV

MOV

nexts:

CMP

JZ NEAR PTR MAIN AH,4CH 21H c,1

;反杨辉三角

BP AX,BP Showspace DL,\'1\' AH,2 21H

DX,OFFSET BETWEEN AH,9 21H AX,1 b b Calculate b CX CX,a fyhsj BX, AX ;首行显示空格,空格数即为输入的阶数AH, 9 DX,OFFSET AHEAD BX, 0 ;BX减1,控制输出的空格数

dones

22

INT

DEC

JMP

dones:

RET Calculate: DEC

MUL

DIV

INC

CMP

JZ

PUSH

MOV

CALL

MOV

SUB

CALL

POP

CALL

ok1:

RET ShowNum: MOV

CMP

JZ

INC

DIV

PUSH

AND

CALL

POP 21H BX nexts b b c c b,0 ok1 AX ;保存所得数据

d,0 ShowNum AX,6 AX,d Showspace1 AX Calculate BX, 10 ;显示某数,并记录位数AX, 0 ok2 d BL AX AX, 00FFH SHOWNum DX

23

ok2:

MOV

OR DL, DH DL, 30H AH, 2 21H MOV

INT

RET BX, AX AH, 9 DX,OFFSET BACK BX, 0 done 21H BX next Showspace1:MOV

next:

done:

RET

MOV

MOV

CMP

JZ INT

DEC

JMP

CODE ENDS

END START

24

微机原理课程设计

微机原理课程设计

微机原理课程设计

微机原理课程设计

微机原理课程设计

微机原理课程设计

微机原理课程设计

微机原理课程设计题目

微机原理课程设计题目

微机原理课程设计指导书

微机原理课程设计——输出杨辉三角
《微机原理课程设计——输出杨辉三角.doc》
将本文的Word文档下载到电脑,方便编辑。
推荐度:
点击下载文档
点击下载本文文档