1、优()、良()、中()、及格()、不及格()评阅人: 职称:2007年 1 月12 日目录一、需求分析 1二、概要设计 2三、详细设计 3四、测试结果 4五、设计体会 5一、需求分析1、实现大小写字母之间的转换:输入的字符串中,不是字母的字符不改变;大写字母改成小写字母时,若是大写字母则不改变;同样,小写字母改成大写字母时,若是小写字母则不改变2、二进制和十六进制数之间的转换:输入一个二进制数(或十六进制数),用十六进制数(或二进制数)表示输出;最多能把十六位二进制数(或四位十六进制数)用四位十六进制数(或十六位二进制数)表示输出;小于十六位(或四位)时按回车结束并输出3、十进制数和十六进制数
2、之间的转换:输入一个十进制数(或十六进制数),用十六进制数(或十进制数)表示输出;最大能把十进制数65535(或十六进制数FFFF)转换成十六进制数FFFF(或十进制数65535)表示输出;小于65535(或FFFF)时按回车结束并输出二、概要设计整个程序由四个主要的子程序和若干个辅助子程序组成,实现六个转换功能:HEXIDEC用来把一个十六进制数转换成十进制数表示BINARY用来把十六制数转换为十六位二进制数表示DETOHE用来把一个十进制数转换成十六进制表示BETOHE用来把一个十六位二进制数转换成十六进制输出1、INPUT用来输入字符串2、HEXIBIN用来输入一个十六进制数,并存放在B
3、X中3、BINIDEC用来把BX中十六进制转换到十进制4、DEC_DIV用来除以各位十进制的权5、PRINT用来把BX中的十六进制数转换成二进制6、DECIBIN输入一个五位的十进制数7、BINIHEX把BX中的十进制数转换成十六进制输出8、INBIN输入十六二进制数9、CRLF用来换行三、详细设计GAIXIE MACRO P1,P2,P3,P4,P5,P6 ;义该宏用来判定字母?P2: CMP BYTE PTR SI,P3 JB P5 CMP BYTE PTR SI,P4 JNB P5 CMP BYTE PTR SI,$ ;到$则结束 JZ P6 P1 BYTE PTR SI,20HP5:
4、INC SI LOOP P2P6: LEA DX,BUF1+2 ;出改写后的字母 MOV AH,9 ;调用9号中断功能,输出字符串 INT 21H LEA DX,BF ;把BF首地址给CX调用9号中断功能 INT 21H JMP START ;返回 ENDMDATA SEGMENT ;义数据段BUF DB *choose the operation*,0DH,0AH DB 1:big to small2:small to big3:hexadecimal to binary4:binary to hexadecimal5:hexadecimal to decimal6:decimal to h
5、exadecimal7:EXIT,0DH,0AH,BF DB 0DH,0AH,BUF1 DB 21,?,20 DUP(?) ;用来存放输入的字符串BUF2 DB enter a hex data:BUF3 DB The input is wrong,choose again please:BUF4 DB enter a deci data:BUF5 DB enter a bin data:DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV DX,OFFSET BUF ;出选择界面 MOV AH,
6、1 ;入要选择的操作 PUSH AX ;NT 会改变AL的值,应压栈保护行 POP AX ;把AX压栈保护 CMP AL,1把AL中内容跟1比较 JZ BTOS ;相等则跳转到2 JZ STOB3 JZ HTOB4 JZ BTOH5 JZ HTOD 6 JZ DTOH 7 JZ EXIT LEA DX,BUF3 ;把BUF3的首地址给DX MOV AH,9 CALL CRLF ;调用子程序CALL返回,重新选择EXIT:MOV AH,4CH ;退出BTOH:CALL BETOHE ;调用二进制转十六进制子程序HTOB:CALL BINARY ;调用十六进制转二进制子程序HTOD:CALL HE
7、XIDEC ;调用十六进制转十进制子程序DTOH:CALL DETOHE ;调用十进制转十六进制子程序BTOS:CALL INPUT ;大写字母改为小写 MOV CX,20 ;作为循环条件 GAIXIE ADD,NEXT1,A,Z,N1,N2 ;宏GAIXIE展开STOB:小写字母改为大写 MOV CX,20 GAIXIE SUB,NEXT2,az,N3,N4INPUT PROC NEAR ;输入字符串 MOV DX,0 ;DX清零 MOV DX,OFFSET BUF1 ;把BUF1的首地址给DX MOV AH,10 ;调用10号中断功能,输出字符串把BF首地址给DX LEA SI,BUF1+
8、2 MOV BL,SI-1 ;把输入的字符个数给BL MOV BH,0 ;BH清零 MOV BYTE PTR BX+SI+1,把$作为字符串结束字符 LEA DX,BUF1+2 RET ;INPUT ENDPHEXIDEC PROC NEAR ;用该子程序把一个十六进制数转换成十进制数表示 PUSH DS ;保护初始数据段 SUB AX,AX ;AX清零START1: LEA DX,BUF2 CALL HEXIBIN ;调用输入一个十六进制数子程序 CMP AL,1BH ;遇Esc则退出 JZ EXIT1换行 CALL BINIDEC CALL CRLF JMP START1 ;EXIT1:R
9、ETHEXIDEC ENDPHEXIBIN PROC NEAR ;输入一个十六进制数,并存放在BX中 MOV BX,0 ;把BX清零作为输入四位的记数器INHEX:CMP DX,4 ;把DX跟4比较 JNB HEXEND ;大于则跳转输入数据 遇到Esc则退出 JZ HEXEND SUB AL,30H ;判断是否数字或字母?否则跳出 JL HEXEND CMP AL,10 ;判断是否数字 JL ADD_TO ;是则存放BX中 SUB AL,7 ;把AL内容减7转为字母判断是否小写字母(af) JL HEXEND CMP AL,16 小于则跳转 SUB AL,20H ;判断是否大写字母(AF)
10、CMP AL,10 CMP AL,16 JGE HEXENDADD_TO:MOV CL,4 ;作为循环条件 SHL BX,CL ;BX乘以16 MOV AH,0 ADD BX,AX ;两数相加 INC DX ;DX加1 JMP INHEXHEXEND:HEXIBIN ENDPBINIDEC PROC NEAR ;用来把BX中十六进制转换到十进制 MOV CX,10000 ;把10000给CX,作为万位的权 CALL DEC_DIV ;调用除权子程序 MOV CX,1000 CALL DEC_DIV MOV CX,100 MOV CX,10 MOV CX,1 RETBINIDEC ENDPDEC
11、_DIV PROC NEAR ;除以各位十进制的权 MOV AX,BX ;把BX内容给AX DIV CX MOV BX,DX MOV DL,AL ADD DL,30H ;转换为ASSII MOV AH,2DEC_DIV ENDPCRLF PROC NEAR ; LEA DX,BFCRLF ENDPBINARY PROC NEAR ;该子程序用来把十六制数转换为十六位二进制数表示START2:LEA DX,BUF2把DS压栈 PUSH AX CALL HEXIBIN CMP AL,1BH JZ EXIT2 CALL PRINT JMP START2EXIT2:BINARY ENDPPRINT P
12、ROC NEAR ;把BX中的十六进制数转换成二进制 MOV CX,16D ;记数ROT: SHL BX,1D ;每移一位最高位变为CF JC SET ;CF为1则跳到SET,否则输出0 MOV DL,30H MOV AH,2 DEC CX JNZ ROTSET:MOV DL,31H ;输出1 PRINT ENDPDETOHE PROC NEAR ;用该子程序来把一个十进制数转换成十六进制表示REPEAT:LEA DX,BUF4 PUSH DS SUB AX,AX CALL DECIBIN JZ EXIT3 CALL BINIHEX JMP REPEATEXIT3:DETOHE ENDPDEC
13、IBIN PROC NEAR ;输入一个五位的十进制数 MOV BX,0 MOV CX,0NEWCHAR:CMP CX,5 JNB EXIT4 MOV AH,1 JZ EXIT4 SUB AL,30H JL EXIT4 CMP AL,9 JG EXIT4 CBW INC CX XCHG AX,BX MOV DX,10 MUL DX ADD BX,AX JMP NEWCHAREXIT4:DECIBIN ENDPBINIHEX PROC NEAR ;把BX中的十进制数转换成十六进制输出 MOV CH,4ROTATE:MOV CL,4 ROL BX,CL ;把BX中高四位移到低四位,放到AL中 MO
14、V AL,BL AND AL,0FH ADD AL,30H CMP AL,3AH ;判断是否为数字 JL PRINTIT ADD AL,7PRINTIT:MOV DL,AL DEC CH JNZ ROTATEBINIHEX ENDPBETOHE PROC NEAR ;用该子程序来把一个十六位二进制数转换成十六进制输出START3:LEA DX,BUF5 CALL INBIN JZ EXIT5 JMP START3EXIT5:BETOHE ENDPINBIN PROC NEAR ;输入十六二进制数PUTIN:CMP CX,16 JNB EXIT6 JZ EXIT6 JL EXIT6 CMP AL
15、,1 JG EXIT6 CBW MOV DX,2 JMP PUTINEXIT6:INBIN ENDPCODE ENDS END START 四、测试结果经过多次调试、修改,测试结果胜利通过,符合要求:选择大写改小写功能:输入字符串,字母全变成小写,其他字符不变,遇回车结束输入并执行选择小写改大写功能:输入字符串,字母全变成大写,其他字符不变,遇回车结束输入并执行选择十六进制转换成二进制功能:输入一个不大于四位的十六进制数,输出对应的二进制数,遇回车结束输入并执行选择二进制转换成十六进制功能:输入一个不大于十六位的二进制数,输出对应的十六进制数,遇回车结束输入并执行选择十六进制转换成十进制功能:
16、输入一个不大于四位的十六进制数,输出对应的十进制数,遇回车结束输入并执行选择十进制转换成十六进制功能:输入一个不大于65535的十进制数,输出对应的十六进制数,遇回车结束输入并执行五、设计体会通过这次的课程设计,让我对汇编有了更进一步的认识,加强了我用汇编语言编程的能力。汇编语言程序设计是一门很抽象的学科,学起来也比较乏味。一开始学的时候感觉很难,也没什么兴趣。但随着学习的推进,以及上机编程,逐渐感到轻松。在这次课程设计中,让我更加熟悉了汇编语言的一些基本的指令;掌握了汇编语言的一些基本的中断调用功能,可以用汇编语言调用各种中断调用功能,并由此实现对硬件的控制;能够熟练的利用子程序和宏进行编程
17、。在设计过程中,不断对程序进行修改、改进,增强了自己分析问题、解决问题的能力;在不断的调试中,也让自己发现了自己存在的一些错误以及一些调试时应注意的问题,同时也更深的理解了寄存器、存储器等工作原理以及一些指令执行后对它们的改变,例如INT指令会改变AL的值,在编程时应注意这方面的问题。在编写过程中,让我深刻的体会到了搞科学的严谨性。有时一个逗号或者写错一个字母这样一点点小小的错误,就会产生十几个错误,导致调试的失败。不管做什么事,都要认认真真,否则就会得不偿失了。当设计一步步接近成功,每一个子程序的调试成功,都让自己感到喜悦,从中体会到了编程的乐趣,有一种成就感,也让自己树立了信心,增强了对汇编语言程序设计的兴趣。
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2