欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

实验五 十六进制转BCD实验

程序员文章站 2022-03-15 14:23:19
...

一、实验要求

​ 利用PROTEUS平台,建立8086 的十六进制转BCD例子。

二、实验目的

1、熟悉实验系统的编程和使用。

2、掌握简单的数值转换算法。

3、基本了解数值各种表达方法。

三、实验说明

计算机中的数值有各种表达方式,这是计算机的基础。掌握各种数制之间的转换是一种基本功。有兴趣的同学可以试试将BCD转换成十六进制码。

四、实验程序流程图

实验五 十六进制转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

实验五 十六进制转BCD实验

执行完DIV CX后,AX中存储65535/10000的商6,DX存储余数159FH=5535.

实验五 十六进制转BCD实验

然后商6H作为万位结果,存入内存。
实验五 十六进制转BCD实验
将DX内的余数移入AX后,将DX重置为0,再将CX设置为1000=3E8H。
实验五 十六进制转BCD实验
执行完DIV CX后,AX中存储5535/1000的商5,DX存储余数217H=535.

实验五 十六进制转BCD实验

然后商5H作为千位结果,存入内存。
实验五 十六进制转BCD实验
将DX内的余数移入AX后,将DX重置为0,再将CX设置为100=64H。

实验五 十六进制转BCD实验

执行完DIV CX后,AX中存储535/100的商5,DX存储余数23H=35.

实验五 十六进制转BCD实验

然后商5H作为百位结果,存入内存。
实验五 十六进制转BCD实验
将DX内的余数移入AX后,将DX重置为0,再将CX设置为10=AH。

实验五 十六进制转BCD实验

执行完DIV CX后,AX中存储35/10的商3,DX存储余数5H=5.

实验五 十六进制转BCD实验

然后商5H作为十位结果,存入内存。

实验五 十六进制转BCD实验

余数可以直接作为个位结果存入内存。

实验五 十六进制转BCD实验

六. 实验结果和体会

实验结果如上,可以发现内存中存储了十进制表示的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.

实验未开始时的内存

实验五 十六进制转BCD实验

还没初始化时寄存器全为0

实验五 十六进制转BCD实验

程序执行完后,内存多了3039H=12345
实验五 十六进制转BCD实验
而此时的寄存器保存着最后一次除法的结果,39H/10H的商为3H,余数为9H,分别在AX与DX中。CX中存着除数10H。