汇编语言进制转换程序课程设计报告内有详细代码.docx
《汇编语言进制转换程序课程设计报告内有详细代码.docx》由会员分享,可在线阅读,更多相关《汇编语言进制转换程序课程设计报告内有详细代码.docx(17页珍藏版)》请在冰豆网上搜索。
汇编语言进制转换程序课程设计报告内有详细代码
课程设计说明书
院系:
计算机
专业班级:
计1002
学号:
**********
*******
*******
2010年12月31日
安徽理工大学课程设计(论文)任务书
计算机科学与工程学院硬件教研室
学号
学生姓名
专业(班级)
设
计
题
目
题目一:
判断闰年
题目二:
简单计算器
题目三:
代码转换程序√
题目四:
字符图形程序
题目五:
学生成绩管理
题目六:
打字练习(注:
请在自己选做的题目后打√)
设
计
技
术
参
数
1.熟悉汇编指令、宏汇编语言的编程方法
2.BIOS中断调用、系统功能中断调用方法
3.磁盘文件、及文件内容操作
设
计
要
求
题目的选择是根据汇编语言的特点主要针对系统内部的一些中断调用、系统功能调用、系统数据处理、文件数据处理而设计的,是对所学课程知识较为系统的应用。
由于汇编语言编程相对其他语言编程比较复杂,因此,在设计上应把重点放在程序的功能实现上,不要太在意程序的结构和显示界面的设计。
不要局限于题目所规定的要求,可以灵活裁减,设计出功能更完善的程序。
另外,也可以自己设计题目,同时,提出详细的功能描述,经指导老师审查同意后也可作为课程设计的题目。
工
作
量
1.完成所选题目的软件设计;
2.课程设计说明书1000字(不包括程序源代码)左右。
工
作
计
划
第1次熟悉软件环境。
第2次绘制程序流程图。
第3次用编写程序。
第4次用调试运行程序。
第5次编写课程设计说明书
参
考
资
料
1.李敬兆8086/8088和arm核汇编语言程序设计中国科技大学出版社
2.沈美明,温冬婵编著IBM—PC汇编语言程序设计(第二版)清华大学出版社出版
3.沈美明,温冬婵,张赤红编著IBM—PC汇编语言程序设计实验教程清华大学出版社出版
指导教师签字
教研室主任签字
2010年12月17日
安徽理工大学课程设计(论文)成绩评定表
指导教师评语:
成绩:
指导教师:
年月日
摘要
代码转换程序主要是字母间的转换和数制之间的转换。
字母转换主要是字母大小写转换,进制转换是二进制、十进制、十六进制之间的互换。
程序首先给了一个选择需要进行的转换的菜单,用户根据界面信息选择功能。
通过这种转换中数据的流向能够更好的理解计算机的一些基本原理,如计算机数据的存储形式和一些基本的DOS功能调用的基本方法与注意事项。
关键词:
大小写字母,二进制,十进制,十六进制,数据
1设计目的
1、实现大小写字母之间的转换:
输入的字符串中,不是字母的字符不改变;大写字母改成小写字母时,若是大写字母则不改变;同样,小写字母改成大写字母时,若是小写字母则不改变
2、二进制和十六进制数之间的转换:
输入一个二进制数(或十六进制数),用十六进制数(或二进制数)表示输出。
最多能把十六位二进制数(或四位十六进制数)用四位十六进制数(或十六位二进制数)表示输出;小于十六位(或四位)时按回车结束并输出
3、十进制数和十六进制数之间的转换:
输入一个十进制数(或十六进制数),用十六进制数(或十进制数)表示输出。
最大能把十进制数65535(或十六进制数FFFF)转换成十六进制数FFFF(或十进制数65535)表示输出;小于65535(或FFFF)时按回车结束并输出
4.二进制数和十进制数之间的转换:
输入一个十进制数(或二进制数),用二进制数(或十进制数表示输出)。
最大能把十进制数65535(或十六位二进制数),用二进制数(或十进制输出)。
当输入的数值小于65535(或16位二进制数时)按回车结束并输出。
2.1系统总体分析
程序首先会显示主界面。
然后根据用户的不同选择调用不同的模块,实现不同的功能。
1.大小写字母转换功能,是通过调用子函数input实现对字符串的输入,然后调用宏gaixie来实现对大小写的转换,其中宏是通过参数的传递来确定是小写转换成大写,还是大写转换成小写的。
从而决定是对操作数进行加或减20H。
2.数制之间的转换主要指通过六大模块来完成的。
其中有三个模块是分别是二进制、十进制、十六进制的输入,并存储到BX中。
类外三个模块分别是将BX中的数转换成二进制、十进制、十六进制的输出。
这样做的好处是可以只写将程序尽可能的简化,将前三个模块与后三个模块进行组合就可以完成所需要的进制转换。
2.2主模块框图及说明
程序首先显示主界面,然后用户输入1-9选择不同的功能,
则跳转到不同的模块,执行后在跳转到主模块,若是其他字符,则显示出错信息,并返回主模块。
如图2-1为主模块的逻辑图
图2-1主模块的逻辑图
3详细设计
3.1主模块及子模块说明
主模块:
在屏幕上显示程序的主要功能并有用户选择,然后根据用户的选择调用相应的功能模块。
HEXIBIN:
输入一个十六进制数(不超过4位),并存放在BX中
INBIN:
输入二进制数(不超过16位),并存放在BX中
DECIBIN:
输入一个十进制数(不超过65535),并存放在BX中
BINIHEX:
把BX中的数转换成十六进制并输出
BINIDEC:
用来把BX数转换到十进制并
PRINT:
用来把BX中的数转换成二进制并输出
INPUT:
字符串的输入,并存储
GAIXIE:
把字符串转换成大写或小写,然后输出
CRLF:
换行
3.2各模块详细设计
3.2.1主模块
主模块是通过9号功能调用,显示主界面。
然后用1号功能调用输入用户的选择。
然后分别跳转到相应的功能。
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETBUF;输出选择主界面
MOVAH,9;调用9号中断功能
INT21H
MOVAH,1;输入要选择的操作
INT21H
CMPAL,'1';把AL中内容跟1比较
JZBTOS;相等则跳转到
CMPAL,'2'
JZSTOB1
CMPAL,'3'
JZHTOB
CMPAL,'4'
JZBTOH
CMPAL,'5'
JZHTOD
CMPAL,'6'
JZDTOH
CMPAL,'7'
JZBTOD
CMPAL,'8'
JZDTOB
CMPAL,'9'
JZEXIT
LEADX,BUF3;把BUF3的首地址给DX
MOVAH,9
INT21H
CALLCRLF;调用子程序CALL
JMPSTART;返回,重新选择
EXIT:
MOVAH,4CH;退出
3.2.2HEXIBIN
首先将BX清零作为输入数的存储,DX清零记为输入数的位数控制输入循环。
通过对每一个输入输出判断其为小写字母或大写字母或数字,减去不同的数值,得到其代表的数值大小。
然后将BX中的数值乘以16再与其相加存于BX中,同时DX加1,入DX不大于4,则进入下一轮跳转,否则就结束。
HEXIBINPROCNEAR
MOVBX,0;把BX清零
MOVDX,0;作为输入四位的记数器
INHEX:
CMPDX,4;把DX跟4比较
JNBHEXEND;大于则跳转,子程序结束
MOVAH,1;输入数据
INT21H
CMPAL,1BH;遇到Esc则退出
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
3.2.3INBIN
程序同上一个模块基本相同。
首先将BX清零作为输入数的存储,CX清零记为输入数的位数控制输入循环。
通过对每一个输入数字,减去30H,得到其代表的数值大小。
然后将BX中的数值乘以2再与其相加存于BX中,同时CX加1,入CX不大于16,则进入下一轮跳转,否则就结束。
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
3.2.4DECIBIN
程序同上一个模块基本相同。
首先将BX清零作为输入数的存储,CX清零记为输入数的位数控制输入循环。
通过对每一个输入数字,减去30H,得到其代表的数值大小。
然后将BX中的数值乘以10再与其相加存于BX中,同时CX加1,入CX不大于5,则进入下一轮跳转,否则就结束。
DECIBINPROCNEAR
MOVBX,0
MOVCX,0
NEWCHAR:
CMPCX,5
JNBEXIT4
MOVAH,1
INT21H
CMPAL,1BH
JZEXIT4
SUBAL,30H
JLEXIT4
CMPAL,9
JGEXIT4
CBW
INCCX
XCHGAX,BX
MOVDX,10
MULDX
XCHGAX,BX
ADDBX,AX
JMPNEWCHAR
EXIT4:
RET
DECIBINENDP
3,2,5BINIHEX
将BX中的数转换成十六进制数输出就是每次取出四位算出其数值,然后转换成相应的ASCII码输出。
BINIHEXPROCNEAR;把数转换成十六进制输出
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
3.2.6BINIDEC
将BX中的数转换成十进制数输出,就是将BX中的数每次分别处以10000,1000,100,10,1将其所得到的商输出,而其余数存入BX中进入下一轮循环。
这样输出就是要得到的十进制数。
BINIDECPROCNEAR
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
3.2.7PRINT
将BX中的数转换成二进制:
因为BX中原本就是按照二进制存储的,所以只需每次左移,将所得到的数加30h得到其ASCII码然后输出即可。
PRINTPROCNEAR;把BX中的十六进制数转换成二进制
MOVCX,16D;记数
ROT:
SHLBX,1D;每移一位最高位变为CF
JCSET;CF为1则跳到SET,否则输出0
MOVDL,30H
MOVAH,2
INT21H
DECCX
JNZROT
RET
3.2.8INPUT
输入字符串:
通过10号功能调用,将所输入的字符串输入到缓冲区,缓冲区首=DS:
DX
INPUTPROCNEAR;输入字符串
MOVDX,0;DX清零
MOVDX,OFFSETBUF1
MOVAH,10
INT21H
LEADX,BF
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
3.2.9GAIXIE
大小写字母的转换只是对其加上或者减去20H即可。
P3、P4分别对应的是‘a’、‘z’或者‘A’、‘Z’,P6对应的是ADD或者SUB。
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,BUF8
MOVAH,9
INT21H
LEADX,BUF1+2;输出改写后的字母
MOVAH,9;调用9号中断功能,输出字符串
INT21H
LEADX,BF;把BF首地址给CX
MOVAH,9;调用9号中断功能
INT21H
JMPSTART;返回
ENDM
3.2.10CRLF
换行:
无实际的意义,只是为了让界面更加美观。
CRLFPROCNEAR
LEADX,BF
MOVAH,9
INT21H
RET
CRLFENDP
4.程序调试
4.1运行界面分析
运行程序得如图4-1主界面
图4-1主界面
选择1,大写字母转小写字母如图4-2
图4-2大写字母转小写字母
选择2,小写字母转大写字母如图4-3
图4-3小写字母转大写字母
选择3,十六进制到二进制的转换,如图4-4
图4-4十六进制转二进制
选择4,二进制到十六进制的转换,如图4-5
图4-5二进制转十六进制
选择5,十六进制到十进制的转换,如图4-6
图4-6十六进制转十进制
选择6,十进制到十六进制的转换,如图4-7
图4-7十进制转十六进制
选择7,二进制到十进制的转换,如图4-8
图4-8二进制转十进制
选择8,十进制到二进制的转换,如图4-9
图4-9十进制转二进制
选择9则退出,选择其他输入,如输入q,如图4-10
图4-10错误输入
4.2算法的分析
代码转换器主要是由两部分组成:
大小写字母转换和数制转换。
大小写字母转换就是在其原来的ASCII码的基础上或加或减20H就可得到。
数值转换是二进制、十进制、十六进制之间的转换。
通过调用不同的函数避免了数值之间的转换。
首先是三个输如模块,对于输入的字符如果是0-10之间的就减去30H,得到其代表的数的含义,A-F之间的就减去37H,a-f之间的就减去57H,得到其代表的数的含义,让后乘以权值相加存于BX即可。
然后是三个输出模块,因为BX中存的本就是二进制数,所以直接移位输出就可得到二进制数。
十六进制数是每四位二进制数转换成一位十六进制数即可。
十进制数相对复杂,将BX中的数转换成十进制数输出,就是将BX中的数每次分别处以10000,1000,100,10,1将其所得到的商输出,而其余数存入BX中进入下一轮循环。
这样输出就是要得到的十进制数。
4.3调试过程及分析
在进行调试的过程中遇到的问题层出不穷,但大多是因为一些粗心的错误。
刚开始遇到最多的问题便是程序在编译时没有任何错误,链接的按钮仍然是灰色的不能够链接,茫然不知所措。
上网查找资料却找不到任何相应的情况。
于是就不用学校机房里的MASM,换了另外一款编译器(MasmforWindows集成实验环境2009.2),在进行编译时提示出错“Invalidcharacterinthefile”,在错误信息表中查得是文中使用了无效字符,多数情况下是使用了中文的标点符号。
根据这款编译器中代码颜色的不同很快就发现了是在写注释的时候“;”使用错误了。
另外一个让我记忆犹新的问题是所有的子函数都是正确的,但是在将所有的模块进行组合时出了个错“relativejumpoutofrangeby0001hbytes”,感觉很郁闷,在编译器给的信息表中也没有查到为什么。
最后在网上查到答案即:
8086中的条件跳转指令的跳转范围是-126~129(相对于该指令的字节偏移量),不能超出这个范围。
原代码:
CMPAL,'2'
JZSTOB
更改为:
CMPAL,’2’
JZSTOB1
STOB1:
JMPSTOB
如此就搞定了。
当然还有一些平时不会注意到的问题,比如使用INT指令会改变AL的值,这些微不足道的地方却恰恰是最容易忽略的地方。
5心得体会
5.1设计体会
经过近两个星期的工作,才把课程设计完成。
经过这次课程设计,我加深了对汇编语言的理解,也对上课时所说的语法有了深刻的认识。
相对于以前学习的高级语言,对汇编语言的第一印象是很酷,因为它很抽象。
怀着崇拜的心情学着汇编语言,虽然枯燥,但是每当完成一个很简单的程序就会感到非常的有成就感。
当我刚开始选择这个题目是因为课本上有一个相近的代码转换,所以感觉这个题目应该很好写。
可是等到真正动手的时候就感到了困难。
首先是对字符串的输入输出的处理,解决不了就改成了字母大小写转换是每次只输入一个字母,然后根据其大小写转换,如大写就转换成小写,否则反之。
然而在随后的进制转换中用遇到了同样的问题,发现这是一个不能不解决的问题,随后查阅了资料才解决。
随后实在数值转换过程中对模块的设计上又出现了问题。
最初的构想是设计六个模块分别对应相应的数值转换功能。
可是在三个写好以后发现了下面要写的代码有很多重复的地方,于是就把这些重复的代码定义成了子函数来使用然后发现将程序按照输入、输出的不同来分模块,以BX作为连接,比原来的程序更为简洁,逻辑上也更加清楚,有种豁然开朗的感觉。
在改进程序的过程中感到非常有成就感。
在编写代码的过程中让我充分感受到了不同编程语言之间的差别。
对与高级语言来说或许是很简单的一个程序或者只需要调用已有的函数库,可是对于汇编来说却要写上几十行甚至更多的代码。
可是更加深刻的了解了寄存器、存储器之间的数据流向,因为每个考虑不周都会导致一大堆的错误出现,常常令人感到一种无力感,想要放弃。
当程序一步步接近完成,看着子函数一个个都运行成功,再组合到一起,那种喜悦是无与伦比,之前所受到的苦楚又是那么的微不足道。
更怎强了我对汇编语言的兴趣。
5.2系统改进
此程序的健壮性不够,在数值转换的过程中,当输入被换算的数值时,如果数值是正确的则能够正确的处理,当不正确的时候都输出的是0。
数值转换的数值范围是0FFFFh,这是BX中存储的最大范围了,应该可以将其改进的更大一些。
参考文献
[1]李敬兆.《8086/8088和arm核汇编语言程序设计》.合肥:
中国科技大学出版社
[2]沈美明,温冬婵编著.《IBM—PC汇编语言程序设计(第二版)》.北京:
清华大学出版社出版
[3]沈美明,温冬婵,张赤红编著.《IBM—PC汇编语言程序设计实验教程》.北京:
清华大学出版社出版