湖南农业大学课程设计报告学院:信息科学技术学院班级:姓名:学号:课程设计题目:代码转换程序设计课程名称:汇编语言与微机原理指导老师:评阅成绩:评阅意见:成绩评定教师签名:日期:年月日目录概述…………………………………………………………1一设计题目………………………………………………1二设计内容与要求………………………………………1三设计思想…………………………………………………1四程序流程图……………………………………………3五程序源代码……………………………………………5六设计过程中遇到的问题及解决方法……………………14七设计心得…………………………………………………15代码转换程序设计概述:代码转换程序主要是实现字母间的转换和数值之间的转换。其中字母转换是大小写字母之间的互换,二进制转换则是二进制,十进制,十六进制之间的转换。程序设计成一个代码转换系统,给出一个可供选择的菜单,根据界面的信息选择不同的子功能。通过做这个程序,加强汇编语言编程的能力,更好的了解其基本原理,基本的思想,基本的方法以及相关的注意事项。一、设计题目代码转换程序设计二、设计内容与要求完成一个字母或数制之间的转化程序,主程序分别具有5种可选择的子功能,按相应的字符可分别进入相应的子功能并在屏幕上显示结果,按“q”键退出。5种可选择的子功能分别为:1)实现小写字母向大写字母的转换2)实现大写字母向小写字母的转换3)实现二进制数向十六进制数的转换4)实现十六进制数向二进制数的转换5)实现十六进制数向十进制数的转换三、设计思想运行程序,首先会显示主界面,用户可依据提示选择不同的编号,实现不同的子功能。1、大写字母向小写字母的转换。当用户选择编号a,便选中了这一个子功能。通过判断标识符,程序跳转到标识符所在的位置。根据提示输入一个大写字母,会有一个判断输入是否合法的过程,若输入的是非大写字母,则会提示输入错误,请重新输入,直到输入正确为止。通过改变assic码值,实现大写字母向小写字母的转换。显示转换后的字母,然后跳转到主菜单。2、小写字母向大写字母的转换。当用户选择编号b,便选择了这一个子功能。通过判断标识符,程序跳转到标识符所在的位置。根据提示输入一个小写字母,接下来判断其合法性,若输入的字母是非小写字母,则会提示输入错误,请重新输入,直到输入正确为止。通过改变assic码值,实现小写字母向大写字母的转换。显示转换后的字母后,跳转到主菜单。3、二进制向十六进制的转换。当用户选择编号c,便选择了这一个子功能。通过判断标识符,程序跳转到标识符所在的位置。根据提示首先输入一个数字表示二进制的位数,在程序中有变量记录二进制的位数。再根据提示输入一个二进制数。其转换的主要思想是二进制数的每四位代表十六进制的,通过移位来逐一将四个二进制位数的和转换成十六进制数保存在一个寄存器中,然后再继续按照每四位一求和的方法保存十六进制数的每一位,直到二进制数的所有位计算完毕,当对四位二进制数相加完毕后,将保存和的寄存器清零,采用相对寻址改变十六进制数每一位存放的位置。其中还会对十六进制每一位上的数字进行判断,若是大于9,则转换成相应的字母,最后采用相对寻址的方式将十六进制的每一位依次输出。显示完毕后,跳转到主菜单。4、十六进制向二进制的转换。当用户选择编号d,便选择了这一个子功能。通过判断标识符,程序跳转到标识符所在的位置。根据提示输入一个十六进制数,此时会进行判断,判断输入的字符串是否符合十六进制数的要求,若是输入错误,则提示输入错误,重新输入,直到输入正确为止。其转换的主要思想是通过转换成十进制,然后将十进制数转换成二进制,在十六进制转换成十进制中,按权值展开再相加的思想,在十进制转换成二进制的中,主要是采用连除的方法,将每一次的余数保存在堆栈中,直到商为零。最后出栈,根据栈的先进后出的原则,出栈的顺序就是转换后的二进制数的顺序。将转换后的二进制数输出后,跳转到主菜单。5、十六进制向十进制的转换。当用户选择编号e,便选择了这一个子功能。通过判断标识符,程序跳转到标识符所在的位置。根据提示输入一个十六进制数,此时会进行判断,若是输入字符串不符合十六进制数的要求,则提示输入错误,重新输入,直到输入正确为止。十六进制数转换成十进制的主要思想是,按权值展开再相加。首先是将输入的字符转换成相应的数字,通过设置相应的变量,在最低位上的权值是1,然后依次是16,256……依次进行累乘,直到十六进制数位数全部循环完毕,将每一位所得的数保存在寄存器中,每进行一次就实现一次求和运算。最后将转换成的十进制数输出,跳转到主菜单。6、退出。当用户选择编号q,便选择了退出。通过判断标识符,程序跳转到标识符所在的位置,实现退出。四、程序流程图其他abcdeqNNNNYYYYde开始主菜单,用户选择子功能输入有误,重新输入输入大写字母判断输入是否合法输入错误转换输出输入小字母写判断输入是否合法输入错误转换输出输入二进制数判断输入是否合法输入错误输出输入十六进制数判断输入是否合法输入错误转换转换十进制判断子功能输出转换二进制数输出退出结束附图:图1:编译显示的主菜单图2:各个子功能显示五、程序源代码includeio32.inc.datam1byte'代码转换系统',13,10,0;菜单m2byte'----------------------------------------------',13,10,0;分割线m3byte'编号操作',13,10,0mabyte'a实现大写字母向小写字母的转换',13,10,0mbbyte'b实现小写字母向大写字母的转换',13,10,0mcbyte'c实现二进制向十六进制数的转换',13,10,0mdbyte'd实现十六进制向二进制数的转换',13,10,0mebyte'e实现十六进制向十进制数的转换',13,10,0mqbyte'q退出',13,10,0m_errbyte'输入错误,请重新输入',13,10,0m_meaubyte'请输入菜单中的编号:',0m_inputsbyte'请输入一个小写字母:',0m_inputlbyte'请输入一个大写字母:',0m_outputlbyte'对应的小写字母:',0m_outputsbyte'对应的大写字母:',0m_input1byte'请输入二进制位数:',0m_input11byte'请输入二进制数:',0m_output1byte'转换后的十六进制数:',0m_output2byte'转换后的二进制数:',0m_input3byte'请输入一个十六进制数:',0m_output3byte'转换后的十进制数:',0arraybyte8dup(0);用字符串数组保存十六进制数sumdword?;十进制数变量lenbyte?;字符串数组的长度mbyte?array1byte100dup(0);定义一个数组用来保存初始二进制数array2byte100dup(0);用来保存转换后的十六进制数ndword?kdword?jdword?.codestart:moveax,offsetm1;显示菜单中的内容calldispmsgmoveax,offsetm2calldispmsgmoveax,offsetm3calldispmsgmoveax,offsetmacalldispmsgmoveax,offsetmbcalldispmsgmoveax,offsetmccalldispmsgmoveax,offsetmdcalldispmsgmoveax,offsetmecalldispmsgmoveax,offsetmqcalldispmsgmeau:moveax,offsetm_meaucalldispmsg;提示输入相应的菜单编号callreadc;输入对应的编号calldispcrlf;换行cmpal,'a';判断输入jza;若输入‘a’,则跳转到标识符‘a’cmpal,'b'jzb;若输入‘b’,则跳转到标识符‘b’cmpal,'c'jzcc;若输入‘c’,则跳转到标识符‘cc’cmpal,'d'jze;若输入‘d’,则跳转到标识符‘e’cmpal,'e'jze;若输入‘e’,则跳转到标识符‘e’cmpal,'q'jzq;若输入‘q’,则跳转到标识符‘q’moveax,offsetm_errcalldispmsg;输入错误,提示错误的信息jmpmeau;大写字母向小写字母的转换returna:moveax,offsetm_errcalldispmsga:moveax,offsetm_inputlcalldispmsg;提示输入一个大写的字母callreadc;获得字母movbl,al;将输入的内容存储到bl中calldispcrlf;换行cmpal,'A';判断输入的字母是否合法jbreturna;如果比'A'小,则跳转到returna标识符cmpal,'Z'jareturna;如果比'Z'大,则跳转到returna标识符calldispc;显示字母moveax,offsetm_outputlcalldispmsg;输入正确,则提示输出相应的小写字母addbl,20h;实现大写向小写的转换moval,blcalldispc;显示转换后的字母calldispcrlf;换行jmpmeau;小写字母向大写字母的转换returnb:moveax,offsetm_errcalldispmsgb:moveax,offsetm_inputscalldispmsg;提示输入一个小写字母callreadc;获得字母movbl,al;将输入的内容存储到bl中calldispcrlfcmpal,'a';判断输入合法性jbreturnb;如果比‘a’小,则跳转到returnb标识符cmpal,'z'jareturnb;如果比‘z’大,则跳转到returnb标识符calldispc;显示字母moveax,offsetm_outputscalldispmsg;提示输出相应的大写字母subbl,20h;实现小写到大写字母的转换moval,blcalldispc;将转换的字母输出calldispcrlf;换行jmpmeau;二进制向十六进制转换cc:moveax,offsetm_input1calldispmsgcallreaduid;输入二进制数的位数movj,eax;保存二进制位数moveax,offsetm_input11;提示输入二进制数calldispmsgcalldispcrlfmovecx,0;清零,计数器c1:callreaduidmovarray1[ecx],al;一位一位的输入incecxcmpecx,jjbc1;低于位数,继续输入movecx,jdececxmoveax,1xorebx,ebx;记录移动的位数xoredx,edx;表示四个二进制位的和xoresi,esi;保存十六进制当前的位置c2:movn,0;n作为二进制位数是否已达4位的一个标志movk,0;k作为数值是否已经结束的一个标志cmparray1[ecx],1jnzc11;判断二进制数的某一位是否为1moveax,1cmpebx,1jnzc3;判断数据所在的位数,不相等,转向c3shleax,1;逻辑左移jmpc5c3:cmpebx,2jnzc4;根据比较来确定移动的位数shleax,2;逻辑左移jmpc5c4:cmpebx,3jnzc5;根据比较来判断移动的位数shleax,3;逻辑左移c5:addedx,eax;保存和c11:cmpebx,3;判断二进制数是否已经有四位jnzc12movn,1c12:cmpecx,0;判断数值是否已经全部计算完毕jnzc13movk,1c13:movedi,noredi,k;保存n或者k的值cmpedi,1jnzc16cmpedx,9jnac14subedx,10;edx大于9addedx,'A';转换成相应的字母movarray2[esi],dl;将十六进制数保存至数组jmpc15c14:addedx,'0'm