计算机组成原理与汇编语言课程设计字母与进制转换系统.docx
《计算机组成原理与汇编语言课程设计字母与进制转换系统.docx》由会员分享,可在线阅读,更多相关《计算机组成原理与汇编语言课程设计字母与进制转换系统.docx(20页珍藏版)》请在冰点文库上搜索。
计算机组成原理与汇编语言课程设计字母与进制转换系统
课程设计报告
课程名称:
计算机组成原理与汇编语言
报告题目:
字母与进制转换系统
学生姓名:
所在学院:
信息科学与工程学院
专业班级:
指导教师:
2013年6月26日
摘要
汇编语言是计算机能够提供给用户使用的最快且最有效的语言,也是能够充分利用计算机所有硬件资源并能直接控制硬件的唯一语言。
用汇编语言编制的程序同机器语言程序一一对应,它的目标代码短,运行速度快,在对程序的时间和空间要求很高的场合,往往需要采用汇编语言。
本程序是用汇编语言编写的字母与进制转换系统,拥有三个子功能。
分别为将大写字母转换为小写字母,将十进制数转换为十六进制数和将十六进制数转换为十进制数。
通过此次课程设计,我们对汇编语言的大部分基本指令非常熟悉。
分析问题,解决问题的能力将得到极大的提高。
关键词:
汇编;语言;进制;转换
目录
一、课题分析…………………………………………………………………………1
二、需求分析……………………………………………………………2
1.功能描述……………………………………………………………………2
2.功能模块分析………………………………………………………………2
三、设计方案………………………………………………………3
1.系统流程图……………………………………………………………3
2.子程序模块设计……………………………………………………………43.详细设计……………………………………………………………………4
4.程序调试结果及分析………………………………………………………11
四、结论与心得………………………………………………………………………12
五、参考文献……………………………………………………………………13
一、课题分析
根据要求我们做的是完成一个字母或数制之间的转化程序,主程序分别具有3种可选择的子功能,按相应的字母(X=>功能1;Y=>功能2;Z=>功能3;)可分别进入相应的子功能并在屏幕上显示结果。
3种可选择的子功能分别为:
1)实现大写字母向小写字母的转换2)实现十进制数向十六进制数的转换3)实现十六进制数向十进制数的转换。
当运行程序后,应该要出现一个主菜单界面,主界面应该要能进入三个子功能界面,即输入X,进入实现大写字母向小写字母的转换的子功能界面;输入Y,进入十进制数向十六进制数转换的子功能界面;输入Z,进入十六进制数向十进制数的转换。
如:
当选中了大写字母向小写字母转换的功能后,如果输入的不是大写字母,应要提示输入错误,请重新输入,直到输入正确为止。
通过改变ASSIC码值,实现大写字母向小写字母的转换。
显示转换后的字母后,跳转到主菜单,重新选择子功能。
二、需求分析
1.功能描述
本程序共有三个功能,3种可选择的子功能分别为:
1)实现大写字母向小写字母的转换2)实现十进制数向十六进制数的转换3)实现十六进制数向十进制数的转换。
输入相应的字符即可分别进入相应的子功能并在屏幕上显示结果。
输入X:
进入实现大写字母向小写字母的转换子功能模块。
输入Y:
进入实现十进制数向十六进制数转换的子功能模块。
输入Z:
进入实现十六进制数向十进制数转换的子功能模块。
如果用户输入X,即进入实现大写字母向小写字母转换的子功能模块,如果输入的不是大写字母,应要提示输入错误,请重新输入,直到输入正确为止。
通过改变ASSIC码值,实现大写字母向小写字母的转换。
显示转换后的字母后,跳转到主菜单,重新选择子功能。
如果用户输入Y,即进入实现十进制向十六进制转换的子功能模块,十进制转十六进制数以二进制为中介,先将输入视为十进制,转换为二进制数保存在BX中。
然后再将这个二进制数转换为十六进制数保存在之前设定的单元中并输出,然后跳转到主菜单。
如果用户输入Z,即进入实现十六进制向十进制转换的子功能模块,十六进制转换为十进制数的主要思想是按权值展开再相加,转换输出后,跳转到主菜单。
2.功能模块分析
本程序主要由四个模块构成。
首先是主界面,将显示本程序拥有的所有的子功能。
然后是三个子功能。
分别拥有将大写字母转换成小写字母,将十进制数转换成十六进制数,将十六进制数转换成十进制数的功能。
主菜单:
显示系统名称,显示各字母编号所对应的子功能。
大写字母转换成小写字母:
当用户输入X编号时,便进入此子功能。
提示输入一个大写字母,如果输入的不是大写字母则提示输入错误,请重新输入。
通过改变ASSIC码值,实现大写字母向小写字母的转换。
显示转换后的字母,然后跳转到主菜单。
十进制数转换成十六进制数:
当用户输入Y编号时,便进入此子功能。
提示输入一个十进制数,十进制转十六进制数以二进制为中介,先将输入视为十进制,转换为二进制数保存在BX中。
然后再将这个二进制数转换为十六进制数保存在预先准备的单元中,输出之后跳转到主菜单。
十六进制数转换成十进制数:
当用户输入Z编号时,便进入此子功能。
提示输入一个十六进制数,十六进制数转换成十进制的主要思想是,按权值展开再相加。
首先是将输入的字符转换成相应的数字,通过设置相应的变量,依次进行累乘,直到十六进制数位数全部循环完毕,将每一位所得的数保存在寄存器中,每进行一次就实现一次求和运算。
最后将转换成的十进制数输出,跳转到主菜单。
三、设计方案
1.系统流程图
主菜单
开始
其他
XYZQ
N
N
N
Y
YY
2.子程序模块设计
(1)大写字母转换成小写字母子程序
当用户选择编号X,便选中了这一个子功能。
通过判断标识符,程序跳转到标识符所在的位置。
根据提示输入一个大写字母,会有一个判断输入是否合法的过程,若输入的是非大写字母,则会提示输入错误,请重新输入,直到输入正确为止。
通过改变ASSIC码值,实现大写字母向小写字母的转换。
显示转换后的字母,然后跳转到主菜单。
(2)十进制数转换成十六进制数子程序
当用户选择编号Y,便选中了这一个子功能。
通过判断标识符,程序跳转到标识符所在的位置。
根据提示输入一个十进制数。
总体来说是以二进制为中介,先将输入视为十进制,转换为二进制数保存在BX中,然后再将这个二进制数转换为十六进制数保存在之前定义好的的单元中并输出,然后跳转到主菜单。
(3)十六进制数转换成十进制数子程序
当用户选择编号Z,便选择了这一个子功能。
通过判断标识符,程序跳转到标识符所在的位置。
根据提示输入一个十六进制数,此时会进行判断,若是输入字符串不符合十六进制数的要求,则提示输入错误,重新输入,直到输入正确为止。
十六进制数转换成十进制的主要思想是,按权值展开再相加。
首先是将输入的字符转换成相应的数字,通过设置相应的变量,在最低位上的权值是1,然后依次是16,256……依次进行累乘,直到十六进制数位数全部循环完毕,将每一位所得的数保存在寄存器中,每进行一次就实现一次求和运算。
最后将转换成的十进制数输出,跳转到主菜单。
3.详细设计
(1)主菜单设计
includeio32.inc
.data
m1byte'字母与进制转换系统',13,10,0;菜单
m2byte'----------------------------------------------',13,10,0;分割线
m3byte'编号操作',13,10,0
mabyte'X实现大写字母向小写字母的转换',13,10,0
mcbyte'Y实现十进制向十六进制数的转换',13,10,0
mebyte'Z实现十六进制向十进制数的转换',13,10,0
mqbyte'Q退出',13,10,0
m_errbyte'输入错误,请重新输入',13,10,0
m_meaubyte'请输入菜单中的编号:
',0
m_inputlbyte'请输入一个大写字母:
',0
m_outputlbyte'对应的小写字母:
',0
m_meaubyte'请输入菜单中的编号:
',0
m_input1byte'请输入一个十进制数:
',0
m_output1byte'转换后的十六进制的数:
',0
m_meaubyte'请输入菜单中的编号:
',0
m_input3byte'请输入一个十六进制的数:
',0
m_output3byte'转换后的十进制数:
',0
arraybyte8dup(0);用字符串数组保存十六进制数
sumdword?
;十进制数变量
lenbyte?
;字符串数组的长度
mbyte?
array2byte100dup(0);用来保存转换后的十六进制数
ndword?
kdword?
jdword?
.code
start:
moveax,offsetm1;显示菜单中的内容
calldispmsg
moveax,offsetm2
calldispmsg
moveax,offsetm3
calldispmsg
moveax,offsetmx
calldispmsg
moveax,offsetmy
calldispmsg
moveax,offsetmz
calldispmsg
moveax,offsetmq
calldispmsg
meau:
moveax,offsetm_meau
calldispmsg;提示输入相应的菜单编号
callreadc;输入对应的编号
calldispcrlf;换行
cmpal,'x';判断输入
jza;若输入‘x’,则跳转到标识符‘a’
cmpal,'y'
jzb;若输入‘y’,则跳转到标识符‘b’
cmpal,'z'
jzc;若输入‘z’,则跳转到标识符‘c’
cmpal,'q'
jzq;若输入‘q’,则跳转到标识符‘q’
moveax,offsetm_err
calldispmsg;输入错误,提示错误的信息
jmpmeau
(2)大写字母转换为小写字母子程序设计
returna:
moveax,offsetm_err
calldispmsg
a:
moveax,offsetm_inputl
calldispmsg;提示输入一个大写的字母
callreadc;获得字母
movbl,al;将输入的内容存储到bl中
calldispcrlf;换行
cmpal,'A';判断输入的字母是否合法
jbreturna;如果比'A'小,则跳转到returna标识符
cmpal,'Z'
jareturna;如果比'Z'大,则跳转到returna标识符
calldispc;显示字母
moveax,offsetm_outputl
calldispmsg;输入正确,则提示输出相应的小写字母
addbl,20h;实现大写向小写的转换
moval,bl
calldispc;显示转换后的字母
calldispcrlf;换行
jmpmeau
(3)十进制数转换为十六进制数子程序设计
datasegment
strdb0ah,0dh
numdb4dup(?
),'H$'
tabdb'0123456789ABCDEF'
dataends
codesegment
assumecs:
code,ds:
data
begin:
movax,data
movds,ax;初始化代码段
xorbx,bx
movcx,10;进制
next:
movah,1
int21h
cmpal,0dh
jzconv;如果是回车,表示输入结束,转换开始
pushax;保存输入值,和AH
movax,bx
mulcx
movbx,ax;将先前的结果向上推一位
popax;取回本次输入
andal,0fh;屏蔽掉无用位,类SUBAL,30H
xorah,ah;高位归零
addbx,ax;合并本次输入
jmpnext
conv:
movax,bx;开始转换
movch,4
leabx,tab
movcl,4
leasi,num
lopa:
rolax,cl;把高4位移到低4位
pushax
andax,000fh;取出低4位
mov[si],al;按地址由低到高的顺序将结果由高到底存放
incsi
popax
decch
jnzlopa
leadx,str
movah,9
int21h;回车换行
movah,4ch
int21h
calldispcrlf
jmpmeau;返回主菜单
(4)十六进制数转换为十进制数子程序设计
movm,al
moveax,offsetm_input3
calldispmsg
moveax,offsetarray
callreadmsg
movlen,al;获得字符串长度
xorecx,ecx;异或清零
movcl,len;计数
deccl;自减1
xoreax,eax
movedx,1;初始权值
again:
cmparray[ecx],'A'
jlshiliu_shi1;小于A,转向shiliu_shi1
cmparray[ecx],'F'
jgshiliu_shi1;大于Z,转向shiliu_shi1
xorebx,ebx
movbl,array[ecx];相对寻址
subbl,55;转换成相应的数字
imulebx,edx
addeax,ebx
imuledx,16;改变权值
jmpshiliu_shi3
shiliu_shi1:
cmparray[ecx],'0'
jlshiliu_shi2;小于‘0’,转向shiliu_shi2
cmparray[ecx],'9'
jgshiliu_shi2;大于‘9’,转向shiliu_shi2
xorebx,ebx;临时寄存
movbl,array[ecx]
subbl,'0';转换成相应的数字
imulebx,edx
addeax,ebx
imuledx,16;改变权值
jmpshiliu_shi3
shiliu_shi2:
moveax,offsetm_err
calldispmsg;提示输入错误
jmpz
shiliu_shi3:
dececx;自减
cmpecx,0
jnlagain;不小于0,转向again
movsum,eax
cmpm,'e'
jzee;直接输出
ee:
moveax,offsetm_output3
calldispmsg
moveax,sum;数据输出
calldispuid
calldispcrlf
jmpmeau;返回主菜单
(4)程序调试结果及分析
图4.1主菜单界面
图4.2大写字母转换为小写字母
图4.3十进制数转换为十六进制数
图4.2十六进制数转换为十进制数
四、结论与心得
通过本次课程设计,我对汇编语言有了进一步的了解,对于编写汇编语言程序的能力有了很大的提高。
在此次课程设计中,我更深层次的了解到了汇编的大部分基本的指令。
经过几个星期的奋战,对代码进行了无数次的改进,在这个过程中,我的分析问题和解决问题的能力有了很大的提高。
在对程序的不断调试中,不断的发现问题,并通过到网上以及图书馆查找相关的资料予以解决,有很大的成就感,提高了自己的自信心。
经过这次课程设计,我收获颇多,不仅仅是分析问题以及解决问题的能力有了很大的提高,更养成了良好的编程习惯。
这对以后的工作是非常有益的。
在编写代码时,由于代码很多,一个小小的问题都将带来很大的麻烦,所以在编写代码时必须非常认真,这也是一种能力的提高。
当程序调试成功,那一份喜悦是无法用语言来描述的。
不仅从中体会到了编程的乐趣,提高自己的自信心,更增强了自己对于计算机的兴趣,这是非常重要的。
五、参考文献
[1]易小琳.计算机组成原理与汇编语言.北京:
清华大学出版社,2009.
[2]钱晓捷.新版汇编语言程序设计.北京:
电子工业出版社,2008.
[3]唐朔飞.计算机组成原理.2版.北京:
高等教育出版社,2008.
[4]洪志全 ,罗省贤.汇编语言程序设计教程.北京:
电子工业出版社,2004
[5]俸远祯,王正智,徐洁等.计算机组成原理与汇编语言程序设计.北京:
电子工业出版社,1999.