实验报告 实验三无符号二进制数的乘法运算.doc
EDA实验报告 之
实验三 无符号双字节数的乘法运算
1、实验目的:熟悉软件的操作,掌握算术操作类指令;
2、实验要求:
1)、进一步熟悉熟悉软件的操作;
2)、熟悉算术操作类指令;
3)、写出实验报告。
3、实验题目:无符号双字节数的乘法运算
1)、编写程序,把内部RAM地址为5BH、5AH 和59H、58H中的两个双字节无符号二进制数相乘(其中5BH与5AH中的内容构成一个乘数,高位在5BH中;59H与58H中的内容构成另一个乘数,高位在59H中),把乘积放在内部RAM的5FH、5EH、5DH和5CH单元中(高位在5FH单元中)。
2)、把乘积转换为压缩的BCD码,结果放在内部RAM的4FH、4EH、4DH、4CH和4BH单元中(高位在4FH单元中)。
4、 实验内容:
1) 使用的仪器、仪
,开发平台型号
本实验用到了wave6000软件。电脑一台。
2) 性能指标、技术要求、思路
、软件
性能指标、技术要求见实验题目部分;
思路方案:(下页)
思路方案:
双字节无符号二进制数相乘 算法原理:
设a、b、c、d都是8位二进制数,z是8位二进制数0,
则ab?cd=(az+zb)(cz+zd)=aczz+ zbcz + zadz +zzbd
acHzzz + acLzz
第 1 页 /共 8 页
bcHzz + bcLz
adHzz + adLz
bdHz + bdL
+)
字节4 字节3 字节2 字节1 可见用4次乘法指令和多次加法指令可求出乘积.
多字节二进制数转换为BCD数子程序BINBCD2 算法原理:
70(dddddddd),d,2,?,d,2,((((((d,2,d),2,d),2),?d),2,d7654321027076510举例: 十进制数 二进制数
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0
1)二进制数左移1位, C=1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 十进制ADDC \ DA
2)二进制数左移1位, C=0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 十进制ADDC \ DA
3)二进制数左移1位, C=1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 十进制ADDC \ DA
4)二进制数左移1位, C=1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 十进制ADDC \ DA
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 对应于原来二进制的高4位
注意: * 例中乘2^7 ,但移位8次, 其中十进制单元第一次自身相加时扣除了一次乘2操作;
d),2,di,1i * ADDC配合DA指令可以实现 „„ 操作 ;
流程图:
双字节无符号二进制数相乘 流程图1:
第 2 页 /共 8 页
设A,B,C,D都是8位二进制数,
计算AB*CD
R0=5CH(乘积存放地址)R3,R2为临时寄存器
计算B*D@R0=bdL(R3)=bdHRO地址加一
计算A*D;(R3)=adL+bdH(R2)=adH+进位
计算B*C;(R3)=adL+bdH+bcL@R0=(R3);R0地址加一;(R2)=adH+bcH+进位
R1=0
判断第三次加法是否产生进位
是
R1加一否
计算A*C;R0地址加一@R0=acl+adH+bcH
R0加一;@R0=acH+R1(进位)
程序结束
多字节二进制数转换为BCD数子程序BINBCD2 流程图2:
第 3 页 /共 8 页
多字节二进制数转换
为压缩BCD数:
请BCD数单元
计数器置为二进
制数位数
二进制数左移
BCD数*2 + 进位
位否否十进制调整
字节数到
是
位数到
是
返回
3) 源程序
第 4 页 /共 8 页
ORG 0000H
MOV R0,#5CH ;乘积存放地址低位
MUL1:
MOV A,5AH ;求b*d
MOV B,58H
MUL AB
MOV @R0,A ;存放bdL,字节1
MOV R3,B ;暂存bdH
MOV A,5BH
MOV B,58H ;求a*d
MUL AB
ADD A,R3
MOV R3,A ;(R3)=adL+bdH,字节2
MOV A,B
ADDC A,#0
MOV R2,A ;(R2)=adH+求字节2时可能的进位 ,字节3
MOV A,5AH ;求b*c
MOV B,59H
MUL AB
ADD A,R3
INC R0 ;地址加一
MOV @R0,A ;字节2= adL+bdH+bcL
MOV A,B
ADDC A,R2
MOV R2,A ; (R2)=adH+bcH+求字节2时可能的进位,字节3
MOV R1,#0
JNC LAST ;求刚才的字节3时有无向上的进位
INC R1 ;地址加一
LAST:
MOV A,5BH ;求a*c
MOV B,59H
MUL AB
ADD A,R2
INC R0 ;地址加一
MOV @R0,A ;存放 acL+ adH+bcH,字节3
MOV A,B
ADDC A,R1 ;ach+进位
INC R0
MOV @R0,A ;存放ach+进位,字节4
MOV R5,#04H ;二进制字节数计数器
MOV R1,#10H ;内部RAM单元
MOV R0,#5CH ;刚才的乘积低位地址
LOOP: ;此循环实现数据的搬移
第 5 页 /共 8 页
MOV A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R5,LOOP
BINBCD2:
MOV R1,#4BH ;转换后存到地址(低位)
MOV R2,#04H ;二进制数字节数
INC R2 ;转换后的BCD字节数比二进制数字节数多一个
CLR A
BB0:
MOV @R1,A
INC R1
DJNZ R2,BB0
MOV A,#04H ;求“X”出现的总次数
MOV B,#8
MUL AB
MOV R3,A
BB3:
MOV R0,#10H
MOV R2,#04H
CLR C
BB1:
MOV A,@R0 ;二进制数左移1位,最高位在C中
RLC A
MOV @R0,A
INC R0
DJNZ R2,BB1
MOV R2,#04H
INC R2 ;十进制字节数比二进制字节数多1
MOV R1,#4BH
BB2:
MOV A,@R1 ;十进制数X 2 ,十进制调整
ADDC A,@R1 ;二进制左移一位后的C
DA A
MOV @R1,A
INC R1
DJNZ R2,BB2
DJNZ R3,BB3
SJMP $
第 6 页 /共 8 页
4) 实验步骤,完成情况
4.1 在WAVE 6000中新建文件,并将代码写入文件中,保存为EXPERIMENT3.ASM; 4.2 在WAVE 6000中新建项目,并在模块文件中包含上述EXPERIMENT3.ASM文件,
最后保存为EXPERIMENT3.PRG。
4.3 编译程序,按照提示改正错误的地方,直到没有语法错误为止。 4.4 完成上一步后,检查是否有逻辑错误。
本实验中,乘数放在58H开始的4个字节单元,我们假定
(58H)=45,(59H)=2E,(5AH)=57,(5BH)=2B,即是两乘数为:11845*11095。乘积放
在内部RAM的5FH、5EH、5DH和5CH单元中(高位在5FH单元中),最开始
时均为0;如下所示:
在loop上一条指令设置断点,全速运行,检验乘法子程序结果是否正确:
2E57H*452EH = 07D55073H,结果正确。
第 7 页 /共 8 页
现在把乘积转换为压缩的BCD码,结果放在内部RAM的4FH、4EH、4DH、4CH
和4BH单元中(高位在4FH单元中),这些单元的初始值均为0。由上图可以看出。
取消断点,全速运行,检验转换为压缩的BCD码子程序是否正确。
07D55073H = 131420275(十进制),结果正确。
换用其他的数,再次验证,结果均正确。实验完毕。
5、本实验遇到的问题及解决方案
总的来说,做这个实验没有遇到太麻烦的问题。不过在老师没有讲《实验程序及设计方法》之前,对乘法的流程虽说有了一定的想法,但不是很全面,而对BCD转换脑袋是一片空白,不知道如何下手。上完课后,感觉豁然开朗。参考
上的方法,也很快设计出了程序,并得到了结果。
怎么说呢,感觉这个程序很有代表性吧,以后遇到相似的问题,也会触类旁通。
6、对本实验的改进
和疑难问题:
改进之处:
可以将字节数再增大一些,做三字节无符号二进制数相乘,或四字节„„
把条件设得更苛刻一点,做0FFH*0FFH,不过好像也没什么意义,O(?_?)O
2009-4-16
第 8 页 /共 8 页