汇编语言代码转换课程设计Word格式文档下载.docx
《汇编语言代码转换课程设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《汇编语言代码转换课程设计Word格式文档下载.docx(18页珍藏版)》请在冰点文库上搜索。
优( )、良( )、中( )、及格( )、不及格( )
评阅人:
职称:
2007年1月12日
目 录
一、需求分析1
二、概要设计2
三、详细设计3
四、测试结果4
五、设计体会5
一、需求分析
1、实现大小写字母之间的转换:
输入的字符串中,不是字母的字符不改变;
大写字母改成小写字母时,若是大写字母则不改变;
同样,小写字母改成大写字母时,若是小写字母则不改变
2、二进制和十六进制数之间的转换:
输入一个二进制数(或十六进制数),用十六进制数(或二进制数)表示输出;
最多能把十六位二进制数(或四位十六进制数)用四位十六进制数(或十六位二进制数)表示输出;
小于十六位(或四位)时按回车结束并输出
3、十进制数和十六进制数之间的转换:
输入一个十进制数(或十六进制数),用十六进制数(或十进制数)表示输出;
最大能把十进制数65535(或十六进制数FFFF)转换成十六进制数FFFF(或十进制数65535)表示输出;
小于65535(或FFFF)时按回车结束并输出
二、概要设计
整个程序由四个主要的子程序和若干个辅助子程序组成,实现六个转换功能:
HEXIDEC用来把一个十六进制数转换成十进制数表示
BINARY用来把十六制数转换为十六位二进制数表示
DETOHE用来把一个十进制数转换成十六进制表示
BETOHE用来把一个十六位二进制数转换成十六进制输出
1、INPUT用来输入字符串
2、HEXIBIN用来输入一个十六进制数,并存放在BX中
3、BINIDEC用来把BX中十六进制转换到十进制
4、DEC_DIV用来除以各位十进制的权
5、PRINT用来把BX中的十六进制数转换成二进制
6、DECIBIN输入一个五位的十进制数
7、BINIHEX把BX中的十进制数转换成十六进制输出
8、INBIN输入十六二进制数
9、CRLF用来换行
三、详细设计
GAIXIEMACROP1,P2,P3,P4,P5,P6;
义该宏用来判定字母?
P2:
CMPBYTEPTR[SI],P3
JBP5
CMPBYTEPTR[SI],P4
JNBP5
CMPBYTEPTR[SI],'
$'
;
到$则结束
JZP6
P1BYTEPTR[SI],20H
P5:
INCSI
LOOPP2
P6:
LEADX,BUF1+2;
出改写后的字母
MOVAH,9;
调用9号中断功能,输出字符串
INT21H
LEADX,BF;
把BF首地址给CX
调用9号中断功能
INT21H
JMPSTART;
返回
ENDM
DATASEGMENT;
义数据段
BUFDB'
**********choosetheoperation**********'
0DH,0AH
DB'
1:
bigtosmall'
2:
smalltobig'
3:
hexadecimaltobinary'
4:
binarytohexadecimal'
5:
hexadecimaltodecimal'
6:
decimaltohexadecimal'
7:
EXIT'
0DH,0AH,'
BFDB0DH,0AH,'
BUF1DB21,?
20DUP(?
);
用来存放输入的字符串
BUF2DB'
enterahexdata:
BUF3DB'
Theinputiswrong,chooseagainplease:
BUF4DB'
enteradecidata:
BUF5DB'
enterabindata:
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETBUF;
出选择界面
MOVAH,1;
入要选择的操作
PUSHAX;
NT会改变AL的值,应压栈保护
行
POPAX;
把AX压栈保护
CMPAL,'
1'
把AL中内容跟1比较
JZBTOS;
相等则跳转到
2'
JZSTOB
3'
JZHTOB
4'
JZBTOH
5'
JZHTOD
6'
JZDTOH
7'
JZEXIT
LEADX,BUF3;
把BUF3的首地址给DX
MOVAH,9
CALLCRLF;
调用子程序CALL
返回,重新选择
EXIT:
MOVAH,4CH;
退出
BTOH:
CALLBETOHE;
调用二进制转十六进制子程序
HTOB:
CALLBINARY;
调用十六进制转二进制子程序
HTOD:
CALLHEXIDEC;
调用十六进制转十进制子程序
DTOH:
CALLDETOHE;
调用十进制转十六进制子程序
BTOS:
CALLINPUT;
大写字母改为小写
MOVCX,20;
作为循环条件
GAIXIEADD,NEXT1,'
A'
,'
Z'
,N1,N2;
宏GAIXIE展开
STOB:
小写字母改为大写
MOVCX,20
GAIXIESUB,NEXT2,'
a'
z'
,N3,N4
INPUTPROCNEAR;
输入字符串
MOVDX,0;
DX清零
MOVDX,OFFSETBUF1;
把BUF1的首地址给DX
MOVAH,10;
调用10号中断功能,输出字符串
把BF首地址给DX
LEASI,BUF1+2
MOVBL,[SI-1];
把输入的字符个数给BL
MOVBH,0;
BH清零
MOVBYTEPTR[BX+SI+1],'
把$作为字符串结束字符
LEADX,BUF1+2
RET;
INPUTENDP
HEXIDECPROCNEAR;
用该子程序把一个十六进制数转换成十进制数表示
PUSHDS;
保护初始数据段
SUBAX,AX;
AX清零
START1:
LEADX,BUF2
CALLHEXIBIN;
调用输入一个十六进制数子程序
CMPAL,1BH;
遇Esc则退出
JZEXIT1
换行
CALLBINIDEC
CALLCRLF
JMPSTART1;
EXIT1:
RET
HEXIDECENDP
HEXIBINPROCNEAR;
输入一个十六进制数,并存放在BX中
MOVBX,0;
把BX清零
作为输入四位的记数器
INHEX:
CMPDX,4;
把DX跟4比较
JNBHEXEND;
大于则跳转
输入数据
遇到Esc则退出
JZHEXEND
SUBAL,30H;
判断是否数字或字母?
否则跳出
JLHEXEND
CMPAL,10;
判断是否数字
JLADD_TO;
是则存放BX中
SUBAL,7;
把AL内容减7转为字母
判断是否小写字母(a~f)
JLHEXEND
CMPAL,16
小于则跳转
SUBAL,20H;
判断是否大写字母(A~F)
CMPAL,10
CMPAL,16
JGEHEXEND
ADD_TO:
MOVCL,4;
作为循环条件
SHLBX,CL;
BX乘以16
MOVAH,0
ADDBX,AX;
两数相加
INCDX;
DX加1
JMPINHEX
HEXEND:
HEXIBINENDP
BINIDECPROCNEAR;
用来把BX中十六进制转换到十进制
MOVCX,10000;
把10000给CX,作为万位的权
CALLDEC_DIV;
调用除权子程序
MOVCX,1000
CALLDEC_DIV
MOVCX,100
MOVCX,10
MOVCX,1
RET
BINIDECENDP
DEC_DIVPROCNEAR;
除以各位十进制的权
MOVAX,BX;
把BX内容给AX
DIVCX
MOVBX,DX
MOVDL,AL
ADDDL,30H;
转换为ASSII
MOVAH,2
DEC_DIVENDP
CRLFPROCNEAR;
LEADX,BF
CRLFENDP
BINARYPROCNEAR;
该子程序用来把十六制数转换为十六位二进制数表示
START2:
LEADX,BUF2
把DS压栈
PUSHAX
CALLHEXIBIN
CMPAL,1BH
JZEXIT2
CALLPRINT
JMPSTART2
EXIT2:
BINARYENDP
PRINTPROCNEAR;
把BX中的十六进制数转换成二进制
MOVCX,16D;
记数
ROT:
SHLBX,1D;
每移一位最高位变为CF
JCSET;
CF为1则跳到SET,否则输出0
MOVDL,30H
MOVAH,2
DECCX
JNZROT
SET:
MOVDL,31H;
输出1
PRINTENDP
DETOHEPROCNEAR;
用该子程序来把一个十进制数转换成十六进制表示
REPEAT:
LEADX,BUF4
PUSHDS
SUBAX,AX
CALLDECIBIN
JZEXIT3
CALLBINIHEX
JMPREPEAT
EXIT3:
DETOHEENDP
DECIBINPROCNEAR;
输入一个五位的十进制数
MOVBX,0
MOVCX,0
NEWCHAR:
CMPCX,5
JNBEXIT4
MOVAH,1
JZEXIT4
SUBAL,30H
JLEXIT4
CMPAL,9
JGEXIT4
CBW
INCCX
XCHGAX,BX
MOVDX,10
MULDX
ADDBX,AX
JMPNEWCHAR
EXIT4:
DECIBINENDP
BINIHEXPROCNEAR;
把BX中的十进制数转换成十六进制输出
MOVCH,4
ROTATE:
MOVCL,4
ROLBX,CL;
把BX中高四位移到低四位,放到AL中
MOVAL,BL
ANDAL,0FH
ADDAL,30H
CMPAL,3AH;
判断是否为数字
JLPRINTIT
ADDAL,7
PRINTIT:
MOVDL,AL
DECCH
JNZROTATE
BINIHEXENDP
BETOHEPROCNEAR;
用该子程序来把一个十六位二进制数转换成十六进制输出
START3:
LEADX,BUF5
CALLINBIN
JZEXIT5
JMPSTART3
EXIT5:
BETOHEENDP
INBINPROCNEAR;
输入十六二进制数
PUTIN:
CMPCX,16
JNBEXIT6
JZEXIT6
JLEXIT6
CMPAL,1
JGEXIT6
CBW
MOVDX,2
JMPPUTIN
EXIT6:
INBINENDP
CODEENDS
ENDSTART
四、测试结果
经过多次调试、修改,测试结果胜利通过,符合要求:
选择大写改小写功能:
输入字符串,字母全变成小写,其他字符不变,遇回车结束输入并执行
选择小写改大写功能:
输入字符串,字母全变成大写,其他字符不变,遇回车结束输入并执行
选择十六进制转换成二进制功能:
输入一个不大于四位的十六进制数,输出对应的二进制数,遇回车结束输入并执行
选择二进制转换成十六进制功能:
输入一个不大于十六位的二进制数,输出对应的十六进制数,遇回车结束输入并执行
选择十六进制转换成十进制功能:
输入一个不大于四位的十六进制数,输出对应的十进制数,遇回车结束输入并执行
选择十进制转换成十六进制功能:
输入一个不大于65535的十进制数,输出对应的十六进制数,遇回车结束输入并执行
五、设计体会
通过这次的课程设计,让我对汇编有了更进一步的认识,加强了我用汇编语言编程的能力。
汇编语言程序设计是一门很抽象的学科,学起来也比较乏味。
一开始学的时候感觉很难,也没什么兴趣。
但随着学习的推进,以及上机编程,逐渐感到轻松。
在这次课程设计中,让我更加熟悉了汇编语言的一些基本的指令;
掌握了汇编语言的一些基本的中断调用功能,可以用汇编语言调用各种中断调用功能,并由此实现对硬件的控制;
能够熟练的利用子程序和宏进行编程。
在设计过程中,不断对程序进行修改、改进,增强了自己分析问题、解决问题的能力;
在不断的调试中,也让自己发现了自己存在的一些错误以及一些调试时应注意的问题,同时也更深的理解了寄存器、存储器等工作原理以及一些指令执行后对它们的改变,例如INT指令会改变AL的值,在编程时应注意这方面的问题。
在编写过程中,让我深刻的体会到了搞科学的严谨性。
有时一个逗号或者写错一个字母这样一点点小小的错误,就会产生十几个错误,导致调试的失败。
不管做什么事,都要认认真真,否则就会得不偿失了。
当设计一步步接近成功,每一个子程序的调试成功,都让自己感到喜悦,从中体会到了编程的乐趣,有一种成就感,也让自己树立了信心,增强了对汇编语言程序设计的兴趣。