1、 汇编课程设计报告 27 2020年4月19日 文档仅供参考,不当之处,请联系改正。 学 号: 课 程 设 计 题 目 打印水仙花数 学 院 计算机科学与技术 专 业 计算机科学与技术 班 级 姓 名 指导教师 年 6 月 28 日 课程设计任务书 学生姓名: 专业班级: 指导教师: 工作单位:计算机科学与技术学院 题目: 打印水仙花数 初始条件: 理论:完成了
2、《汇编语言程序设计》课程,对微机系统结构和80系列指令系统有了较深入的理解,已掌握了汇编语言程序设计的基本方法和技巧。 实践:完成了《汇编语言程序设计》的4个实验,熟悉了汇编语言程序的设计环境并掌握了汇编语言程序的调试方法。 要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 进一步理解和掌握较复杂程序的设计方法,掌握子程序结构的设计和友好用户界面的设计。具体的设计任务及要求: 1) 输入一个大整数n; 2) 将小于n的水仙花数打印出来(各位数字的立方和等于该数本身); 3) 程序采用子程序结构,结构清晰; 4) 友好清晰的用户界面,能识别输入
3、错误并控制错误的修改。 在完成设计任务后,按要求撰写课程设计说明书;对课程设计说明书的具体要求请见课程设计指导书。 阅读资料: 1)《IBM—PC汇编语言程序设计实验教程》实验2.4 2)《IBM—PC汇编语言程序设计(第2版)》例6.11 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试,和验收。 周5:撰写课程设计报告。 指导教师签名: 月 日 系主任(或责任教师)签名: 月 日 打印水仙花数 1. 需求说明 1.1设计要求:
4、 进一步理解和掌握较复杂程序的设计方法,掌握子程序结构的设计和友好用户界面的设计。具体的设计任务及要求: 1.输入一个三位整数n; 2.将小于n的水仙花数打印出来(各位数字的立方和等于该数本身); 3.程序采用子程序结构,结构清晰; 4.友好清晰的用户界面,能识别输入错误并控制错误的修改。 1.2设计说明 所谓“水仙花数”是指一个3位数,其个、十、百位数字的立方和等于其本身。 1.3功能简述 程序能够输入一个三位数,若输入有误则提示错误,并提示重新输入,若输入正确,系统将显示出所有大于等于100,而且小于等于输入数字的水仙花数。 然后提示是否
5、继续,若用户输入y或Y,则系统回到最开始的状态,若输入n或N,则退出系统,若为其它则提示错误,并重新输入。 2. 设计说明(简要的分析与概要设计) 2.1简要分析 2.1.1原理说明 能够用标签来接收三位数,标签的好处在于能够限制输入的位数,而且经过实际输入位数能够直接进行一部分的异常处理。 将数存到标签后,因为是以ASCII码的形式存的,因此需要进行转换,将其变成十六进制数,转换后将数字存到申请的内存字中。在转换成十六进制数的过程中,能够对输入的数进行异常处理,判断是否输入有误。 在输出水仙花数时,设置一个计数器,从100开始循环判断,直到等于用户输入的数为止,
6、依次判断是否为水仙花数,决定是否输出该数。 在输出时,分别取出水仙花数的个、十、百位数,转换成ASCII码再输出。 系统提示是否继续后,程序对用户输入的信息进行判断,若为y或Y则系统回到初始状态,若为n或N则退出系统,若为其它则提示输入错误并重新输入。 2.1.2程序流程图 开始 输入一个三位数n 输入错误 输入正确 输出100<=X<=n的水仙花数 是否继续 输入y或Y 输入其它 输入n或N 结束 2.2 数据段设计 data segment mess1 db
7、 0dh,0ah,'Please input a nubmer (100<=number<=999):','$' mess2 db 0dh,0ah,'Do you want to continue(y/n)? ','$' mess3 db 0dh,0ah,'shuixianhuashu:',0ah,'$' error db 0dh,0ah,'Input error,please input again!','$' numpar label byte max db 4 act db ? numfld db 4 dup(?);存放输入的字
8、符串,设定了最大长度,避免错误。 real dw ? ;用于存放转换后的十六进制数 data ends 3. 子程序设计与描述 3.1输入一个三位数: ;input a number num proc near lea dx,mess1 mov ah,9 int 21h mov ah,0ah lea dx,numpar int 21h call convert ret num endp 3.2 将输入的数据转换成十六进制数并进行异常处理: co
9、nvert proc near mov bx,0 mov dx,0 mov ax,0 cmp act,3 ;判断是否为三位数 jne err mov bl,numfld[2] ;判断个位是否为1~9 cmp bl,2fh jbe err cmp bl,3ah jge err sub bl,30h mov al,numfld[1] ;判断十位是否为0~9 cmp al,2fh jbe err cmp
10、al,3ah jge err sub al,30h mov dh,10 mul dh add bl,al mov al,numfld[0] ;判断百位是否为0~9 cmp al,30h jbe err cmp al,3ah jge err sub al,30h mov dh,100 mul dh add ax,bx mov real,ax ;将转换后的十六进制数存到内存中
11、 jmp ext err: ;错误处理 lea dx,error mov ah,9 int 21h call num ext: ret convert endp 3.2 判断是否为水仙花数并输出结果( display子程序) ;display shuixianhuashu display proc near lea dx,mess3 mov ah,9 int 21h mov cx,
12、100 cmp3: mov ax,cx ;将百位数的立方存入bx中 mov dh,100 div dh mov dh,al mul dh mul dh mov bx,ax mov ax,cx ;将十位数的立方加到bx中 mov dh,10 div dh mov ah,0 div dh mov al,ah
13、 mov dh,ah mul dh mul dh add bx,ax mov ax,cx ;将个位数的立方加到bx中 mov dh,10 div dh mov al,ah mov dh,ah mul dh mul dh add bx,ax mov dx,cx ;若是水仙花数则跳转到print
14、 cmp dx,bx je print mov ax,real ;若等于用户输入的数据则终止 cmp cx,ax je stop inc cx ;否则计数器加一继续比较 jmp cmp3 print: mov ax,bx ;打印百位 mov dh,100 div dh mov dl,al add dl,30h mo
15、v ah,2 int 21h mov ax,bx ;打印十位 mov dh,10 div dh mov ah,0 div dh mov dl,ah add dl,30h mov ah,2 int 21h mov ax,bx ;打印个位 div dh mov dl,ah add dl,30h mov ah,2
16、 int 21h mov dl,20h int 21h mov ax,real cmp ax,cx je stop inc cx jmp cmp3 stop: ret display endp 4.源程序与执行结果 4.1源程序代码 data segment mess1 db 0dh,0ah,'Please input a nubmer(100<=number<=999):','$' ;提示
17、输入一个三位数 mess2 db 0dh,0ah,'Do you want to continue(y/n)? ','$';提示是否继续 mess3 db 0dh,0ah,'shuixianhuashu:',0ah,'$';提示输出水仙花数 error db 0dh,0ah,'Input error,please input again!','$';出错信息 numpar label byte max db 4 act db ? numfld db 4 dup(?);存放输入的字符串,设定了最大长度,避免错误。 real dw
18、 ?;用于存放转换后的十六进制数 data ends code segment assume ds:data,cs:code main proc far start: mov ax,data mov ds,ax go: call num call display again: lea dx,mess2 mov ah,9 int 21h mov ah,1 int 21h cmp al,89 je go cmp al,1
19、21 je go cmp al,78 je exit cmp al,110 je exit lea dx,error mov ah,9 int 21h jmp again exit: mov ah,4ch int 21h main endp ;-------------------------------------- ;input a number;输入一个三位数 num proc near
20、 lea dx,mess1 mov ah,9 int 21h mov ah,0ah lea dx,numpar int 21h call convert ret num endp ;--------------------------------------- ;convert decimal to hexadecimal ;store to real;将输入的数据转换成十六进制数并进行异常处理 convert proc near mov
21、 bx,0 mov dx,0 mov ax,0 cmp act,3 ;判断是否为三位数 jne err mov bl,numfld[2] ;判断个位是否为0~9 cmp bl,2fh jbe err cmp bl,3ah jge err sub bl,30h mov al,numfld[1] ;判断十位是否为0~9 cmp al,2fh jbe err cmp al,3ah jge err
22、 sub al,30h mov dh,10 mul dh add bl,al mov al,numfld[0] ;判断百位是否为1~9 cmp al,30h jbe err cmp al,3ah jge err sub al,30h mov dh,100 mul dh add ax,bx mov real,ax ;将转换后的十六进制数存到内存中 jmp ext
23、 err: ;错误处理 lea dx,error mov ah,9 int 21h call num ext: ret convert endp ;--------------------------------------- ;display shuixianhuashu;判断是否为水仙花数并输出结果 display proc near lea dx,mess3 mov ah,9 int
24、21h mov cx,100 cmp3: mov ax,cx ;将百位数的立方存入bx中 mov dh,100 div dh mov dh,al mul dh mul dh mov bx,ax mov ax,cx ;将十位数的立方加到bx中 mov dh,10 div dh mov ah,0
25、 div dh mov al,ah mov dh,ah mul dh mul dh add bx,ax mov ax,cx ;将个位数的立方加到bx中 mov dh,10 div dh mov al,ah mov dh,ah mul dh mul dh add bx,ax mov dx,c
26、x ;若是水仙花数则跳转到print cmp dx,bx je print mov ax,real ;若等于用户输入的数据则终止 cmp cx,ax je stop inc cx ;否则计数器加一继续比较 jmp cmp3 print: mov ax,bx ;打印百位
27、 mov dh,100 div dh mov dl,al add dl,30h mov ah,2 int 21h mov ax,bx ;打印十位 mov dh,10 div dh mov ah,0 div dh mov dl,ah add dl,30h mov ah,2 int 21h mov ax,bx
28、 ;打印个位 div dh mov dl,ah add dl,30h mov ah,2 int 21h mov dl,20h int 21h mov ax,real cmp ax,cx je stop inc cx jmp cmp3 stop: ret display endp ;-----------------
29、 code ends end start 4.2 测试方法 4.2.1 测试用例 输入数字: ① 错误输入12 ② 错误输入045 ③ 正确输入265 是否继续: ① 错误输入1 ② 错误输入t ③ 正确输入y ④ 正确输入n 4.2.2 测试结果 5.总结 5.1不足 本程序只是针对了三位数进行设计,对于四位数进行过设计,但没法正确输出,最后只完成了判断输出三位数的水仙花数,因此在功能上有所不足,只是实现了最基本的判断三位数是否为水仙花数而且输出。 5.2收获与
30、体会 在编程的过程中,遇到了很多没有预料到的困难,有很多知识点之前了解的很模糊,于是在编程变成完成之后,有很多细节上面的错误,不但繁杂,而且有时候错误很隐蔽,给查找错误带来很大的困难。 这次实验让我明白了流程图的重要性,刚开始写程序的时候,直接就动手了,结果程序写的很乱,执行起来的效果也不好。后来动手画了流程图,把大概的框架写好,然后依据框架一点一点编写程序,发现写程序变得简单了很多,经过流程图,每一步要做什么事情,完成什么任务变得很清晰。思路清晰以后,不但程序编写更加容易,查找错误也更加轻松。经过这次课设,我认识到我以前对流程图的观点是错误的,也更加熟悉了流程图的使用。 经过这次课程设
31、计,我懂得了理论和实际相结合的重要性,在理论方面,看上去很容易实现的东西,实际操作起来,并没有那么容易。经过这次编程,我提高了自己的动手能力和独立思考的能力,解决了很多难题。 6.参考资料 1、《IBM—PC汇编语言程序设计实验教程》 2、《IBM—PC汇编语言程序设计(第2版)》 本科生课程设计成绩评定表 班级: 姓名: 学号: 序号 评分项目 满分 实得分 1 学习态度认真、遵守纪律 10 2 设计分析合理性 10 3 设计方案正确性、可行性、创造性 20 4 设计结果正确性 40 5 设计报告的规范性 10 6 设计验收 10 总得分/等级 评语: 注:最终成绩以五级分制记。优(90-100分)、良(80-89分)、中(70-79分)、 及格(60-69分)、60分以下为不及格 指导教师签名: 月 日






