汇编代码转换程序.docx
微机原理与课程设计课程设计班级:姓名:学号:2课程设计题目:代码转换程序设计课程名称:微机原理与接口技术2015年6月概述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,便选择了退出。通过判断标识符,程序跳转到标识符所在的位置,实现退出。四、程序流程图开始附图:F:MASM>ny2代弱转换系统换换换换换W8R*T*Z11 AlK母数数写品进进÷K六二十同向十向Sl-母r进写手六六 -小一一十十作现现现现现出实实实 编号图1:编译显示的主菜单v图2:各个子功能显示中的编号:b伤字母:b中的编号:C制位数:5b对应的请输入二进制数:? 11 d - 0 e - q :数10:数18:数号制:号制:号制编进数编进数编进的六制的六制的六f进&+进中十<÷二*十单的菜一的菜一的菜后入入后入入后入 swn五、程序源代码inc1udeio32.inc.datam1byte'代码转换系统,13,10,0;菜单mo1,_,1Q1.A主1幺BI11Zbyte,1J,1U,UvyjSJJm3byte'编号操作',13,10,0mabyte'a实现大写字母向小写字母的转换',13,10,0mbbyte'b实现小写字母向大写字母的转换',13,10,0mebyte'C实现二进制向十六进制数的转换',13,10,0mdbyte'd实现十六进制向二进制数的转换',13,10,0mebyte'e实现十六进制向十进制数的转换',13,10,0mqbyte'q退出',13,10,0m.errbyte输入错误,请重新输入',13,10,0m_meaubyte'请输入菜单中的编号:',0minputsbyte'请输入一个小写字母:',0minput1byte'请输入一个大写字母:,0m_output1byte'对应的小写字母:',0moutputsbyte'对应的大写字母:,0minput1byte'请输入二进制位数:',0m_input11byte'请输入二进制数:,0m_output1byte'转换后的十六进制数:',0m_output2byte'转换后的二进制数:,0m_input3byte'请输入一个十六进制数:',0m_output3byte'转换后的十进制数:,0arraybyte8dup(0)sumdword?Ienbyte?mbyte?array1byte100dup(0)array2byte100dup(0)ndword?;用字符串数组保存十六进制数;十进制数变量;字符串数组的长度;定义一个数组用来保存初始二进制数;用来保存转换后的十六进制数kdword?start:jdword?.code;显示菜单中的内容moveax,offsetm1ca11dispmsgmoveax,offsetm2ca11dispmsgmoveax,offsetm3ca11dispmsgmoveax,offsetmaca11dispmsgmoveax,offsetmbca11dispmsgmoveax,offsetmeca11dispmsgmoveax,offsetmdca11dispmsgmoveax,offsetmeca11dispmsgjzbcmpa1,c,moveax,offsetmqca11dispmsgmoveax,offsetIinmeauca11dispmsg;提示输入相应的菜单编号ca11readc;输入对应的编号ca11dispcr1f;换行cmpa1,a,;判断输入jza;若输入'a',则跳转到标识符匕cmpa1,b,meau:;若输入'b',则跳转到标识符'b'jzCC;若输入'c',则跳转到标识符'cc'cmpa1,d'jze;若输入'd',则跳转到标识符'e'cmpa1,e,jze;若输入'e"则跳转到标识符cmpa1,q,jzq;若输入'q',则跳转到标识符'q'moveax,offsetm_errca11dispmsg;输入错误,提示错误的信息jmpmeau;大写字母向小写字母的转换moveax,offsetm_errca11dispmsgmoveax,offsetm_input1ca11dispmsg;提示输入一个大写的字母ca11readc;获得字母movb1,a1;将输入的内容存储到b】中ca11dispcr1f;换行cmpa1,A,;判断输入的字母是否合法jbreturna;如果比'A'小,则跳转到returna标识符cmpa1,Z'jareturna;如果比'Z,大,则跳转到returna标识符ca11dispc;显示字母moveax,offsetmoutput1ca11dispmsg;输入正确,则提示输出相应的小写字母addb1,20h;实现大写向小写的转换mova1,b1ca11dispc;显示转换后的字母ca11dispcr1f;换行jmpmeau;小写字母向大写字母的转换1:moveax,offsetm_errca11dispmsgmoveax,offsetm_inputsca11dispmsg;提示输入一个小写字母ca11readc;获得字母movb1,a1;将输入的内容存储到b1中ca11dispcr1fcmpa1,a'判断输入合法性jbreturnb;如果比a'小,则跳转到returnb标识符cmpa1,z'jareturnb;如果比'z'大,则跳转到returnb标识符ca11dispc;显示字母moveax,offsetmoutputsca11dispmsg;提示输出相应的大写字母subb1,20h;实现小写到大写字母的转换mova1,b1ca11dispc;将转换的字母输出ca11dispcr1f;换行jmpmeau;二进制向十六进制转换moveax,offsetm_input1ca11dispmsgca11readuid;输入二进制数的位数movj,eax;保存二进制位数moveax,offsetHiJnput11;提示输入二进制数ca11dispmsgca11dispcr1fCmovecx,0;清零,计数器C1.ca11readuidmovarray1ecx,a1;一位一位的输入incecxcmpecx,jjbc1;低于位数,继续输入movecx,jdececxmoveax,1xorebx,ebx;记录移动的位数xore