实验四 计算机数制的变换编程实验
一、实验目的:
1.掌握多字节二进制数与BCD码相互转换的编程原理。
2.掌握数据的拼装和拆卸方法和所使用的逻辑指令。
二、实验任务:
1.假设在43H~40H单元中有4个BCD码(高位在43H中),要转换成二进制数,转换结果存放在R3(高位)、R2(低位)中。
2.假设一个待转换的二进制数存放在R3、R2中,欲将其转换成BCD数,存放到一个数据区(44H~40H)中,(44H存高位、40H存低位)。
3.设在30H和31H单元中有一个8位数据:
(30H)=X7X6X5X4X3X2X1X0
(31H)=Y7Y6Y5Y4Y3Y2Y1Y0
现在要从30H单元中取出低5位,并从31H单元中取出低3位完成拼装,拼装结果存放在40H单元中:
(40H)=Y2Y1Y0 X4X3X2X1X0
试编写程序实现之。
4. 假设片内30H-35H存放了单字节二进制无符号数,试编写完成下列表达式的计算
(30H)*(31H)+(32H)*(33H)+(34H)*(35H)
结果存放在36H开始的片内存储单元中。
三、实验说明:
1、由于人们习惯于十进制数,所以不少外设的输入输出设备仍采用BCD码。BCD码是以二进制形式出现的十进制数。
二进制数 00010011B=19 (十进制数)
BCD数 00010011B=13 (十进制数)
显然BCD数是一种假二进制数,应用程序中经常会碰到BCD码与二进制数相互转换问题。转换的方法很多,下面介绍两种比较典型的BCD码转换成二进制数的方法:
假设在43H~40H单元中有4个BCD码,要转换成二进制数,转换结果存放在R3R2中(如下所示):
分析:3615=3*103+6*102+1*101+5
=((3*10+6)*10+1)*10+5
这是一个迭代算式,内核是高位乘十再加相邻的低位,MCS-51有乘法指令,所以直接用乘法等指令即可完成转换。
BCD数转换成二进制数程序流程图如下:
由于4位BCD数的最大值是9999,转换成二进制数为270FH,不会超过两个字节,所以转换时只需保存低两个字节即可。
2、相反,假设一个待转换的16位二进制数存放在R3R2中,欲将其转换成BCD数,存放到一个数据区(44H~40H)中,结果应为:
为什么结果要5个单元呢?因为16位二进制数最大为FFFFH,转换结果为65535,共5位,所以要用5个单元。实际转换时可以采用迭代乘法或连减法。
(1)采用迭代乘法的编程原理:因为16位二进制数可变换成:
a15a14a13…a2a1a0=((…(0*2+a15)*2+a14……)*2+a0
所以,将二进制数从最高位逐次左移入BCD码寄存器的最低位,并每次都实现(…)*2+ai的运算,共循环16次即可完成16位二进制数转换成BCD数的过程。
二进制数转换成BCD数程序流程图如下:
(2)若采用连减法,即从二进制数中连续减去十的幂次,连减法的原理是:
求得万位计数值后,再将余数减去103,方法类同,可得千位、百位、十位,最后的余数即为个位。另外:
104=2710H 103=03E8H
102=0064H 101=000AH
因此,可采用查表的办法实现对十的幂次的连减。程序流程图学生自己独立完成。
3、在PC机、仿真器和实验系统上编辑、汇编和调试程序。
四、实验程序参考:
BCD——二进制
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: MOV R0,#43H
MOV R7,#03H
MOV A,#00H
MOV R2,A
MOV R3,A
MOV A,@R0
MOV B,#0AH
MUL AB
MOV R2,A
MOV R3,B
LOOP: CLR C
DEC R0
ADD A,@R0
MOV R2,A
MOV A,R3
ADDC A,#00H
MOV R3,A
DEC R7
MOV A,R7
JZ OVER
MOV A,R2
MOV B,#0AH
MUL AB
MOV R2,A
MOV R4,B
MOV A,R3
MOV B,#0AH
MUL AB
CLR C
ADD A,R4
MOV R3,A
MOV A,R2
AJMP LOOP
OVER: AJMP OVER
END
数据拼装
ORG 0000H
MOV R0,#30H
MOV A,@R0
ANL A,#1FH
MOV R2,A
INC R0
MOV A,@R0
ANL A,#07H
SWAP A
RL A
ADD A,R2
MOV 40H,A
END