二进制数到BCD码的转换

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

得分教师签名批改日期课程编号1801770001
深圳大学实验报告课程名称:微机原理及应用
实验名称:二进制数到BCD码的转换
学院:物理科学与技术学院
指导教师:
报告人:组号:
学号实验地点K302
实验时间:2014 年10 月22 日
提交时间:2014.11.12
一、实验要求:
将AX中的一个二进制数(对应的十进制数范围是0-65535),转换成压缩性BCD码表示的十进制,并从屏幕输出转换结果。

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

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

三、实验说明:
计算机中的数值有各种表达方式,这是计算机的基础。

掌握各种数制、码制之间的转换是一种基本功;利用DOS功能调用实现在屏幕上显示字符或数字的方法是本课程的基本要求之一。

四、除法方法:
1、算法说明:三位数先除以100,得到的商就是百分位的结果;将之前一次的余数除以10,得到的商就是十分位的结果;剩下来的余数就是个位的结果。

2、程序流程图:
图1 除法程序流程图
3、程序:
DATA SEGMENT ; 数据段
RESULT_1 DB 1
RESULT_2 DB 1
RESULT_3 DB 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
MOV DS, AX ; 设置数据段
MOV AX, STACK
MOV SS, AX ; 设置堆栈段
LEA SP, STACK_TOP ; 设置栈顶指针
;---------------------------------------
; 程序的中间部分
MOV AX, 467
MOV CL, 100
DIV CL
MOV RESULT_1, AL ; 除以 100, 得百位数
MOV AL, AH
MOV AH, 0
MOV CL, 10
DIV CL
MOV RESULT_2, AL ; 余数除以 10, 得十位数
MOV RESULT_3, AH ; 余数为个位数
;------------------------------------------ ; 程序结束必须要有的两条指令
MOV AX, 4C00H ;
INT 21H ;
;------------------------------------------ CODE ENDS
END START ; 最后一行要按回车键
五、减法方法
1、算法说明:三位数先循环减100,直到不够减了,做减法的次数就是百分位的结果;将不够减之前一次的余数恢复,再循环减去10,直到不够减了,做减法的次数就是十分位的结果;最后恢复的正余数就是个位的结果。

2、程序流程图
开始
把二进制数送到AX
计数器CL,标志位清零
AX减去100,差放到AX
N
是否借位CL加1给CL
Y
AL加100,恢复不够减时余数
从CL存储百位数
计数器CL,标志位清零
AX减去10,差放到AX
N
是否借位CL加1给CL
Y
AL加10,恢复不够减时余数
从CL存储十位数
从AL存储个位数
结束
3、程序:
DATA SEGMENT ; 数据段
RESULT_1 DB 1
RESULT_2 DB 1
RESULT_3 DB 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
MOV DS, AX ; 设置数据段
MOV AX, STACK
MOV SS, AX ; 设置堆栈段
LEA SP, STACK_TOP ; 设置栈顶指针
;---------------------------------------
; 程序的中间部分
MOV AX,467
MOV CL, 0; 计数器清零
CLC ;
NEXT1: SUB AX, 100; 减100
JC OVER1; 有借位说明不够减
INC CL ; 否则够减,计数器加1
JMP NEXT1; 无条件跳转
OVER1: ADD AL,100; 最后恢复不够减时AL的余数
MOV RESULT_1,CL
MOV CL, 0; 计数器清零
CLC ;
NEXT2: SUB AL, 10; 减10
JC OVER2; 有借位说明不够减
INC CL ; 否则够减,计数器加1
JMP NEXT2; 无条件跳转
OVER2: ADD AL,10; 最后恢复不够减时AL的余数
MOV RESULT_2,CL
MOV RESULT_3,AL
;------------------------------------------ ; 程序结束必须要有的两条指令
MOV AX, 4C00H ;
INT 21H ;
;------------------------------------------ CODE ENDS
END START ; 最后一行要按回车键
六.实验及报告要求:
1、简要说明算法,并画出正确的程序流程图;
算法说明:三位数先循环减100,直到不够减了,做减法的次数就是百分位的结果;将
不够减之前一次的余数恢复,再循环减去10,直到不够减了,做减法的次数就是十分位的
结果;最后恢复的正余数就是个位的结果。

程序流程图如图2
2、给出完整正确的源程序代码,要求给每一句伪指令或指令加上注释;
源程序代码、伪指令或指令注释如4.3和5.3所示。

3、分别在DOS和Windows下编译、连接源程序生成可执行文件并调试,比较两个环境下
生成的机器码的长度、寄存器内容、计算结果的异同。

3.1、除法:
3.1.1、DOS环境下:
机器码:
寄存器:
结果:
3.1.2、WINDOWS环境下:
机器码:
寄存器:结果:
3.2、减法:
3.2.1、DOS环境下
机器码:
寄存器:
结果:
3.2.2、WINDOS环境下
机器码:
寄存器:结果:
从以上结果可以看出:分别在DOS和Windows下编译、连接源程序生成可执行文件并调试,生成的机器码的长度、寄存器内容、计算结果是相同的。

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

可以通过单步执行(single step),观察标志位的变化
5、写出完整的实验报告,特别是“实验结果”与“实验总结体会”部分,是评分的主要依据。

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

七、总结与体会:
在这次实验中,对使用除法和减法两种方式实现二进制到BCD码的转换的比较,可以看出分别在DOS环境和WINDOWS环境下两种方法的机器码长度、寄存器内容和计算结果是相同的;通过本次实验,可以看出:用寄存器AX除以一个数之后,商放在AL,余数放在AH中,用寄存器AX减去一个数之后,差值放在AX中。

通过对比源代码和机器码及多次尝试,使用WIN7操作系统时,不管是DOS下还是WINDOWS下的emu8086,数中不含a、b、c、d、e、f,可以不用加数制符号,默认为十进制数。

当数中含有a、b、c、d、e、f时,必须在数后面加上十六进制的符号h/H,为十六进制数,否则编译不能通过,即有错误。

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

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

相关文档
最新文档