当前位置:文档之家› 二进制转换成BCD码 实验报告

二进制转换成BCD码 实验报告

一、实验目的(1)进一步熟练掌握8086汇编语言编译调试工具和环境的操作;(2)掌握完整8086汇编的程序设计编写方法;(3)掌握简单的数值码制转换方法;(4)掌握键盘输出的DOS功能调用方法。

二、实验要求:将AX中的一个二进制数(对应的十进制数范围是0-65535),转换成压缩性BCD码表示的十进制,并从屏幕输出转换结果。

要求用减法实现,并比较与除法方法进行运行速度比较。

三、实验及报告要求:3.1、简要说明算法,并画出正确的程序流程图;3.2、给出完整正确的源程序代码,要求给每一句伪指令或指令加上注释;3.3、分别在DOS和Windows下编译、连接源程序生成可执行文件并调试,比较两个环境下生成的机器码的长度、寄存器内容、计算结果的异同。

3.4、如何观察转换过程中标志寄存器中各标志位的结果?如何观察转换结果的变化?试改变被转换数值,对结果与编制为的变化加以说明和解释。

3.5、写出完整的实验报告,特别是“实验结果”与“实验总结体会”部分,是评分的主要依据。

3.6、实验总结中要求结合实验中的经验、教训或体会对汇编语言格式、调试方法和微机原理学习方法作出总结。

四、程序流程图减法。

即五位数先循环减10000,直到不够减了,做减法的次数就是万分位的结果;将不够减之前一次的余数恢复,再循环减去1000,直到不够减了,做减法的次数就是千分位的结果;以此类推,最后恢复的正余数就是个位的结果.除法。

即五位数先除以10000,得到的商存放万位数的变量上;再将余数除以1000,得到的商存放千位数的变量上;之后将余数除以100,得到的商存放百分位的变量上;以此类推,最后的余数存放在个位的变量上。

A 、减法结束 将余数保存到个位数 恢复正余数 恢复余数计数器清零 Y 将数减去100 计数值加1 将计数器的值保存到百分位 够减否 N 输入二进制数 Y将数减去10000计数值加1 将计数器的值保存到万分位恢复余数 够减否 计数器清零零 N计数器清零 Y 将数减去1000 计数值加1 将计数器的值保存到千分位 恢复余数够减否 计数器清零 N Y 将数减去10 计数值加1 将计数器的值保存到十分位 够减否 NB、除法五、源程序代码A、减法源程序DATA SEGMENT ; 数据段RESULT_1 DB 0RESULT_2 DB 0RESULT_3 DB 0RESULT_4 DB 0RESULT_5 DB 0DATA ENDSSTACK SEGMENT STACK ; 堆栈段STA DB 64 DUP(0);开辟100单元作为堆栈空间STACK_TOP DB 0STACK ENDSCODE SEGMENT ; 代码段ASSUME CS:CODE , DS:DATA , ES:DATA , SS:STACK START:MOV AX, DATAMOV DS, AX ; 设置数据段MOV AX, STACKMOV SS, AX ; 设置堆栈段LEA SP, STACK_TOP ; 设置栈顶指针MOV AX,25468MOV CL, 0; 计数器清零NEXT1: SUB AX, 10000; 减10000JC OVER1; 有借位说明不够减INC CL ; 否则够减,计数器加1JMP NEXT1; 无条件跳转OVER1: ADD AX,10000; 最后恢复不够减时AL的余数MOV BX,AXMOV RESULT_1,CLADD CL,30HMOV AH,02MOV DL,CLINT 21HMOV CL,0MOV AX,BXNEXT2: SUB AX, 1000; 减1000JC OVER2; 有借位说明不够减INC CL ; 否则够减,计数器加1JMP NEXT2; 无条件跳转OVER2: ADD AX,1000; 最后恢复不够减时AL的余数MOV BX,AXMOV RESULT_2,CLADD CL,30HMOV AH,02MOV DL,CLINT 21HMOV CL,0MOV AX,BXNEXT3: SUB AX, 100; 减100JC OVER3 ; 有借位说明不够减INC CL ; 否则够减,计数器加1JMP NEXT3 ; 无条件跳转OVER3: ADD AX,100; 最后恢复不够减时AL的余数MOV BX,AXMOV RESULT_3,CLADD CL,30HMOV AH,02MOV DL,CLINT 21HMOV CL,0MOV AX,BXMOV CL, 0; 计数器清零NEXT4: SUB AL, 10; 减10JC OVER4; 有借位说明不够减INC CL ; 否则够减,计数器加1JMP NEXT4; 无条件跳转OVER4: ADD AL,10; 最后恢复不够减时AL的余数MOV BL,ALMOV RESULT_4,CLADD CL,30HMOV AH,02MOV DL,CLINT 21HMOV CL,0MOV AX,BXMOV RESULT_5,ALADD AL,30HMOV AH,02MOV DL,ALINT 21HMOV AX,4C00H ; 返回DOS(两句)INT 21H ;CODE ENDSEND START ; 最后一行要按回车键B、除法源程序DATA SEGMENT ; 数据段RESULT_1 DB 1 ; 结果1为低八位,初始量为’1’RESULT_2 DB 1 ; 结果1为低八位RESULT_3 DB 1 ; 结果1为低八位RESULT_4 DB 1 ; 结果1为低八位RESULT_5 DB 1 ; 结果1为低八位DATA ENDS ; 结束数据段STACK SEGMENT STACK ; 堆栈段STA DB 64 DUP(0) ;堆栈段初始化STACK_TOP DB 0 ;栈顶初始化STACK ENDS ;结束堆栈段CODE SEGMENT ; 代码段ASSUME CS:CODE , DS:DATA , ES:DATA , SS:STACK START: ;假定为指令MOV AX, DATA ;把具体DATA送至寄存器中MOV DS, AX ; 设置数据段MOV AX, STACK ; 把STACK送至寄存器中MOV SS, AX ; 设置堆栈段LEA SP, STACK_TOP ; 设置栈顶指针MOV AX,32345 ;赋予立即数32345给AXMOV DX,0 ;余数清零MOV CX, 10000 ;赋予立即数10000给CXDIV CX ;除于CX中的立即数MOV RESULT_1, AL ; 除以10000, 得万位数MOV AX, DX ;将DX中的余数给AXMOV DX,0 ;余数清零MOV CX, 1000 ;赋予立即数1000给CXDIV CX ;除以1000MOV RESULT_2, AL ; 除以1000, 得千位数MOV AX, DX ;将DX中的余数给AXMOV DX,0 ;余数清零MOV CL, 100 ;赋予立即数100给CLDIV CL ;除以100 ;MOV RESULT_3, AL ;除以100, 得百位数MOV AL, AH ; 将AH中的余数给ALMOV AH, 0 ;余数清零MOV CL, 10 ; 赋予立即数10给CLDIV CL ;除以10MOV RESULT_4, AL ; 余数除以10, 得十位数MOV RESULT_5, AH ; 余数为个位数MOV CX,05H ;循环5次MOV AH,02H ;显示符LEA DI, RESULT_1 ;将结果1的偏移量给DI LP: MOV DL,BYTE PTR[DI] ;将[SI]中的字节内容给DL ADD DL,30H ;DL中的内容加30,显示数字INT 21H ;DOS INT 21 功能调用INC DI ;每显示一个字符,DI加1LOOP LP ;LP循环MOV AX,4C00H ; 返回DOS(两句)INT 21HCODE ENDS ;代码段结束END START ; 最后一行要按回车键六、实验结果6.1分别在DOS和Windows 下编译、连接源程序生成可执行文件并调试,比较两个环境下生成的机器码的长度、寄存器内容、计算结果的异同。

A 、减法1、Windows下的调试结果2、DOS 下的调试结果3、比较机器码的长度、寄存器内容、计算结果的异同Windows DOS寄存器内容CS F400 1419 IP 0204 0000 SS 0711 1414 SP 003A 0042 BP 0000 0000 SI 0000 0000 DI 0005 0000 DS 0710 1403 ES0700 1403 计算结果1742617426B 、除法1、Windows下的调试结果2、DOS下的调试结果3、比较机器码的长度、寄存器内容、计算结果的异同Windows DOS寄存器内容CS F400 1419 IP 0204 0000 SS 0711 1414 SP 003A 0042 BP 0000 0000 SI 0000 0000 DI 0005 0000 DS 0710 1403 ES070014036.2、如何观察转换过程中标志寄存器中各标志位的结果?如何观察转换结果的变化?试改变被转换数值,对结果与编制为的变化加以说明和解释。

A 、减法4412H 改成3012H1、DOS2、WindowsB 、除法4412H 改成3012H1、DOS2、Windows计算结果 17426 17426C、标志寄存器NV 无溢出UP 串操作指令为自动增量指令EI 允许中断请求PL 符号为正NZ 运算结果不为零NA 辅助进位无进位PO 1的个数为奇数NC 无进位七、实验总结与体会本次实验,是运用减法和除法来进行二进制转换成BCD码。

在实验前应做好充分的预习,画好流程图并编好程序,可以的话还是在实验前运行一下,若有问题可及时问老师。

而在编写程序中,应及时学会运用循环指令,注意算法,且要注意添加显示符,否则无法显示你的运算结果。

在本次试验中,因为没有很注重预习,导致实验时程序出现了差错。

课后进行了补充和修改,在DOS和EMU8086环境下能较为顺利的完成了实验内容。

八、思考题如何让你的程序自适应地处理高位为‘0’时不输出或输出空格呢?分配一个标志,在该标志不为零时,输出值是零就不输出或输出空格,标志为零时无论何值都要输出。

如果是从高位开始输出,那么只要先置标志,在输出一个非零数字或者当做到个位数的时候,把这个标志清零。

相关主题