代码转换程序设计Word格式.docx
《代码转换程序设计Word格式.docx》由会员分享,可在线阅读,更多相关《代码转换程序设计Word格式.docx(22页珍藏版)》请在冰豆网上搜索。
年月日
系主任(或责任教师)签名:
目录
摘要I
1原理分析1
2程序设计流程3
2.1程序流程图3
2.2设计思路4
3程序设计5
3.1堆栈段数据段程序设计5
3.2主程序设计5
3.3输入二进制程序7
3.4输入十进制程序8
3.5输入十六进制程序8
3.6输出二进制程序9
3.7输出十进制程序9
3.8输出十六进制程序11
3.9回车键确定程序11
3.10报警程序12
4运行结果13
5心得体会15
参考文献16
摘要
日常生活与实际应用中,往往需要计算机处理的信息是多种多样的,如各种进位制的数据,不同语种的文字符号和各种图像信息等。
但在计算机内部采用的是二进制计数制,这种进制表达方法对于人们研究分析是不那么方便的。
本次课程设计将通过所学的微机原理知识理论,用汇编语言编写程序,实现二进制、十进制与十六进制之间的相互转换,并在MF2KP软件上演示。
关键词:
汇编程序进制转换MF2KP
1原理分析
进位计数制是人们利用符号来计数的方法。
一种进位计数制包含一组数码符号和两个基本因素。
数码是用不同的数字符号来表示一种数制的数值,这些数字符号称为”数码”。
基是数制所使用的数码个数称为”基”。
权是某数制每一位所具有的值称为”权”。
十六进制(Hexadecimal)0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F
十进制(Decimal)0.1.2.3.4.5.6.7.8.9
八进制(Octal)0.1.2.3.4.5.6.7
二进制(Binary)0.1
在计算机内部采用二进制计数制,但在实际应用中,需要计算机处理的信息是多种多样的,如各种进位制的数据,不同语种的文字符号和各种图像信息等。
但在计算机中采用的是二进制计数制。
本次课程设计通过所学的微机原理,用汇编语言编写程序,实现二进制转换成十进制或十六进制,十进制转换成二进制或十六进制,十六进制转换成二进制或十进制。
十进制转换为二进制整数部分的方法叫做除2取余法,每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数。
小数部分的方法叫乘2取整法,就是将小数部分乘以2,然后取整数部分,剩下的小数部分继续乘以2,然后取整数部分,剩下的小数部分又乘以2,一直取到小数部分为零为止。
如果永远不能为零,就同十进制数的四舍五入一样,按照要求保留多少位小数时,就根据后面一位是0还是1,取舍,如果是零,舍掉,如果是1,向入一位。
换句话说就是0舍1入。
读数要从前面的整数读到后面的整数。
二进制转换为十进制不分整数和小数部分,方法(按权相加法)是将二进制每位上的数乘以权,然后相加之和即是十进制数。
二进制转换为十六进制用取四合一法,即从二进制的小数点为分界点,向左(向右)每四位取成一位,接着将这四位二进制按权相加,得到的数就是一位十六位二进制数,然后,按顺序进行排列,小数点的位置不变,得到的数字就是我们所求的十六进制数。
如果向左(向右)取四位后,取到最高(最低)位时候,如果无法凑足四位,可以在小数点最左边(最右边),即整数的最高位(最低位)添0,凑足四位。
将十六进制转换为二进制,取一分四法,即将一位十六进制数分解成四位二进制数,用四位二进制按权相加去凑这位十六进制数,小数点位置照旧。
十进制转换成十六进制的方法与十进制转换成二进制的方法相同,但不同的是每次除以16。
2程序设计流程
2.1程序流程图
Y
N
2.2设计思路
首先对原理进行分析,了解不同进制数之间是如何进行转换。
充分认识汇编语言的指令系统,掌握各个汇编指令的功能及用法,了解各种程序结构(顺序、分支、循环和子程序)的特点。
首先定义堆栈段,再定义数据段,在数据段中输入MENU中要显示的内容。
再建一个表TABLE,TABLE中的内容为L0,L1,L2,L3,L4,L5,L6把然后根据题目要求设计简单的程序流程图,再根据流程图设计出每一模块的汇编语言程序,然后再通过调用、跳转、转移等方法将各个子程序连接在一起。
这样依据题目要求的汇编程序就初步完成了,本次用到的软件是MF2KP,首先在MF2KP环境下输入设计的汇编程序,然后编译、连接、运行。
3程序设计
3.1堆栈段数据段程序设计
首先定义堆栈段的程序,程序如下所示:
STACKSEGMENTSTACK
DB200DUP(?
)
STACKENDS
在数据段中有后面程序要用到的数据MENU,mess1到mess6和error,还有数据表TABLE。
定义数据段程序如下所示:
DATASEGMENT
MENUDB'
PleaseInputyourChoice:
'
0dh,0ah
db'
1:
Bin2-->
Dec10'
2:
Hex16'
0dh,0ah
3:
Dec10-->
Bin2'
4:
5:
Hex16-->
6:
0:
Exit.$'
mess1db'
PleaseinputaBin2number:
$'
mess2db'
PleaseinputaDec10number:
mess3db'
PleaseinputaHex16number:
mess4db'
OutputBinis:
$'
mess5db'
OutputDecis:
mess6db'
OutputHexis:
errordb'
error!
pleaseinputyourchoiceagain$'
TABLEDWL0,L1,L2,L3,L4,L5,L6
DATAENDS
3.2主程序设计
在定义完堆栈段和数据段后,就是主程序的设计。
首先对寄存器AX清零,压栈。
读取数据,在屏幕上显示字符串MENU,根据MENU的提示,从键盘输入一字符串。
将该字符串减30H后于7进行比较,若小于7,则跳转到DONE程序,否则调用报警程序,发出声音报警并提示error。
在DONE程序中,若输入的数字为1,则立即跳转到L1,进行二进制转化为十进制;
若输入的数字为2,则跳转到L2,进行二进制转换为十六进制;
若为3,则跳转到L3进行十进制转换为二进制;
若为4,则跳转到L4进行十进制转换为十六进制;
若为5,则跳转到L5进行十六进制转换为二进制;
若为6,则跳转到L6进行十六进制转换为十进制;
如果为零,则退出程序,结束。
主程序的设计如下所示:
CODESEGMENT
MAINPROCFAR
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
PUSHDS
XORAX,AX;
清零
PUSHAX
MOVAX,DATA
MOVDS,AX
LKS:
LEADX,MENU;
取存储区首址
MOVAH,09H;
显示字符串
INT21H
MOVAH,01H;
从键盘输入字符串
SUBAL,30H
CMPAL,07h
JBDONE;
AL小于07H跳转到DONE
CALLSOUNDF;
调用报警程序
LEADX,error
显示字符串error
JMPMAIN
DONE:
LEASI,TABLE
MOVAH,0
SHLAX,1
ADDSI,AX
JMP[SI]
;
二进制转换成十进制
L1:
CALLINBIN;
调用输入二进制程序
CALLCRLF
CALLOUTDEC;
调用输出十进制程序
JMPLKS;
直接跳转到LKS
;
二进制转换成十六进制
L2:
CALLOUTHEX;
调用输出十六进制程序
CALLCRLF
JMPLKS
十进制转换成二进制
L3:
CALLINDEC;
调用输入十进制程序
CALLOUTBIN;
调用输出二进制程序
十进制转换成十六进制
L4:
十六进制转换成二进制
L5:
CALLINHEX;
调用输入十六进制程序
十六进制转换成十进制
L6:
L0:
RET
MAINENDP
CODEENDS;
代码段结束
ENDSTART;
程序结束
3.3输入二进制程序
二进制数从键盘键入之后只需要直接完成从键盘向内存的循环输入即可,其代码如下:
INBINPROC
LEADX,MESS1
显示字符串MESS1
MOVBX,0
INBL1:
MOVAH,01H;
从键盘输入字符
CMPAL,0DH;
比较输入的是否是回车键
JZINBEXIT;
等于零(回车键)跳转到INBEXIT
ANDAL,01H;
保留低四位
SHLBX,1;
逻辑左移一位
ORBL,AL
JMPINBL1
INBEXIT:
INBINENDP
3.4输入十进制程序
十进制数从键盘键入之后需要进行乘法运算之后转换成二进制数,再完成从键盘向内存的循环输入,其代码如下:
INDECPROC
LEADX,MESS2
显示字符串MESS2
INDL1:
JZINDEXIT;
等于零(回车键)跳转到INDEXIT
CMPAL,9
JBEINDL2;
小等于9跳转到INDL2
SUBAL,7
INDL2:
MOVAH,0
XCHGAX,BX;
AXBX交换
MOVCX,10
MULCX;
AX乘以CX
ADDBX,AX
JMPINDL1
INDEXIT:
INDECENDP
3.5输入十六进制程序
十六进制数从键盘键入之后需要进行从1位变为4位的移位运算转换成二进制数,再完成从键盘向内存的循环输入,其代码如下:
INHEXPROC
LEADX,MESS3
显示字符串MESS3
IHL1:
JZIHEXIT;
等于零(回车键)跳转到IHEXIT
JBEIHL2;
如果AL小等于9跳转到IHL2
IHL2:
MOVCL,4
SHLBX,CL;
BX逻辑左移CL位
JMPIHL1
IHEXIT:
INHEXENDP
3.6输出二进制程序
将内存中存储的2进制数输出为2进制数,只需要将内存中所存储的码循环输出显示出来即可,其代码如下:
OUTBINPROC
LEADX,MESS4
显示字符串MESS4
MOVCX,16
OBL1:
ROLBX,1;
BX循环左移一位
MOVDL,BL
ANDDL,01H
ORDL,30H
MOVAH,02H;
字符输出
LOOPOBL1;
循环OBL1
RET
OUTBINENDP
3.7输出十进制程序
将内存中存储的2进制数输出为10进制数,需要将内存中的码进行除法运算,再循环输出显示,其代码如下:
OUTDECPROC
LEADX,MESS5
显示字符串MESS5
PUSHBX;
压栈
MOVAX,BX
MOVDX,0
MOVCX,10000
DIVCX;
AX除以CX
MOVBX,DX
MOVDL,AL
MOVAH,02H
MOVCX,1000
DIVCX
MOVDL,AL
MOVCX,100
MOVCL,10
DIVCL
MOVBL,AH
POPBX
OUTDECENDP
3.8输出十六进制程序
将内存中存储的2进制数输出为16进制数,需要将内存中的码进行移位运算,将4位2进制数合并为1位16进制数,再循环输出显示,其代码如下:
OUTHEXPROC
LEADX,MESS6
显示字符串MESS6
MOVCX,4
OHL1:
循环左移
ROLBX,1
ANDDL,0FH;
ADDDL,30H
CMPDL,39H
JBEOHL2
ADDDL,7
OHL2:
MOVAH,02H
LOOPOHL1
OUTHEXENDP
3.9回车键确定程序
当输入指定数制的数之后,需要依靠此程序来确定输入完成并执行转换过程并输出,其代码如下:
CRLFPROC
输出字符
MOVDL,0DH;
确定(回车键)
MOVDL,0AH;
键盘缓冲输入
CRLFENDP
3.10报警程序
当输入的数不在所选范围(即数字0~6)时,会启动此程序进行报警并恢复到出错前的状况,其代码如下:
SOUNDFPROCNEAR
INAL,61H;
取得设备控制寄存器开关量
MOVBL,AL
MOVAL,0B6H
OUT43H,AL;
写入方式控制字
MOVAX,1000H;
输出频率1000Hz
OUT42H,AL;
先写入低8位
MOVAL,AH
后写入高8位
ORAL,3;
接通扬声器
OUT61H,AL;
设置设备控制寄存器开关量
MOVDX,2500
LOOP1:
DECDX
MOVCX,65535
LOOP2:
LOOPLOOP2;
循环LOOP2
CMPDX,0H
JNZLOOP1;
DX不等于0跳转到LOOP1
MOVAL,BL
恢复原状
RET
SOUNDFENDP
4运行结果
在微机原理实验平台集成开发环境MF2KP上输入该汇编程序,点击16位编码系统的汇编源程序,再点击连接目标码,再点运行程序。
这时弹出DOS窗口,窗口如图4-1所示。
图4-1初始窗口
首先进行二进制转换成十进制,在窗口中输入1,这时窗口中提示“PleaseinputaBinnumber:
”.输入二进制数11010110,运行显示结果如图4-2所示。
图4-2二进制转十进制
要进行二进制转换成十六进制时,在窗口中输入2,这时窗口中提示“PleaseinputaBinnumber:
”.输入二进制数11010110,运行显示结果如图4-3所示。
图4-3二进制转十六进制
要进行十进制转换成二进制时,在窗口中输入3,这时窗口中提示“PleaseinputaDecnumber:
”.输入十进制数113,运行显示结果如图4-4所示。
图4-4十进制转二进制
要进行十进制转换成十六进制时,在窗口中输入4,这时窗口中提示“PleaseinputaDecnumber:
”.输入十进制数159,运行显示结果如图4-5所示。
图4-5十进制转十六进制
要进行十六进制转换成二进制,在窗口中输入5,这时窗口中提示“PleaseinputaHexnumber:
”.输入十六进制数1D,运行显示结果如图4-6所示。
图4-6十六进制转二进制
要进行十六进制转换成十进制,在窗口中输入6,这时窗口中提示“PleaseinputaHexnumber:
”.输入十六进制数30,运行显示结果如图4-7所示。
图4-7十六进制转十进制
当输入非0-6的字符时,系统报错,请求重新输入,运行显示结果如图4-8所示。
图4-8报错界面
5心得体会
回顾此次微机原理课程设计,至今感慨颇多。
的确,从选题到定稿,从理论到实践,在短短的一个星期的日子里,有苦有甜。
同时也学到很多很多新的东西,虽然时间有限但是自己很多方面都有了提升,如动手编程能力和解决问题的能力。
课程设计刚开始拿到题目时,对于理论知识学习不够扎实的我深深感到了自己的不足,便重新看了教材,对知识进行了梳理,掌握了基本理论知识。
这样对平时学习的不足和缺陷就有所弥补。
遇到过各种各样的问题,没有扎实的理论知识是无法解决的。
只有把所学的理论知识与实践相结合起来,从理论中得出结论,通过实际动手去验证理论,在这二者的配合下,我们不仅可以成功的完成课程设计,而且还可以掌握和巩固所学知识,充实自己的知识储备。
同时也可以使自己的实际动手能力和独立思考的能力在一定程度上得到提升,使自己能更好的适应社会的要求。
通过本次课程设计,我在发现问题、分析问题和解决问题的能力得到了提升。
培养了我的设计思维,提高了我们的逻辑思维能力,使我们在汇编程序的分析与设计上有了很大的进步。
同时也让我在面对问题的时候不在像以前那样惊慌失措,而是慢慢分析问题,逐步去解决问题,实现各个击破。
培养我们独立思考的能力,和逻辑的分析能力.
总之,通过本次课程设计,我收获颇丰,一方面使自己各方面能力在一定程度上得到提升,另一方面是自己切身体会到汇编语言的实用性和有效性,同时在让我体会到了设计的艰辛的同时,更让我体会到成功的喜悦和快乐。
参考文献
【1】《微机原理与接口技术》,姚燕男、薛钧义编著,高等教育出版社,2004
【2】《微型机原理与接口技术》,刘永华,王成端编著,清华大学出版社,2006
【3】《微型计算机原理与接口技术》,杨立等编著,中国水利水电出版社,2005
【4】《微机原理应用实践》,王萍、周根元等编著,机械工业出版社,2001
【5】《微型计算机原理与与常用接口技术》,袁开榜等编著,中国水利水电出版社,2006
本科生课程设计成绩评定表
性别
男
专业、班级
课程设计题目:
课程设计答辩或质疑记录:
成绩评定依据:
评定项目
评分成绩
1.选题合理、目的明确(10分)
2.设计方案正确、具有可行性、创新性(20分)
3.设计结果(20分)
4.态度认真、学习刻苦、遵守纪律(15分)
5.设计报告的规范化、参考文献充分(不少于5篇)(10分)
6.答辩(25分)
总分
最终评定成绩(以优、良、中、及格、不及格评定)
指导教师签字:
年月日