您好,欢迎访问三七文档
代码转换1.基本功能描述这是一个基于计算机和汇编环境的程序,它能够实现基本的大小写字母之间的转换,二进制数和十六进制之间的相互转换以及十六进制数向十进制数的转换。而且该程序界面友好,能够通过键盘输入选择相应的转换,结果也能够比较直观的显示在我们眼前,具有一定的人机交互性。2.设计思路2.1思路一采用顺序结构程序,所有的操作都集中在一个程序中。首先,利用DOS系统功能调用其09H号功能号,显示提示语句提示用户选择输入字符的类型:“Pleasechoosethetypeofthecharactertoinput:1.Hexadecimal2.Binary3.Letter”。用户通过选择语句选择相应的输入字符类型。选择语句:MOVAH,01HINT21HCMPAL,31HJZLP1CMPAL,32HJZLP2CMPAL,33HJZLP3LP1,LP2,LP3分别为十六进制、二进制、字母的转换程序段。当从键盘输入‘1’时,选择十六进制,并跳转到其程序段,再采用相同的选择方式选择它要转换的类型:1.二进制2.十进制,再次跳转到相应的程序,完成转换操作。同理,当输入‘2’、‘3’时,分别完成二转十六和大小写之间的转换。当输入其他的字符时,会报错并提示重新选择。当转换操作完成以后,程序会自动跳转到结束语句,结束程序。结束语句:MOVAH,4CHINT21H程序流程图如下:开始N10YY显示结果从最后一位取数,每四位求和输入一串二进制数减20H加20H显示小写大写判断输入字母字母二进制除1,显示个位除10,显示十位除100,显示百位除1000,显示千位除10000,显示万位求和判断是否为十六进制数显示’1’显示’0’判断是否为十六进制数选择转换类型十六进制还循环吗?带CF循环左移CF=?将ASC码转换输入十六进制数二进制将ASC码转换输入十六进制数十进制选择输入类型提示语句2.2思路二将转换操作都写成一个个模块,整个程序由若干个模块组成,其中有一个主模块,可以调用模块。模块二进行大小写字母的互相转换,主要利用小写字母的ASC码比大写字母大20H;模块三实现二进制数向十六进制数的转换,可以利用移位指令来实现;模块四实现十六进制数向二进制数的转换,也可采用移位指令实现;模块五实现十六进制数向十进制数的转换,首先将十六进制数转换成二进制,然后再实现二进制向十进制数的转换。程序的流程图和思路一大致相同。2.3实现方案比较思路一和思路二可以知道,思路一程序比较冗长,当时操作起来比较简单。思路二将不同的操作转换写成不同的模块,各模块分开,但是又可以通过主程序调用它们,思路比较清晰,比较直观,但是运行的时候比较麻烦,而且模块的方法平时运用也比较少,因此,本次采用思路一作为实现方案。3.软件设计3.1程序的初始化在数据段在定义程序中一些必要的提示语句,以及一些转换程序中应用到的数据。具体语句如下:DATASSEGMENTSTRING1DB0AH,0DH,'Pleasechoosethetypeofcharactortoinput:','$'STRING2DB0AH,0DH,'1.Hexadecimal2.Binarynumber3.Letter','$'STRING3DB0AH,0DH,'Pleasechoosethetypetochange:1.Binary2.Decimal','$'STRING4DB0AH,0DH,'Pleaseinputaleter:','$'STRING5DB0AH,0DH,'Pleaseinputabinarynumber:','$'STRING6DB0AH,0DH,'Pleaseinputahexadecimal:','$'STRING7DB0AH,0DH,'Pleasechangeitintoalowercase:','$'STRING8DB0AH,0DH,'Pleasechangeitintoacapitalleter:','$'STRING9DB0AH,0DH,'Pleasechangeitintoahexadecimal:','$'STRING10DB0AH,0DH,'Pleasechangeitintoabinarynumber:','$'STRING11DB0AH,0DH,'Pleasechangeitintodecimalnumber:','$'STRING12DB0AH,0DH,'Inputerror,pleaseinputagain!','$'STRING13DB0AH,0DH,'Wrongchance,pleasechooseagain!','$'STRING14DB0AH,0DH,'#####Theprogramisusedtochangethetypeofthedata!#####','$'DATA1DB10HDUP(?)COUNTDB0FLAGDB0DATASENDS3.2大小写字母之间的转换在前面已经说到,小写字母的ASC码比大写字母的ASC码大20H,因此,大写转小写就是将大写字母的ASC码加20H,反之,将小写字母的ASC码减20H。大写转小写:MOVAH,01H小写转大写:MOVAH,01HINT21HINT21HMOVBL,ALMOVBL,ALADDBL,20HSUBBL,20HMOVDL,BLMOVDL,BLMOVAH,02HMOVAH,02HINT21HINT21H3.3二进制转十六进制在数据段中定义一个长为16字节的空间用于存储输入的二进制数,每一位二进制数占一个字节,在输入二进制的时候,用一个指针DI指向定义的段DATA1,每输入一位二进制数,DI就加一。当输入结束时,DI指向存储二进制最低位的位置。再用另外一个指针SI指向段DATA1。在取数时,将所取的数减30H,将它由ASC码变成真正的二进制。首先二进制数最后一位取数,如果该数是1,就将DL加1。DI减1,指向倒数第二位,如果倒数第二位是1,将DL加2。DI减1,再取倒数第三位,如果取得的数是1,DL就加4。DI减1,取倒数第四位,如果取得1,DL就加8。这样就将二进制的第四位求和,DL再加30H,与39H比较,如果小于39H,就将DL入栈。如果大于39H,再将DL加07H,然后将其入栈。就这样向前取数,每四位像前面一样求和、入栈。每次取数后,DI减1,比较SI和DI,如果两者相等,表示数已取完,直接进入入栈操作。就这样每四位求和、转换、入栈,就将每四位作为一体转换为一位十六进制数。由于低位先入栈,所以每出栈一位并显示,最后得到的十六进制也是从高到低的。3.4十六进制转换为二进制首先输入一位十六进制数,将它由ASC码形式转换为二进制形式,采用移位指令将其左移四位,再与另个输入的十六进制数的二进制形式相与得到一个八位二进制数,将它赋给BH,然后再输入两位十六进制数,采取前面的操作得到另一个八位二进制数,将它赋给BL,这样就得到一个16位二进制数。将BX带CF位循环左移,如果CF=1,则显示字符‘1’,如果CF=0,则显示字符‘0’。当循环结束时,就将十六进制数转换为二进制数显示出来。ASC码转换为二进制的程序如下:MOVAH,01HINT21HCMPAL,3AHJBLPSUBAL,07HLP:SUBAL,30HMOVDL,ALMOVAH,02HINT21H3.5十六进制转换为十进制(1)输入一位十六进制数,将它由ASC码转换为二进制,将它赋给BX。(2)再输入第二位十六进制数,转换为二进制后,将它赋给AX,BX向左移四位,执行语句“ADDBX,AX”。(3)依次输入第三位十六进制数,转为二进制后将它赋给AX,重复第二步后面的操作。(4)最后输入第四位十六进制数,重复第二步操作,最后得到的是这个四位十六进制数的求和。(5)利用这个和除10000得到十进制数的万位,并显示万位。余数在除以1000,得到千位并显示。余数在除100,得到并显示百位。余数除10,得到并显示十位。最后的余数就是个位,显示个位。这样一个四位十六进制数就转换为十进制数。显示和除法程序如下:MOVCX,10000CALLBX_DIVMOVCX,1000CALLBX_DIVMOVCX,100CALLBX_DIVMOVCX,10CALLBX_DIVMOVCX,1CALLBX_DIVBX_DIVPROCNEARMOVAX,BXMOVDX,0DIVCXMOVBX,DXMOVDL,ALADDDL,30HMOVAH,02HINT21HRETBX_DIVENDP4.结论与心得5.参考文献[1]余春暄,等.80x86/Pentium微机原理及接口技术.北京:机械工业出版社,2008.9[2]杨素行,等.微型计算机系统原理及应用[M].北京:清华大学出版社,20036.思考题1.如果采用模块化编程的方式,在使用汇编器的时候与其他程序的汇编有什么不同?答:采用模块化编程方式,需要对每个模块独立进行汇编和编译,各模块间的符号允许相互引用,最后将模块连接成一个完整的可执行程序。而其他程序只需要汇编和编译一次就可以形成可执行程序。但是采用模块,每个模块任务明确,易于编写,易于检错。2.改进程序,增加二、十进制之间的相互转换。答:要增加二、十进制转换,就需要在程序开始选择输入字符类型中增加十进制这个选择,当选择十进制时就跳转十进制到二进制的转换操作。当选择输入二进制时,需要在二进制转换程序中增加一个选择程序,选择到底转换为十六进制还是十进制。当选择转换为十进制时就跳到转成十进制的程序。附录1.调试报告在调试的过程中,程序不能实现相应的功能,不能显示正确的转换,有时候会出现乱码,在检查后发现是程序的跳转出现了错误。在进行二进制转十六进制的操作时,第一次运行程序时是正确的,第二次再选择二转十六的操作时,转换不能正确进行。在调试后发现,在进行二进制转十六进制操作时,在数据段中定义了两个转换中要用到的数COUNT和FLAG,转换之前这两数都定义成0,转换完成后都发生改变,所以第二次二进制转十六进制会出现错误。要运行正确,必须在每次进行完二进制转十六进制后将COUNT和FLAG重新赋成0即可。2.测试结果十六进制数的转换:图2二进制转十六进制:图3大小写字母之间的转换:图43.关键代码DATASSEGMENTSTRING1DB0AH,0DH,'Pleasechoosethetypeofcharactortoinput:','$'STRING2DB0AH,0DH,'1.Hexadecimal2.Binarynumber3.Letter','$'STRING3DB0AH,0DH,'Pleasechoosethetypetochange:1.Binary2.Decimal','$'STRING4DB0AH,0DH,'Pleaseinputaleter:','$'STRING5DB0AH,0DH,'Pleaseinputabinarynumber:','$'STRING6DB0AH,0DH,'Pleaseinputahexadecimal:','$'STRING7DB0AH,0DH,'Pleasechangeitintoalowercase:','$'STRING8DB0AH,0DH,'Pleasechangeitintoacapitalleter:','$'STRING9DB0AH,0DH,'Pleasechangeitintoahexadecimal:','$'STRING10DB0AH,0DH,'Pleasechangeitintoabinarynumber:','$'STRING11DB0AH,0DH,'Pleasechangeitintodecimalnumber:','$'STRING12DB0AH,0DH,'Inputerror,pleaseinputagain!','$'STRING13DB0AH,0DH,'Wrongchance,pleasechooseagain!','$'STRING14DB0AH,0DH,'#####Theprogramisusedtochangethet
本文标题:代码转换
链接地址:https://www.777doc.com/doc-3361949 .html