汇编课程设计报告学号:课程设计题目打印水仙花数学院计算机科学与技术专业计算机科学与技术班级姓名指导教师武汉理工大学《汇编语言程序设计》课程设计2012 年 6 月28 日课程设计任务书学生姓名:专业班级:指导教师:工作单位:计算机科学与技术学院题目: 打印水仙花数初始条件:理论:完成了《汇编语言程序设计》课程,对微机系统结构和80系列指令系统有了较深入的理解,已掌握了汇编语言程序设计的基本方法和技巧。
实践:完成了《汇编语言程序设计》的4个实验,熟悉了汇编语言程序的设计环境并掌握了汇编语言程序的调试方法。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)进一步理解和掌握较复杂程序的设计方法,掌握子程序结构的设计和友好用户界2.1简要分析2.1.1原理说明可以用标签来接收三位数,标签的好处在于可以限制输入的位数,并且通过实际输入位数可以直接进行一部分的异常处理。
将数存到标签后,因为是以ASCII码的形式存的,所以需要进行转换,将其变成十六进制数,转换后将数字存到申请的内存字中。
在转换成十六进制数的过程中,可以对输入的数进行异常处理,判断是否输入有误。
在输出水仙花数时,设置一个计数器,从100开始循环判断,直到等于用户输入的数为止,依次判断是否为水仙花数,决定是否输出该数。
在输出时,分别取出水仙花数的个、十、百位数,转换成ASCII码再输出。
系统提示是否继续后,程序对用户输入的信息进行判断,若为y或Y则系统回到初始状态,若为n或N则退出系统,若为其他则提示输入错误并重新输入。
2.1.2程序流程图是否继续2.2 数据段设计data segmentmess1 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 bytemax db 4act db ?numfld db 4 dup(?);存放输入的字符串,设定了最大长度,避免错误。
real dw ? ;用于存放转换后的十六进制数data ends3.子程序设计与描述3.1输入一个三位数:;input a numbernum proc nearlea dx,mess1mov ah,9int 21hmov ah,0ahlea dx,numparint 21hcall convertretnum endp3.2 将输入的数据转换成十六进制数并进行异常处理:convert proc nearmov bx,0mov dx,0mov ax,0cmp act,3 ;判断是否为三位数jne errmov bl,numfld[2] ;判断个位是否为1~9cmp bl,2fhjbe errcmp bl,3ahjge errsub bl,30hmov al,numfld[1] ;判断十位是否为0~9cmp al,2fhjbe errcmp al,3ahjge errsub al,30hmov dh,10mul dhadd bl,almov al,numfld[0] ;判断百位是否为0~9cmp al,30hjbe errcmp al,3ahjge errsub al,30hmov dh,100mul dhadd ax,bxmov real,ax ;将转换后的十六进制数存到内存中jmp exterr: ;错误处理lea dx,errormov ah,9int 21hcall numext:retconvert endp3.2 判断是否为水仙花数并输出结果( display子程序);display shuixianhuashudisplay proc nearlea dx,mess3mov ah,9int 21hmov cx,100cmp3:mov ax,cx ;将百位数的立方存入bx中mov dh,100div dhmov dh,almul dhmul dhmov bx,axmov ax,cx ;将十位数的立方加到bx中mov dh,10div dhmov ah,0div dhmov al,ahmov dh,ahmul dhmul dhadd bx,axmov ax,cx ;将个位数的立方加到bx中mov dh,10div dhmov al,ahmov dh,ahmul dhmul dhadd bx,axmov dx,cx ;若是水仙花数则跳转到printcmp dx,bxje printmov ax,real ;若等于用户输入的数据则终止cmp cx,axje stopinc cx ;否则计数器加一继续比较jmp cmp3print:mov ax,bx ;打印百位mov dh,100div dhmov dl,aladd dl,30hmov ah,2int 21hmov ax,bx ;打印十位mov dh,10div dhmov ah,0div dhmov dl,ahadd dl,30hmov ah,2int 21hmov ax,bx ;打印个位div dhmov dl,ahadd dl,30hmov ah,2int 21hmov dl,20hint 21hmov ax,realcmp ax,cxje stopinc cxjmp cmp3stop:retdisplay endp4.源程序与执行结果4.1源程序代码data segmentmess1 db 0dh,0ah,'Please input anubmer(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 bytemax db 4act db ?numfld db 4 dup(?);存放输入的字符串,设定了最大长度,避免错误。
real dw ?;用于存放转换后的十六进制数data endscode segmentassume ds:data,cs:codemain proc farstart:mov ax,datamov ds,axgo:call numcall displayagain:lea dx,mess2mov ah,9int 21hmov ah,1int 21hcmp al,89je gocmp al,121je gocmp al,78je exitcmp al,110je exitlea dx,errormov ah,9int 21hjmp againexit:mov ah,4chint 21hmain endp;--------------------------------------;input a number;输入一个三位数num proc nearlea dx,mess1mov ah,9int 21hmov ah,0ahlea dx,numparint 21hcall convertretnum endp;---------------------------------------;convert decimal to hexadecimal;store to real;将输入的数据转换成十六进制数并进行异常处理convert proc nearmov bx,0mov dx,0mov ax,0cmp act,3 ;判断是否为三位数jne errmov bl,numfld[2] ;判断个位是否为0~9cmp bl,2fhjbe errcmp bl,3ahjge errsub bl,30hmov al,numfld[1] ;判断十位是否为0~9cmp al,2fhjbe errcmp al,3ahjge errsub al,30hmov dh,10mul dhadd bl,almov al,numfld[0] ;判断百位是否为1~9cmp al,30hjbe errcmp al,3ahjge errsub al,30hmov dh,100mul dhadd ax,bxmov real,ax ;将转换后的十六进制数存到内存中jmp exterr: ;错误处理lea dx,errormov ah,9int 21hcall numext:retconvert endp;---------------------------------------;display shuixianhuashu;判断是否为水仙花数并输出结果display proc nearlea dx,mess3mov ah,9int 21hmov cx,100cmp3:mov ax,cx ;将百位数的立方存入bx中mov dh,100div dhmov dh,almul dhmul dhmov bx,axmov ax,cx ;将十位数的立方加到bx中mov dh,10div dhmov ah,0div dhmov al,ahmov dh,ahmul dhmul dhadd bx,axmov ax,cx ;将个位数的立方加到bx中mov dh,10div dhmov al,ahmov dh,ahmul dhmul dhadd bx,axmov dx,cx ;若是水仙花数则跳转到printcmp dx,bxje printmov ax,real ;若等于用户输入的数据则终止cmp cx,axje stopinc cx ;否则计数器加一继续比较jmp cmp3print:mov ax,bx ;打印百位mov dh,100div dhmov dl,aladd dl,30hmov ah,2int 21hmov ax,bx ;打印十位mov dh,10div dhmov ah,0div dhmov dl,ahadd dl,30hmov ah,2int 21hmov ax,bx ;打印个位div dhmov dl,ahadd dl,30hmov ah,2int 21hmov dl,20hint 21hmov ax,realcmp ax,cxje stopinc cxjmp cmp3stop:retdisplay endp;-------------------------------------- code endsend start4.2 测试方法4.2.1 测试用例输入数字:①错误输入12②错误输入045③正确输入265是否继续:①错误输入1②错误输入t③正确输入y④正确输入n4.2.2 测试结果5.总结5.1不足本程序只是针对了三位数进行设计,对于四位数进行过设计,但没法正确输出,最后只完成了判断输出三位数的水仙花数,所以在功能上有所不足,只是实现了最基本的判断三位数是否为水仙花数并且输出。