实验报告 实验三无符号二进制数的乘法运算
佩普基诺-新闻的作文
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、4
DH、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 算法原理:
(d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0
)
2
d
7
2<
br>7
d
0
2
0
((((((d
7
2d
6
)2d
5
)2)d
1
)2d
0
举例:
十进制数
二进制数
1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0
1)二进制数左移1位, C=1
十进制ADDC DA
2)二进制数左移1位, C=0
十进制ADDC DA
3)二进制数左移1位, C=1
十进制ADDC DA
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 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0
1 0 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 0
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操
作;
*
ADDC配合DA指令可以实现 „„
流程图:
双字节无符号二进制数相乘 流程图1:
d
i1
)2d
i
操作 ;
第 2 页 共 8
页
设A,B,C,D都是8位二进制数,
计算AB*CD
R0=5CH(乘积存
放地址)
R3,R2为临时寄
存器
计算B*D
@R0=bdL
(R3)=bdH
RO地址加一
计算A*D;
(R3)=ad
L+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 页
多字节二进制数转换
3) 源程序
为压缩BCD数:
请BCD数单元
计数器置为二进
制数位数
二进制数左移
BCD数*2
+ 进位
位
否否十进制调整
字节数到
是
位数到
是
返
回
第 4 页 共 8 页
ORG 0000H
MOV R0,#5CH 乘积存放地址低位
MUL1:
MOV
MOV
MUL
MOV
MOV
MOV
MOV
MUL
ADD
MOV
MOV
ADDC
MOV
MOV
MOV
MUL
ADD
INC
MOV
MOV
ADDC
MOV
MOV
JNC
INC
LAST:
MOV
MOV
MUL
ADD
INC
MOV
MOV
ADDC
INC
MOV
MOV
MOV
MOV
LOOP:
A,5AH 求b*d
B,58H
AB
@R0,A 存放bdL,字节1
R3,B 暂存bdH
A,5BH
B,58H 求a*d
AB
A,R3
R3,A (R3)=adL+bdH,字节2
A,B
A,#0
R2,A (R2)=adH+求字节2时可能的进位 ,字节3
A,5AH 求b*c
B,59H
AB
A,R3
R0 地址加一
@R0,A 字节2= adL+bdH+bcL
A,B
A,R2
R2,A
(R2)=adH+bcH+求字节2时可能的进位,字节3
R1,#0
LAST
;求刚才的字节3时有无向上的进位
R1 地址加一
A,5BH 求a*c
B,59H
AB
A,R2
R0 地址加一
@R0,A 存放 acL+ adH+bcH,字节3
A,B
A,R1 ach+进位
R0
@R0,A
;存放ach+进位,字节4
R5,#04H 二进制字节数计数器
R1,#10H 内部RAM单元
R0,#5CH 刚才的乘积低位地址
;此循环实现数据的搬移
第 5 页 共 8 页
MOV A,@R0
MOV
@R1,A
INC R0
INC R1
DJNZ R5,LOOP
BINBCD2:
MOV
R1,#4BH
MOV R2,#04H
;转换后存到地址(低位)
;二进制数字节数
INC
CLR
BB0:
MOV
INC
DJNZ
MOV
MOV
MUL
MOV
BB3:
MOV
MOV
CLR
BB1:
MOV
RLC
MOV
INC
DJNZ
MOV
INC
MOV
BB2:
MOV
ADDC
DA
MOV
INC
DJNZ
DJNZ
SJMP
R2
A
@R1,A
R1
R2,BB0
A,#04H
B,#8
AB
R3,A
R0,#10H
R2,#04H
C
A,@R0
A
@R0,A
R0
R2,BB1
R2,#04H
R2
R1,#4BH
A,@R1
A,@R1
A
@R1,A
R1
R2,BB2
R3,BB3
$$
;转换后的BCD字节数比二进制数字节数多一个
求“X”出现的总次数
二进制数左移1位,最高位在C中
;十进制字节数比二进制字节数多1
十进制数X 2 ,十进制调整
;二进制左移一位后的C
第 6 页 共 8 页
4)
实验步骤,完成情况
4.1
4.2
在WAVE
6000中新建文件,并将代码写入文件中,保存为;
在WAVE
6000中新建项目,并在模块文件中包含上述文件,
最后保存为。
编译程序,按照提示改正错误的地方,直到没有语法错误为止。
完成上一步后,检查是否有逻辑错误。
本实验中,乘数放在58H开始的4个字节单元,我们
假定
(58H)=45,(59H)=2E,(5AH)=57,(5BH)=2B,即是两乘数为:1
1845*11095。乘积放
在内部RAM的5FH、5EH、5DH和5CH单元中(高位在5FH
单元中),最开始
时均为0;如下所示:
4.3
4.4
在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 页
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、4
DH、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 算法原理:
(d
7
d
6
d
5
d
4
d
3
d
2
d
1
d
0
)
2
d
7
2<
br>7
d
0
2
0
((((((d
7
2d
6
)2d
5
)2)d
1
)2d
0
举例:
十进制数
二进制数
1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0
1)二进制数左移1位, C=1
十进制ADDC DA
2)二进制数左移1位, C=0
十进制ADDC DA
3)二进制数左移1位, C=1
十进制ADDC DA
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 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0
1 0 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 0
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操
作;
*
ADDC配合DA指令可以实现 „„
流程图:
双字节无符号二进制数相乘 流程图1:
d
i1
)2d
i
操作 ;
第 2 页 共 8
页
设A,B,C,D都是8位二进制数,
计算AB*CD
R0=5CH(乘积存
放地址)
R3,R2为临时寄
存器
计算B*D
@R0=bdL
(R3)=bdH
RO地址加一
计算A*D;
(R3)=ad
L+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 页
多字节二进制数转换
3) 源程序
为压缩BCD数:
请BCD数单元
计数器置为二进
制数位数
二进制数左移
BCD数*2
+ 进位
位
否否十进制调整
字节数到
是
位数到
是
返
回
第 4 页 共 8 页
ORG 0000H
MOV R0,#5CH 乘积存放地址低位
MUL1:
MOV
MOV
MUL
MOV
MOV
MOV
MOV
MUL
ADD
MOV
MOV
ADDC
MOV
MOV
MOV
MUL
ADD
INC
MOV
MOV
ADDC
MOV
MOV
JNC
INC
LAST:
MOV
MOV
MUL
ADD
INC
MOV
MOV
ADDC
INC
MOV
MOV
MOV
MOV
LOOP:
A,5AH 求b*d
B,58H
AB
@R0,A 存放bdL,字节1
R3,B 暂存bdH
A,5BH
B,58H 求a*d
AB
A,R3
R3,A (R3)=adL+bdH,字节2
A,B
A,#0
R2,A (R2)=adH+求字节2时可能的进位 ,字节3
A,5AH 求b*c
B,59H
AB
A,R3
R0 地址加一
@R0,A 字节2= adL+bdH+bcL
A,B
A,R2
R2,A
(R2)=adH+bcH+求字节2时可能的进位,字节3
R1,#0
LAST
;求刚才的字节3时有无向上的进位
R1 地址加一
A,5BH 求a*c
B,59H
AB
A,R2
R0 地址加一
@R0,A 存放 acL+ adH+bcH,字节3
A,B
A,R1 ach+进位
R0
@R0,A
;存放ach+进位,字节4
R5,#04H 二进制字节数计数器
R1,#10H 内部RAM单元
R0,#5CH 刚才的乘积低位地址
;此循环实现数据的搬移
第 5 页 共 8 页
MOV A,@R0
MOV
@R1,A
INC R0
INC R1
DJNZ R5,LOOP
BINBCD2:
MOV
R1,#4BH
MOV R2,#04H
;转换后存到地址(低位)
;二进制数字节数
INC
CLR
BB0:
MOV
INC
DJNZ
MOV
MOV
MUL
MOV
BB3:
MOV
MOV
CLR
BB1:
MOV
RLC
MOV
INC
DJNZ
MOV
INC
MOV
BB2:
MOV
ADDC
DA
MOV
INC
DJNZ
DJNZ
SJMP
R2
A
@R1,A
R1
R2,BB0
A,#04H
B,#8
AB
R3,A
R0,#10H
R2,#04H
C
A,@R0
A
@R0,A
R0
R2,BB1
R2,#04H
R2
R1,#4BH
A,@R1
A,@R1
A
@R1,A
R1
R2,BB2
R3,BB3
$$
;转换后的BCD字节数比二进制数字节数多一个
求“X”出现的总次数
二进制数左移1位,最高位在C中
;十进制字节数比二进制字节数多1
十进制数X 2 ,十进制调整
;二进制左移一位后的C
第 6 页 共 8 页
4)
实验步骤,完成情况
4.1
4.2
在WAVE
6000中新建文件,并将代码写入文件中,保存为;
在WAVE
6000中新建项目,并在模块文件中包含上述文件,
最后保存为。
编译程序,按照提示改正错误的地方,直到没有语法错误为止。
完成上一步后,检查是否有逻辑错误。
本实验中,乘数放在58H开始的4个字节单元,我们
假定
(58H)=45,(59H)=2E,(5AH)=57,(5BH)=2B,即是两乘数为:1
1845*11095。乘积放
在内部RAM的5FH、5EH、5DH和5CH单元中(高位在5FH
单元中),最开始
时均为0;如下所示:
4.3
4.4
在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 页