资源描述
汇编课程设计报告
27
2020年4月19日
文档仅供参考,不当之处,请联系改正。
学 号:
课 程 设 计
题 目
打印水仙花数
学 院
计算机科学与技术
专 业
计算机科学与技术
班 级
姓 名
指导教师
年
6
月
28
日
课程设计任务书
学生姓名: 专业班级:
指导教师: 工作单位:计算机科学与技术学院
题目: 打印水仙花数
初始条件:
理论:完成了《汇编语言程序设计》课程,对微机系统结构和80系列指令系统有了较深入的理解,已掌握了汇编语言程序设计的基本方法和技巧。
实践:完成了《汇编语言程序设计》的4个实验,熟悉了汇编语言程序的设计环境并掌握了汇编语言程序的调试方法。
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
进一步理解和掌握较复杂程序的设计方法,掌握子程序结构的设计和友好用户界面的设计。具体的设计任务及要求:
1) 输入一个大整数n;
2) 将小于n的水仙花数打印出来(各位数字的立方和等于该数本身);
3) 程序采用子程序结构,结构清晰;
4) 友好清晰的用户界面,能识别输入错误并控制错误的修改。
在完成设计任务后,按要求撰写课程设计说明书;对课程设计说明书的具体要求请见课程设计指导书。
阅读资料:
1)《IBM—PC汇编语言程序设计实验教程》实验2.4
2)《IBM—PC汇编语言程序设计(第2版)》例6.11
时间安排:
设计安排一周:周1、周2:完成系统分析及设计。
周3、周4:完成程序调试,和验收。
周5:撰写课程设计报告。
指导教师签名: 月 日
系主任(或责任教师)签名: 月 日
打印水仙花数
1. 需求说明
1.1设计要求:
进一步理解和掌握较复杂程序的设计方法,掌握子程序结构的设计和友好用户界面的设计。具体的设计任务及要求:
1.输入一个三位整数n;
2.将小于n的水仙花数打印出来(各位数字的立方和等于该数本身);
3.程序采用子程序结构,结构清晰;
4.友好清晰的用户界面,能识别输入错误并控制错误的修改。
1.2设计说明
所谓“水仙花数”是指一个3位数,其个、十、百位数字的立方和等于其本身。
1.3功能简述
程序能够输入一个三位数,若输入有误则提示错误,并提示重新输入,若输入正确,系统将显示出所有大于等于100,而且小于等于输入数字的水仙花数。
然后提示是否继续,若用户输入y或Y,则系统回到最开始的状态,若输入n或N,则退出系统,若为其它则提示错误,并重新输入。
2. 设计说明(简要的分析与概要设计)
2.1简要分析
2.1.1原理说明
能够用标签来接收三位数,标签的好处在于能够限制输入的位数,而且经过实际输入位数能够直接进行一部分的异常处理。
将数存到标签后,因为是以ASCII码的形式存的,因此需要进行转换,将其变成十六进制数,转换后将数字存到申请的内存字中。在转换成十六进制数的过程中,能够对输入的数进行异常处理,判断是否输入有误。
在输出水仙花数时,设置一个计数器,从100开始循环判断,直到等于用户输入的数为止,依次判断是否为水仙花数,决定是否输出该数。
在输出时,分别取出水仙花数的个、十、百位数,转换成ASCII码再输出。
系统提示是否继续后,程序对用户输入的信息进行判断,若为y或Y则系统回到初始状态,若为n或N则退出系统,若为其它则提示输入错误并重新输入。
2.1.2程序流程图
开始
输入一个三位数n
输入错误
输入正确
输出100<=X<=n的水仙花数
是否继续
输入y或Y
输入其它
输入n或N
结束
2.2 数据段设计
data segment
mess1 db 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(?);存放输入的字符串,设定了最大长度,避免错误。
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 将输入的数据转换成十六进制数并进行异常处理:
convert 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 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 ;将转换后的十六进制数存到内存中
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,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
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
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
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 ;打印个位
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
4.源程序与执行结果
4.1源程序代码
data segment
mess1 db 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(?);存放输入的字符串,设定了最大长度,避免错误。
real dw ?;用于存放转换后的十六进制数
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,121
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
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 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
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
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 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
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,cx ;若是水仙花数则跳转到print
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
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 ;打印个位
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
;--------------------------------------
code ends
end start
4.2 测试方法
4.2.1 测试用例
输入数字:
① 错误输入12
② 错误输入045
③ 正确输入265
是否继续:
① 错误输入1
② 错误输入t
③ 正确输入y
④ 正确输入n
4.2.2 测试结果
5.总结
5.1不足
本程序只是针对了三位数进行设计,对于四位数进行过设计,但没法正确输出,最后只完成了判断输出三位数的水仙花数,因此在功能上有所不足,只是实现了最基本的判断三位数是否为水仙花数而且输出。
5.2收获与体会
在编程的过程中,遇到了很多没有预料到的困难,有很多知识点之前了解的很模糊,于是在编程变成完成之后,有很多细节上面的错误,不但繁杂,而且有时候错误很隐蔽,给查找错误带来很大的困难。
这次实验让我明白了流程图的重要性,刚开始写程序的时候,直接就动手了,结果程序写的很乱,执行起来的效果也不好。后来动手画了流程图,把大概的框架写好,然后依据框架一点一点编写程序,发现写程序变得简单了很多,经过流程图,每一步要做什么事情,完成什么任务变得很清晰。思路清晰以后,不但程序编写更加容易,查找错误也更加轻松。经过这次课设,我认识到我以前对流程图的观点是错误的,也更加熟悉了流程图的使用。
经过这次课程设计,我懂得了理论和实际相结合的重要性,在理论方面,看上去很容易实现的东西,实际操作起来,并没有那么容易。经过这次编程,我提高了自己的动手能力和独立思考的能力,解决了很多难题。
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分以下为不及格
指导教师签名:
月 日
展开阅读全文