二进制转换成BCD码 实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验目的
(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 将计数器的值保存到十分位 够减否 N
B、除法
五、源程序代码
A、减法源程序
DATA SEGMENT ; 数据段
RESULT_1 DB 0
RESULT_2 DB 0
RESULT_3 DB 0
RESULT_4 DB 0
RESULT_5 DB 0
DATA ENDS
STACK SEGMENT STACK ; 堆栈段
STA DB 64 DUP(0);开辟100单元作为堆栈空间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,25468
MOV CL, 0; 计数器清零
NEXT1: SUB AX, 10000; 减10000
JC OVER1; 有借位说明不够减
INC CL ; 否则够减,计数器加1
JMP NEXT1; 无条件跳转
OVER1: ADD AX,10000; 最后恢复不够减时AL的余数MOV BX,AX
MOV RESULT_1,CL
ADD CL,30H
MOV AH,02
MOV DL,CL
INT 21H
MOV CL,0
MOV AX,BX
NEXT2: SUB AX, 1000; 减1000
JC OVER2; 有借位说明不够减
INC CL ; 否则够减,计数器加1
JMP NEXT2; 无条件跳转
OVER2: ADD AX,1000; 最后恢复不够减时AL的余数MOV BX,AX
MOV RESULT_2,CL
ADD CL,30H
MOV AH,02
MOV DL,CL
INT 21H
MOV CL,0
MOV AX,BX
NEXT3: SUB AX, 100; 减100
JC OVER3 ; 有借位说明不够减
INC CL ; 否则够减,计数器加1
JMP NEXT3 ; 无条件跳转
OVER3: ADD AX,100; 最后恢复不够减时AL的余数
MOV BX,AX
MOV RESULT_3,CL
ADD CL,30H
MOV AH,02
MOV DL,CL
INT 21H
MOV CL,0
MOV AX,BX
MOV CL, 0; 计数器清零
NEXT4: SUB AL, 10; 减10
JC OVER4; 有借位说明不够减
INC CL ; 否则够减,计数器加1
JMP NEXT4; 无条件跳转
OVER4: ADD AL,10; 最后恢复不够减时AL的余数
MOV BL,AL
MOV RESULT_4,CL
ADD CL,30H
MOV AH,02
MOV DL,CL
INT 21H
MOV CL,0
MOV AX,BX
MOV RESULT_5,AL
ADD AL,30H
MOV AH,02
MOV DL,AL
INT 21H
MOV AX,4C00H ; 返回DOS(两句)
INT 21H ;
CODE ENDS
END 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 ;结束堆栈段