ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:111.06KB ,
资源ID:10979327      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10979327.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(汇编语言进制转换程序课程设计报告内有详细代码.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

汇编语言进制转换程序课程设计报告内有详细代码.docx

1、汇编语言进制转换程序课程设计报告内有详细代码课程设计说明书 院 系: 计算机 专业班级: 计1002 学 号: * * * * * 2010年 12月31日 安徽理工大学课程设计(论文)任务书 计算机科学与工程学院 硬件 教研室学 号 学生姓名 专业(班级) 设计题目题目一:判断闰年题目二: 简单计算器题目三: 代码转换程序 题目四:字符图形程序题目五: 学生成绩管理题目六: 打字练习 (注:请在自己选做的题目后打)设计技术参数1 熟悉汇编指令、宏汇编语言的编程方法 2 BIOS中断调用、系统功能中断调用方法 3 磁盘文件、及文件内容操作设计要求题目的选择是根据汇编语言的特点主要针对系统内部的

2、一些中断调用、系统功能调用、系统数据处理、文件数据处理而设计的,是对所学课程知识较为系统的应用。 由于汇编语言编程相对其他语言编程比较复杂,因此,在设计上应把重点放在程序的功能实现上,不要太在意程序的结构和显示界面的设计。不要局限于题目所规定的要求,可以灵活裁减,设计出功能更完善的程序。 另外,也可以自己设计题目,同时,提出详细的功能描述,经指导老师审查同意后也可作为课程设计的题目。 工作量1.完成所选题目的软件设计;2.课程设计说明书1000字(不包括程序源代码)左右。工作计划第1次熟悉软件环境。第2次绘制程序流程图。第3次用编写程序。第4次用调试运行程序。第5次编写课程设计说明书参考资料1

3、.李敬兆 8086/8088和arm核汇编语言程序设计 中国科技大学出版社 2.沈美明,温冬婵 编著IBMPC汇编语言程序设计(第二版) 清华大学出版社出版3. 沈美明,温冬婵,张赤红 编著IBMPC 汇编语言程序设计实验教程 清华大学出版社出版指导教师签字教研室主任签字 2010年 12月 17 日安徽理工大学课程设计(论文)成绩评定表指导教师评语:成绩: 指导教师: 年 月 日摘要代码转换程序主要是字母间的转换和数制之间的转换。字母转换主要是字母大小写转换,进制转换是二进制、十进制、十六进制之间的互换。程序首先给了一个选择需要进行的转换的菜单,用户根据界面信息选择功能。通过这种转换中数据的

4、流向能够更好的理解计算机的一些基本原理,如计算机数据的存储形式和一些基本的DOS功能调用的基本方法与注意事项。关键词:大小写字母,二进制,十进制,十六进制,数据1设计目的1、实现大小写字母之间的转换:输入的字符串中,不是字母的字符不改变;大写字母改成小写字母时,若是大写字母则不改变;同样,小写字母改成大写字母时,若是小写字母则不改变2、二进制和十六进制数之间的转换:输入一个二进制数(或十六进制数),用十六进制数(或二进制数)表示输出。最多能把十六位二进制数(或四位十六进制数)用四位十六进制数(或十六位二进制数)表示输出;小于十六位(或四位)时按回车结束并输出3、十进制数和十六进制数之间的转换:

5、输入一个十进制数(或十六进制数),用十六进制数(或十进制数)表示输出。最大能把十进制数65535(或十六进制数FFFF)转换成十六进制数FFFF(或十进制数65535)表示输出;小于65535(或FFFF)时按回车结束并输出4.二进制数和十进制数之间的转换:输入一个十进制数(或二进制数),用二进制数(或十进制数表示输出)。最大能把十进制数65535(或十六位二进制数),用二进制数(或十进制输出)。当输入的数值小于65535(或16位二进制数时)按回车结束并输出。2.1 系统总体分析程序首先会显示主界面。然后根据用户的不同选择调用不同的模块,实现不同的功能。1.大小写字母转换功能,是通过调用子函

6、数input实现对字符串的输入,然后调用宏gaixie来实现对大小写的转换,其中宏是通过参数的传递来确定是小写转换成大写,还是大写转换成小写的。从而决定是对操作数进行加或减20H。2.数制之间的转换主要指通过六大模块来完成的。其中有三个模块是分别是二进制、十进制、十六进制的输入,并存储到BX中。类外三个模块分别是将BX中的数转换成二进制、十进制、十六进制的输出。这样做的好处是可以只写将程序尽可能的简化,将前三个模块与后三个模块进行组合就可以完成所需要的进制转换。2.2主模块框图及说明程序首先显示主界面,然后用户输入1-9选择不同的功能,则跳转到不同的模块,执行后在跳转到主模块,若是其他字符,则

7、显示出错信息,并返回主模块。如图2-1为主模块的逻辑图图2-1 主模块的逻辑图3 详细设计3.1 主模块及子模块说明 主模块:在屏幕上显示程序的主要功能并有用户选择,然后根据用户的选择调用相应的功能模块。HEXIBIN:输入一个十六进制数(不超过4位),并存放在BX中INBIN:输入二进制数(不超过16位),并存放在BX中 DECIBIN:输入一个十进制数(不超过65535),并存放在BX中BINIHEX:把BX中的数转换成十六进制并输出BINIDEC:用来把BX数转换到十进制并PRINT:用来把BX中的数转换成二进制并输出 INPUT:字符串的输入,并存储GAIXIE:把字符串转换成大写或小

8、写,然后输出CRLF:换行3.2 各模块详细设计3.2.1主模块主模块是通过9号功能调用,显示主界面。然后用1号功能调用输入用户的选择。然后分别跳转到相应的功能。CODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV DX,OFFSET BUF ;输出选择主界面 MOV AH,9 ;调用9号中断功能 INT 21H MOV AH,1 ;输入要选择的操作 INT 21H CMP AL,1 ;把AL中内容跟1比较 JZ BTOS ;相等则跳转到 CMP AL,2 JZ STOB1 CMP AL,3 JZ HTOB CMP

9、 AL,4 JZ BTOH CMP AL,5 JZ HTOD CMP AL,6 JZ DTOH CMP AL,7 JZ BTOD CMP AL,8 JZ DTOB CMP AL,9 JZ EXIT LEA DX,BUF3 ;把BUF3的首地址给DX MOV AH,9 INT 21H CALL CRLF ;调用子程序CALL JMP START ;返回,重新选择EXIT:MOV AH,4CH ;退出3.2.2 HEXIBIN首先将BX清零作为输入数的存储,DX清零记为输入数的位数控制输入循环。通过对每一个输入输出判断其为小写字母或大写字母或数字,减去不同的数值,得到其代表的数值大小。然后将BX中

10、的数值乘以16再与其相加存于BX中,同时DX加1,入DX不大于4,则进入下一轮跳转,否则就结束。HEXIBIN PROC NEAR MOV BX,0 ;把BX清零 MOV DX,0 ;作为输入四位的记数器INHEX:CMP DX,4 ;把DX跟4比较 JNB HEXEND ;大于则跳转,子程序结束 MOV AH,1 ;输入数据 INT 21H CMP AL,1BH ;遇到Esc则退出 JZ HEXEND SUB AL,30H ;判断是否数字或字母?否则跳出 JL HEXEND CMP AL,10 ;判断是否数字 JL ADD_TO ;是则存放BX中 SUB AL,7 ;把AL内容减7转为字母

11、CMP AL,10 ;判断是否小写字母(af) JL HEXEND CMP AL,16 JL ADD_TO ;小于则跳转 SUB AL,20H ;判断是否大写字母(AF) CMP AL,10 JL HEXEND CMP AL,16 JGE HEXENDADD_TO:MOV CL,4 ;作为循环条件 SHL BX,CL ;BX乘以16 MOV AH,0 ADD BX,AX ;两数相加 INC DX ;DX加1 JMP INHEXHEXEND:RETHEXIBIN ENDP3.2.3 INBIN程序同上一个模块基本相同。首先将BX清零作为输入数的存储,CX清零记为输入数的位数控制输入循环。通过对每

12、一个输入数字,减去30H,得到其代表的数值大小。然后将BX中的数值乘以2再与其相加存于BX中,同时CX加1,入CX不大于16,则进入下一轮跳转,否则就结束。INBIN PROC NEAR ;输入十六二进制数 MOV BX,0 MOV CX,0PUTIN:CMP CX,16 JNB EXIT6 MOV AH,1 INT 21H CMP AL,1BH JZ EXIT6 SUB AL,30H JL EXIT6 CMP AL,1 JG EXIT6 CBW INC CX XCHG AX,BX MOV DX,2 MUL DX XCHG AX,BX ADD BX,AX JMP PUTINEXIT6:RETI

13、NBIN ENDP3.2.4 DECIBIN程序同上一个模块基本相同。首先将BX清零作为输入数的存储,CX清零记为输入数的位数控制输入循环。通过对每一个输入数字,减去30H,得到其代表的数值大小。然后将BX中的数值乘以10再与其相加存于BX中,同时CX加1,入CX不大于5,则进入下一轮跳转,否则就结束。DECIBIN PROC NEAR MOV BX,0 MOV CX,0NEWCHAR:CMP CX,5 JNB EXIT4 MOV AH,1 INT 21H CMP AL,1BH JZ EXIT4 SUB AL,30H JL EXIT4 CMP AL,9 JG EXIT4 CBW INC CX

14、XCHG AX,BX MOV DX,10 MUL DX XCHG AX,BX ADD BX,AX JMP NEWCHAREXIT4:RETDECIBIN ENDP3,2,5 BINIHEX 将BX中的数转换成十六进制数输出就是每次取出四位算出其数值,然后转换成相应的ASCII码输出。BINIHEX PROC NEAR ;把数转换成十六进制输出 MOV CH,4ROTATE:MOV CL,4 ROL BX,CL ;把BX中高四位移到低四位,放到AL中 MOV AL,BL AND AL,0FH ADD AL,30H CMP AL,3AH ;判断是否为数字 JL PRINTIT ADD AL,7PR

15、INTIT:MOV DL,AL MOV AH,2 INT 21H DEC CH JNZ ROTATERETBINIHEX ENDP3.2.6 BINIDEC将BX中的数转换成十进制数输出,就是将BX中的数每次分别处以10000,1000,100,10,1将其所得到的商输出,而其余数存入BX中进入下一轮循环。这样输出就是要得到的十进制数。BINIDEC PROC NEAR MOV CX,10000 ;把10000给CX,作为万位的权 CALL DEC_DIV ;调用除权子程序 MOV CX,1000 CALL DEC_DIV MOV CX,100 CALL DEC_DIV MOV CX,10 C

16、ALL DEC_DIV MOV CX,1 CALL DEC_DIV RETBINIDEC ENDPDEC_DIV PROC NEAR ;除以各位十进制的权 MOV AX,BX ;把BX内容给AX MOV DX,0 ;DX清零 DIV CX MOV BX,DX MOV DL,AL ADD DL,30H ;转换为ASSII MOV AH,2 INT 21H RETDEC_DIV ENDP3.2.7 PRINT将BX中的数转换成二进制:因为BX中原本就是按照二进制存储的,所以只需每次左移,将所得到的数加30h得到其ASCII 码然后输出即可。PRINT PROC NEAR ;把BX中的十六进制数转换

17、成二进制 MOV CX,16D ;记数ROT: SHL BX,1D ;每移一位最高位变为CF JC SET ;CF为1则跳到SET,否则输出0 MOV DL,30H MOV AH,2 INT 21H DEC CX JNZ ROT RET3.2.8 INPUT输入字符串:通过10号功能调用,将所输入的字符串输入到缓冲区,缓冲区首=DS:DXINPUT PROC NEAR ;输入字符串 MOV DX,0 ;DX清零 MOV DX,OFFSET BUF1 MOV AH,10 INT 21H LEA DX,BF MOV AH,9 INT 21H LEA SI,BUF1+2 MOV BL,SI-1 ;把

18、输入的字符个数给BL MOV BH,0 ;BH清零 MOV BYTE PTR BX+SI+1,$ ;把$作为字符串结束字符 LEA DX,BUF1+2 MOV AH,9 INT 21H RET ;返回INPUT ENDP3.2.9 GAIXIE大小写字母的转换只是对其加上或者减去20H即可。P3、P4分别对应的是a、z或者A、Z,P6对应的是ADD或者SUB。GAIXIE MACRO P1,P2,P3,P4,P5,P6 ;来判定字母?P2: CMP BYTE PTR SI,P3 JB P5 ;小于跳转 CMP BYTE PTR SI,P4 JNB P5 CMP BYTE PTR SI,$ ;到

19、$则结束 JZ P6 P1 BYTE PTR SI,20HP5: INC SI LOOP P2P6: LEA DX,BUF8 MOV AH,9 INT 21H LEA DX,BUF1+2 ;输出改写后的字母 MOV AH,9 ;调用9号中断功能,输出字符串 INT 21H LEA DX,BF ;把BF首地址给CX MOV AH,9 ;调用9号中断功能 INT 21H JMP START ;返回 ENDM3.2.10 CRLF换行:无实际的意义,只是为了让界面更加美观。CRLF PROC NEAR LEA DX,BF MOV AH,9 INT 21H RETCRLF ENDP4程序调试4.1 运

20、行界面分析运行程序得如图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则退出,

21、选择其他输入,如输入q,如图4-10图4-10 错误输入4.2算法的分析代码转换器主要是由两部分组成:大小写字母转换和数制转换。大小写字母转换就是在其原来的ASCII码的基础上或加或减20H就可得到。数值转换是二进制、十进制、十六进制之间的转换。通过调用不同的函数避免了数值之间的转换。首先是三个输如模块,对于输入的字符如果是0-10之间的就减去30H,得到其代表的数的含义,A-F之间的就减去37H,a-f之间的就减去57H,得到其代表的数的含义,让后乘以权值相加存于BX即可。然后是三个输出模块,因为BX中存的本就是二进制数,所以直接移位输出就可得到二进制数。十六进制数是每四位二进制数转换成一位

22、十六进制数即可。十进制数相对复杂,将BX中的数转换成十进制数输出,就是将BX中的数每次分别处以10000,1000,100,10,1将其所得到的商输出,而其余数存入BX中进入下一轮循环。这样输出就是要得到的十进制数。4.3 调试过程及分析在进行调试的过程中遇到的问题层出不穷,但大多是因为一些粗心的错误。刚开始遇到最多的问题便是程序在编译时没有任何错误,链接的按钮仍然是灰色的不能够链接,茫然不知所措。上网查找资料却找不到任何相应的情况。于是就不用学校机房里的MASM,换了另外一款编译器(Masm for Windows 集成实验环境 2009.2),在进行编译时提示出错“Invalid char

23、acter in the file”,在错误信息表中查得是文中使用了无效字符,多数情况下是使用了中文的标点符号。根据这款编译器中代码颜色的不同很快就发现了是在写注释的时候“;”使用错误了。另外一个让我记忆犹新的问题是所有的子函数都是正确的,但是在将所有的模块进行组合时出了个错“relative jump out of range by 0001h bytes”,感觉很郁闷,在编译器给的信息表中也没有查到为什么。最后在网上查到答案即:8086中的条件跳转指令的跳转范围是-126129(相对于该指令的字节偏移量),不能超出这个范围。 原代码: CMP AL,2 JZ STOB更改为:CMP AL,

24、2 JZ STOB1 STOB1:JMP STOB如此就搞定了。当然还有一些平时不会注意到的问题,比如使用INT指令会改变AL的值,这些微不足道的地方却恰恰是最容易忽略的地方。5心得体会5.1 设计体会 经过近两个星期的工作,才把课程设计完成。经过这次课程设计,我加深了对汇编语言的理解,也对上课时所说的语法有了深刻的认识。 相对于以前学习的高级语言,对汇编语言的第一印象是很酷,因为它很抽象。怀着崇拜的心情学着汇编语言,虽然枯燥,但是每当完成一个很简单的程序就会感到非常的有成就感。 当我刚开始选择这个题目是因为课本上有一个相近的代码转换,所以感觉这个题目应该很好写。可是等到真正动手的时候就感到了

25、困难。首先是对字符串的输入输出的处理,解决不了就改成了字母大小写转换是每次只输入一个字母,然后根据其大小写转换,如大写就转换成小写,否则反之。然而在随后的进制转换中用遇到了同样的问题,发现这是一个不能不解决的问题,随后查阅了资料才解决。随后实在数值转换过程中对模块的设计上又出现了问题。最初的构想是设计六个模块分别对应相应的数值转换功能。可是在三个写好以后发现了下面要写的代码有很多重复的地方,于是就把这些重复的代码定义成了子函数来使用然后发现将程序按照输入、输出的不同来分模块,以BX作为连接,比原来的程序更为简洁,逻辑上也更加清楚,有种豁然开朗的感觉。在改进程序的过程中感到非常有成就感。 在编写

26、代码的过程中让我充分感受到了不同编程语言之间的差别。对与高级语言来说或许是很简单的一个程序或者只需要调用已有的函数库,可是对于汇编来说却要写上几十行甚至更多的代码。可是更加深刻的了解了寄存器、存储器之间的数据流向,因为每个考虑不周都会导致一大堆的错误出现,常常令人感到一种无力感,想要放弃。 当程序一步步接近完成,看着子函数一个个都运行成功,再组合到一起,那种喜悦是无与伦比,之前所受到的苦楚又是那么的微不足道。更怎强了我对汇编语言的兴趣。5.2 系统改进此程序的健壮性不够,在数值转换的过程中,当输入被换算的数值时,如果数值是正确的则能够正确的处理,当不正确的时候都输出的是0。数值转换的数值范围是0FFFFh,这是BX中存储的最大范围了,应该可以将其改进的更大一些。参考文献1李敬兆 .8086/8088和arm核汇编语言程序设计. 合肥:中国科技大学出版社 2沈美明,温冬婵编著.IBMPC汇编语言程序设计(第二版).北京:清华大学出版社出版3沈美明,温冬婵,张赤红 编著.IBMPC 汇编语言程序设计实验教程. 北京:清华大学出版社出版

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1