汇编语言代码转换程序设计.docx
《汇编语言代码转换程序设计.docx》由会员分享,可在线阅读,更多相关《汇编语言代码转换程序设计.docx(19页珍藏版)》请在冰豆网上搜索。
汇编语言代码转换程序设计
信息工程学院
课程设计报告
设计题目:
______代码转换程序设计______
名称:
微机原理与接口课程设计
班级:
_______通信工程1002班______
姓名:
_______卓自强_王可______
学号:
____20100135442010013524__
设计时间:
至
指导教师:
__________卢清平____________
评语:
评阅成绩:
评阅教师:
一、程设计的性质和目的
通过课程设计,进行程序设计方法和技能的基本训练,巩固在课堂上学到的有关软件程序设计的基本知识和基本方法,硬件电路的设计等,通过实际动手能力的培养,进一步熟悉汇编语的结构和使用方法,掌握软硬结合的控制程序设计,达到能独立阅读、编制和调试一定规模的汇编语言程序的水平,增进对汇编语言的认识,加强用汇编语言编程的能力;
掌握汇编语言的中断调用功能的应用,可以用汇编语言调用各种中断调用功能,并由此实现对硬件的控制等。
了解和掌握汇编语言程序设计过程、方法及实现,为以后相关的课程的学习打下良好基础。
二、课程设计要求
1、遵循模块化、结构化的程序设计方法。
2、要求程序必须正确。
3、程序简明易懂,多运用输入输出提示,有出错信息及必要的注释。
4、要求程序结构合理,语句使用得当。
5、适当追求编程技巧和程序运行效率。
三、主要仪器设备及软件
Pc机,MASM汇编软件,绘图软件,等
4、课程设计题目及要求
题目:
代码转换程序
要求:
完成一个字母或数制之间的转化程序,主程序分别具有5种可选择的子功能,按相应的字符可分别进入相应的子功能并在屏幕上显示结果,按“q”键退出。
5种可选择的子功能分别为:
1)实现小写字母向大写字母的转换
2)实现大写字母向小写字母的转换
3)实现二进制数向十六进制数的转换
4)实现十六进制数向二进制数的转换
5)实现十六进制数向十进制数的转换
五、课题分析及设计思路
1、实现大小写字母之间的转换:
输入的字符串中,不是字母的字符不改变;大写字母改成小写字母时,若是大写字母则不改变;同样,小写字母改成大写字母时,若是小写字母则不改变
2、二进制和十六进制数之间的转换:
输入一个二进制数(或十六进制数),用十六进制数(或二进制数)表示输出;最多能把十六位二进制数(或四位十六进制数)用四位十六进制数(或十六位二进制数)表示输出;小于十六位(或四位)时按“q”结束并输出
3、十进制数和十六进制数之间的转换:
输入一个十六进制数,用十进制数表示输出;最大能把十六进制数FFFF转换成十进制数65535表示输出;小于FFFF时按“q”结束并输出
整个程序由四个主要的子程序和若干个辅助子程序组成,实现六个转换功能:
HEXIDEC用来把一个十六进制数转换成十进制数表示
BINARY用来把十六制数转换为十六位二进制数表示
BETOHE用来把一个十六位二进制数转换成十六进制输出
1、INPUT用来输入字符串
2、HEXIBIN用来输入一个十六进制数,并存放在BX中
3、BINIDEC用来把BX中十六进制转换到十进制
4、DEC_DIV用来除以各位十进制的权
5、PRINT用来把BX中的十六进制数转换成二进制
8、INBIN输入十六二进制数
9、CRLF用来换行
六、程序主要流程
7、程序及主要代码与分析
7.1程序及主要代码
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
MOVAH,9;调用9号中断功能
INT21H
JMPSTART;返回
ENDM
DATASEGMENT;义数据段
BUFDB'**********choosetheoperation**********',0DH,0AH
DB'1:
bigtosmall',0DH,0AH
DB'2:
smalltobig',0DH,0AH
DB'3:
hexadecimaltobinary',0DH,0AH
DB'4:
binarytohexadecimal',0DH,0AH
DB'5:
hexadecimaltodecimal',0DH,0AH
DB'6/q:
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,9;调用9号中断功能
INT21H
MOVAH,1;入要选择的操作
INT21H
PUSHAX;NT会改变AL的值,应压栈保护
LEADX,BF;行
MOVAH,9;调用9号中断功能
INT21H
POPAX;把AX压栈保护
CMPAL,'1';把AL中内容跟1比较
JZBTOS;相等则跳转到
CMPAL,'2'
JZSTOB
CMPAL,'3'
JZHTOB
CMPAL,'4'
JZBTOH
CMPAL,'5'
JZHTOD
CMPAL,'6'
JZEXIT
CMPAL,71H
JZEXIT
LEADX,BUF3;把BUF3的首地址给DX
MOVAH,9
INT21H
CALLCRLF;调用子程序CALL
JMPSTART;返回,重新选择
EXIT:
MOVAH,4CH;退出
INT21H
BTOH:
CALLBETOHE;调用二进制转十六进制子程序
HTOB:
CALLBINARY;调用十六进制转二进制子程序
HTOD:
CALLHEXIDEC;调用十六进制转十进制子程序
BTOS:
CALLINPUT;大写字母改为小写
MOVCX,20;作为循环条件
GAIXIEADD,NEXT1,'A','Z',N1,N2;宏GAIXIE展开
STOB:
CALLINPUT;小写字母改为大写
MOVCX,20
GAIXIESUB,NEXT2,'a','z',N3,N4
INPUTPROCNEAR;输入字符串
MOVDX,0;DX清零
MOVDX,OFFSETBUF1;把BUF1的首地址给DX
MOVAH,10;调用10号中断功能,输出字符串
INT21H
LEADX,BF;把BF首地址给DX
MOVAH,9
INT21H
LEASI,BUF1+2
MOVBL,[SI-1];把输入的字符个数给BL
MOVBH,0;BH清零
MOVBYTEPTR[BX+SI+1],'$';把$作为字符串结束字符
LEADX,BUF1+2
MOVAH,9
INT21H
RET;返回
INPUTENDP
HEXIDECPROCNEAR;用该子程序把一个十六进制数转换成十进制数表示
PUSHDS;保护初始数据段
SUBAX,AX;AX清零
PUSHAX;把AX压栈保护
START1:
LEADX,BUF2
MOVAH,9
INT21H
CALLHEXIBIN;调用输入一个十六进制数子程序
CMPAL,71H;遇q则退出
JZEXIT1
CALLCRLF;换行
CALLBINIDEC
CALLCRLF
JMPSTART1;返回
EXIT1:
RET
HEXIDECENDP
HEXIBINPROCNEAR;输入一个十六进制数,并存放在BX中
MOVBX,0;把BX清零
MOVDX,0;作为输入四位的记数器
INHEX:
CMPDX,4;把DX跟4比较
JNBHEXEND;大于则跳转
MOVAH,1;输入数据
INT21H
CMPAL,71H;遇到q则退出
JZHEXEND
SUBAL,30H;判断是否数字或字母?
否则跳出
JLHEXEND
CMPAL,10;判断是否数字
JLADD_TO;是则存放BX中
SUBAL,7;把AL内容减7转为字母
CMPAL,10;判断是否小写字母(a~f)
JLHEXEND
CMPAL,16
JLADD_TO;小于则跳转
SUBAL,20H;判断是否大写字母(A~F)
CMPAL,10
JLHEXEND
CMPAL,16
JGEHEXEND
ADD_TO:
MOVCL,4;作为循环条件
SHLBX,CL;BX乘以16
MOVAH,0
ADDBX,AX;两数相加
INCDX;DX加1
JMPINHEX
HEXEND:
RET
HEXIBINENDP
BINIDECPROCNEAR;用来把BX中十六进制转换到十进制
MOVCX,10000;把10000给CX,作为万位的权
CALLDEC_DIV;调用除权子程序
MOVCX,1000
CALLDEC_DIV
MOVCX,100
CALLDEC_DIV
MOVCX,10
CALLDEC_DIV
MOVCX,1
CALLDEC_DIV
RET
BINIDECENDP
DEC_DIVPROCNEAR;除以各位十进制的权
MOVAX,BX;把BX内容给AX
MOVDX,0;DX清零
DIVCX
MOVBX,DX
MOVDL,AL
ADDDL,30H;转换为ASSII
MOVAH,2
INT21H
RET
DEC_DIVENDP
CRLFPROCNEAR;换行
LEADX,BF
MOVAH,9
INT21H
RET
CRLFENDP
BINARYPROCNEAR;该子程序用来把十六制数转换为十六位二进制数表示
START2:
LEADX,BUF2
MOVAH,9
INT21H
PUSHDS;把DS压栈
SUBAX,AX;AX清零
PUSHAX
CALLHEXIBIN
CMPAL,71H
JZEXIT2
CALLCRLF
CALLPRINT
CALLCRLF
JMPSTART2
EXIT2:
RET
BINARYENDP
PRINTPROCNEAR;把BX中的十六进制数转换成二进制
MOVCX,16D;记数
ROT:
SHLBX,1D;每移一位最高位变为CF
JCSET;CF为1则跳到SET,否则输出0
MOVDL,30H
MOVAH,2
INT21H
DECCX
JNZROT
RET
SET:
MOVDL,31H;输出1
MOVAH,2
INT21H
DECCX
JNZROT
RET
PRINTENDP
DECIBINPROCNEAR;输入一个五位的十进制数
MOVBX,0
MOVCX,0
NEWCHAR:
CMPCX,5
JNBEXIT4
MOVAH,1
INT21H
CMPAL,71H
JZEXIT4
SUBAL,30H
JLEXIT4
CMPAL,9
JGEXIT4
CBW
INCCX
XCHGAX,BX
MOVDX,10
MULDX
XCHGAX,BX
ADDBX,AX
JMPNEWCHAR
EXIT4:
RET
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
MOVAH,2
INT21H
DECCH
JNZROTATE
RET
BINIHEXENDP
BETOHEPROCNEAR;用该子程序来把一个十六位二进制数转换成十六进制数
START3:
LEADX,BUF5
MOVAH,9
INT21H
PUSHDS
SUBAX,AX
PUSHAX
CALLINBIN
CMPAL,71H
JZEXIT5
CALLCRLF
CALLBINIHEX
CALLCRLF
JMPSTART3
EXIT5:
RET
BETOHEENDP
INBINPROCNEAR;输入十六二进制数
MOVBX,0
MOVCX,0
PUTIN:
CMPCX,16
JNBEXIT6
MOVAH,1
INT21H
CMPAL,1BH
JZEXIT6
SUBAL,30H
JLEXIT6
CMPAL,1
JGEXIT6
CBW
INCCX
XCHGAX,BX
MOVDX,2
MULDX
XCHGAX,BX
ADDBX,AX
JMPPUTIN
EXIT6:
RET
INBINENDP
CODEENDS
ENDSTART
7.2算法分析
小写字母的ASCII码比大写字母的ASC码大20H,因此,大写字母转换成小写字母就是将大写字母的ASCII码加20H,反之,小写字母转换成大写字母就是将小写字母的ASCII码减20H。
二进制转换为十六进制
在数据段中定义一个空间用于存储输入的二进制数,每一位二进制数占一个字节,在输入二进制的时候,假设用一个指针DI指向定义的段,每输入一位二进制数,指针就加一。
当输入结束时,指针指向存储二进制最低位的位置。
再用另外一个指针SI指向段。
在取数时,将所取的数减30H,将它由ASCII码变成真正的二进制。
首先二进制数最后一位取数,如果该数是1,就将DL加1。
第一个指针DI减1,指向倒数第二位,如果倒数第二位是1,将DL加2。
DI减1,再取倒数第三位,如果取得的数是1,DL就加4。
DI减1,取倒数第四位,如果取得1,DL就加8。
这样就将二进制的第四位求和,DL再加30H,与39H比较,如果小于39H,就将DL入栈。
如果大于39H,再将DL加07H,然后将其入栈就这样向前取数,每四位像前面一样求和、入栈。
每次取数后,DI减1,比较SI和DI,如果两者相等,表示数已取完,直接进入入栈操作。
就这样每四位求和、转换、入栈,就将每四位作为一体转换为一位十六进制数。
由于低位先入栈,所以每出栈一位并显示,最后得到的十六进制也是从高到低的
十六进制转换为二进制
输入一位十六进制数,将它由ASCII码形式转换为二进制形式,采用移位指令将其左移四位,再与另个输入的十六进制数的二进制形式相与得到一个八位二进制数,假设将它赋给BH,然后再输入两位十六进制数,采取前面的操作得到另一个八位二进制数,将它赋给BL,这样就得到一个16位二进制数。
将BX带CF位循环左移,如果CF=1,则显示字符‘1’,如果CF=0,则显示字符‘0’。
当循环结束时,就将十六进制数转换为二进制数显示出来。
十六进制转换为十进制
①输入一位十六进制数,将它由ASCII码转换为二进制,将它赋给BX。
②再输入第二位十六进制数,转换为二进制后,假设将它赋给AX,BX向左移四位。
③依次输入第三位十六进制数,转为二进制后将它赋给AX,重复第二步后面的操作。
④最后输入第四位十六进制数,重复第二步操作,最后得到的是这个四位十六进制数的求和。
⑤利用这个和除10000得到十进制数的万位,并显示万位。
余数在除以1000,得到千位并显示。
余数在除100,得到并显示百位。
余数除10,得到并显示十位。
最后的余数就是个位,显示个位。
这样一个四位十六进制数就转换为十进制数。
8、实验结果截图
(1)主界面进行选择,如图8-1所示:
图8-1主界面
(2)选择1,进行大写字母转换成小写字母的程序界面,如图8-2所示:
图8-2大写字母转换成小写字母
(3)选择2,进行小写字母转换成大写字母的程序界面,如图8-3所示:
图8-3小写字母转换成大写字母
(4)选择3,进行十六进制转换成二进制的程序界面,如图8-4所示:
图8-4十六进制转换成二进制
(5)选择4,进行二进制转换成十六进制的程序界面,如图8-5所示:
图8-5二进制转换成十六进制
(6)选择5,进行十六进制转换成十进制的程序界面,如图8-6所示:
图8-6十六进制转换成十进制
选择6(q),退出主界面,如图8-7
图8-7,选择q退出主界面