数之间相互转化汇编实验报告.doc_第1页
数之间相互转化汇编实验报告.doc_第2页
数之间相互转化汇编实验报告.doc_第3页
数之间相互转化汇编实验报告.doc_第4页
数之间相互转化汇编实验报告.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数之间相互转化一、程序设计要求1 转化内容选择下列一项:二进制数十六进制数显示,二进制数十进制数显示,十进制数二进制数显示,十进制数十六进制数显示,十六进制数二进制数显示。2 给出适当的文字提示3 程序要求保护措施,对于非法键入不受理,但回显,显示错误信息。4 具体显示格式,例如:0111100010011010=789AH二、程序设计思路程序实现功能:1. 提示用户输入小于10000的十进制数;2. 判断输入是否合法,在输入非法时给出错误信息;3. 将用户输入小于10000的十进制数其以十六进制形式输出。主程序设计思路:第一步:调用INT21的0A号功能等待用户键入一串字符串,要求用户输入小于10000的十进制数即输入字符个数不能超过4,并将输入字符串送入数据缓冲区;第二步:判断输入的字符串长度是否超过4,若超过则输出错误信息,返回DOS;若没有超过继续;第三步:将用户输入的十进制数转化成二进制数保存;第四步:将二进制数转化为十六进制数保存;第五步:输出十六进制数;输入十进制数转化成二进制数的设计思路:第一步:判断输入的字符串是否为十进制数,若字符串中有不是数字的立即退出;第二步:将输入的字符串中的各字符转化成数字,由此得到十进制数各位上的数;第三步:通过求得该十进制数,存在于计算机中即为二进制数。二进制数转化成十六进制数的设计思路:第一步:定义一个4个字节的单元用来存放十六进制形式;第二步:将二进制数存入DX寄存器中,将EDX寄存器中的数左移十六位,将十六位二进制数全部置于EDX的高十六位;第三步:将置于EDX高十六位的数从高位开始,每次取出四位数,并将其转化成字符存于存储单元,直至十六位数全部转化完。其中,每次取四位数是通过循环左移四位数到DL的低四位实现的。三、程序设计流程图四、源程序;-;程序功能:将用户输入小于10000的十进制数其以十六进制形式输出;-.486DATASEGMENT USE16 ;数据段MESG1 DB Please enter a decimal number less than 10000!,0DH,0AH,$MESG2 DB 0DH,0AH,Error! Your input is larger than 10000!,0DH,0AH,$MESG3 DB 0DH,0AH,Error! Your input is not a number!,0DH,0AH,$BUF1 DB 6 DB ? DB 6 DUP(?)BUF2 DB =,4 DUP(?),H $COUNT DB 4DATAENDS;-CODESEGMENTUSE16 ;代码段ASSUME CS:CODE,DS:DATABEG: ;数据段初始化 MOV AX,DATAMOV DS,AXMOV AH,9 ;显示操作提示MOV DX,OFFSET MESG1INT 21H ;等待键入一个不超过4位的十进制数MOV AH,0AHMOV DX,OFFSET BUF1INT 21HMOV AH,3 ;读取光标当前的位置MOV BH,0INT 10HMOV CL,BUF1+1 ;实际键入字符个数-CXMOV CH,0 ;将光标预置到用户输入的字符后MOV AH,2ADD DL,CLINT 10H;判断输入的字符是否超过4个 CMP CX,5 JNC ERROR1CALL S_N2ASC ;调用 S_N2ASC;将输入的十进制数转换成二进制数CALL N2_16ASC ;调用 N2_16ASC;将二进制数转换成十六进制数MOV AH,9 ;输出BUF2的内容MOV DX,OFFSET BUF2INT 21HJMP EXITERROR1: ;显示错误信息 MOV AH,9MOV DX,OFFSET MESG2INT 21HEXIT:MOV AH,4CHINT 21H;-;子程序功能:实现 AX*10+BX-AX;-MUL10PROCMOV DX,10MUL DXADD AX,BXRETMUL10ENDP;-;子程序功能:将输入的十进制数的字符串转换成二进制数;-S_N2ASCPROCMOV SI,OFFSET BUF1+2MOV AX,0 ;AX清零AGIN: MOV BL,SICMP BL,3AH ;判断输入的字符是否是09,若不是转JNC ERROR2CMP BL,30H JC ERROR2SUB BL,30H ;字符转成ACSII码MOV BH,0CALL MUL10 ;完成AX*10+BX-AXINC SILOOP AGINJMP WELL ;成功转换转WELLERROR2:MOV AH,9 ;显示错误信息并返回DOSMOV DX,OFFSET MESG3INT 21HMOV AH,4CHINT 21HWELL: RETS_N2ASCENDP;-;子程序功能:将DX中的二进制数转十六进制ACSII码;-N2_16ASCPROCMOV DX,AXSAL EDX,16 ;左移16位,为实现从高位取4位数准备MOV SI,OFFSET BUF2+1 ;MESG2+6的地址-SIMOV COUNT,4 ;计数LAST:ROL EDX,4 ;循环左移4位AND DL,0FH ;将DL的高4为清零;保证DL中只存在4位二进制数CMP DL,10 ;将4位的十六进制数转化成ACSII码JC NEXTADD DL,7NEXT:ADD DL,30HMOV SI,DL ;将得到的ACSII-SIINC SIDEC COUNT ;计数JNZ LASTRETN2_16ASC ENDP;-CODEENDSEND BEG五、测试用例及结果分析1. 运行程序,输入12345时,在屏幕上显示错误信息,如下:结果分析:输入的数超过了10000,故显示以上信息。2. 运行程序,输入12e4时,在屏幕上显示错误信息,如下:结果分析:输入的不是一个十进制数,故显示如下信息。3. 运行程序,输入1234,输出其十六进制形式如下:结果分析:输入的是小于10000的十进制数,故输出1234的正确形式。六、实验总结所遇问题及解决方法:问 题1:用户在键入十进制数时在屏幕上有回显,待程序运行结束在屏幕上显示十六进制形式时用户键入的十进制数不显示在屏幕上。原 因: 用INT21的0AH号功能等待用户键入字符串时,当用户按下回车输入完毕后,光标返回到当前行始格,在显示十六进制形式时没有移动光标位置,所以将用户输入的十进制数覆盖。解决方法: 调用INT21的0AH功能后,用INT10的3号功能得到当前光标的行值,将光标的列值改到输入的字符串后,用INT10的2号功能预置光标到用户输入的十进制数后,等待输出十六进制形式。问 题2:在子程序S_N2AS

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论