实验五 十六进制转BCD实验
一、实验要求
利用PROTEUS平台,建立8086 的十六进制转BCD例子。
二、实验目的
1、熟悉实验系统的编程和使用。
2、掌握简单的数值转换算法。
3、基本了解数值各种表达方法。
三、实验说明
计算机中的数值有各种表达方式,这是计算机的基础。掌握各种数制之间的转换是一种基本功。有兴趣的同学可以试试将BCD转换成十六进制码。
四、实验程序流程图
五、实验步骤
a.仿真代码
;将AX拆为5个BCD码,并存入RESULT开始的5个单元
;AX=0FFFFH=65535
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV DX,0000H
MOV AX, 65535 ;被转换的数字
MOV CX, 10000
DIv CX ; DIV用AX除以CX
MOV RESULT, AL ; 除以 10000, 得WAN位数,AL中存的是商
MOV AX,DX ; DX中存储的是余数
MOV DX,0000H
MOV CX, 1000
DIv CX
MOV RESULT+1, AL ; 除以 1000, 得QIAN位数
MOV AX,DX
MOV DX,0000H
MOV CX, 100
DIv CX
MOV RESULT+2, AL ; 除以 100, 得BAI位数
MOV AX,DX
MOV DX,0000H
MOV CX, 10
DIv CX
MOV RESULT+3, AL ; 除以 10, 得SHI位数
MOV RESULT+4, DL ; 得GE位数
JMP $
CODE ENDS
DATA SEGMENT
RESULT Db 5 DUP(?)
DATA ENDS
END START
b.调试、验证
首先AX=65535=FFFFH,CX=10000=2710H
执行完DIV CX后,AX中存储65535/10000的商6,DX存储余数159FH=5535.
然后商6H作为万位结果,存入内存。
将DX内的余数移入AX后,将DX重置为0,再将CX设置为1000=3E8H。
执行完DIV CX后,AX中存储5535/1000的商5,DX存储余数217H=535.
然后商5H作为千位结果,存入内存。
将DX内的余数移入AX后,将DX重置为0,再将CX设置为100=64H。
执行完DIV CX后,AX中存储535/100的商5,DX存储余数23H=35.
然后商5H作为百位结果,存入内存。
将DX内的余数移入AX后,将DX重置为0,再将CX设置为10=AH。
执行完DIV CX后,AX中存储35/10的商3,DX存储余数5H=5.
然后商5H作为十位结果,存入内存。
余数可以直接作为个位结果存入内存。
六. 实验结果和体会
实验结果如上,可以发现内存中存储了十进制表示的65535.成功实现了十六进制到BCD码的转换。
然而该程序仍存在不小缺陷,其对各位的处理是定死在程序中的,对于大于一个字节的十六进制就无能为力了。如果转成循环结构,既能应对更长的数据处理,又能节省程序内存。
七. 扩展题目程序和实验结果
;将12345转成16进制,并存入RESULT
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV DX,0000H
MOV AX, 12345
MOV CX, 1000H
DIv CX
MOV RESULT, AL ; 除以 1000H, 得QIAN位数
MOV AX,DX
MOV DX,0000H
MOV CX, 100H
DIv CX
MOV RESULT+1, AL ; 除以 100H, 得BAI位数
MOV AX,DX
MOV DX,0000H
MOV CX, 10H
DIv CX
MOV RESULT+2, AL ; 除以 10H, 得SHI位数
MOV RESULT+3, DL ; 得GE位数
JMP $
CODE ENDS
DATA SEGMENT
RESULT Db 5 DUP(?)
DATA ENDS
END START
相比原程序,该程序只改动了AX初始化的数值为12345,并将各除数从十进制改为十六进制。并且由于在十六进制下只有四位数,故删去了一次除法。实际上不删的话也只是在最前方多了个0.
实验未开始时的内存
还没初始化时寄存器全为0
程序执行完后,内存多了3039H=12345
而此时的寄存器保存着最后一次除法的结果,39H/10H的商为3H,余数为9H,分别在AX与DX中。CX中存着除数10H。